From 6b4fbabb157d87991980139d3466304bef5c3110 Mon Sep 17 00:00:00 2001 From: aaron <462826@qq.com> Date: Thu, 16 Jul 2020 14:28:33 +0800 Subject: [PATCH] new features for 1.1 --- data/system/address/v1.xlsx | Bin 24624 -> 32474 bytes res/doc/sample.yaml | 130 +++++++++++++++++++++++++++++++++--- res/doc/sample_en.yaml | 124 ++++++++++++++++++++++++++++++++++ res/messages_en.json | 4 ++ res/messages_zh.json | 4 ++ src/service/md5.go | 64 ++++++++++++++++++ src/utils/log/print.go | 13 +++- src/zd.go | 8 +++ 8 files changed, 335 insertions(+), 12 deletions(-) create mode 100644 res/doc/sample_en.yaml create mode 100644 src/service/md5.go diff --git a/data/system/address/v1.xlsx b/data/system/address/v1.xlsx index ade97c80ce9d748ce8ce17f6792f297f2abf1404..083d2fc1c585f2dcd26529538db878a01d39473e 100644 GIT binary patch literal 32474 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 literal 24624 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

DUg>H4=yu7szM5TmGIFK^&@N_TNbt2RZ;M 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 diff --git a/res/doc/sample.yaml b/res/doc/sample.yaml index 0d66421..04ba362 100644 --- a/res/doc/sample.yaml +++ b/res/doc/sample.yaml @@ -1,14 +1,124 @@ -title: test -desc: This is a test file. +title: zendata数据配置语法说明 +desc: + + # 文件组成 + + # zendata以yaml格式的文件来定义各个字段的格式。 + # yaml文件整体由文件说明和字段定义两部分组成。 + + # 文件说明 + + # title: 标题,可以用简短的文字概要描述该文件定义的数据类型。 + # desc: 描述,可以用多行文本来详细描述该文件定义的数据类型,非必选项。 + # author: 作者,非必选项。 + # version:版本号,非必选项。 + + # 字段列表 + + # 字段定义部分都放在fields这个定义里面。 + # 一个yaml文件可以包含一个或者多个字段。 + # 字段列表以-field定义开始。 + # 一个字段可以通过fields属性定义它的子字段。 + + # 字段定义 + + # field: 字段名,仅支持英文、数字、下换线和. + # range: 列表范围,最重要的定义。 + # loop: 循环次数,可以定义某一字段循环多少次。 + # loopfix: 每一次循环时的连接符。 + + # format: 支持格式化输出。 + + # prefix: 该字段的前缀。 + # postfix: 该字段的后缀。 + + # length: 该字段的长度。如果不通过分隔符区分,则需要指定字段长度,单位是字节。 + # leftpad: 左填充的字符。如果长度不够,可指定左填充的字符。默认是以空格左填充。 + # rightpad: 右填充的字符。如果长度不够,可指定右填充的字符。 + + # config: 可以引用另外一个文件里面的定义。 + + # from: 引用某一个定义文件。 + # use: 使用被引用文件中定义的若干实例。all代表使用所有。 + # select: 如果引用的文件是excel表,可以查询里面的某一个字段。 + # where: 如果引用的文件是excel表,可以使用查询条件。 + + # range定义 + + # 使用逗号连接不同的元素。比如 range: 1,2,3 + # 元素也可以是一个区间。比如 range:1-10, A-Z + # 区间可以通过冒号:来指定步长。比如 range:1-10:2。 + # 步长可以是小数。比如 range: 1-10:0.1 + # 区间可以通过R来指定随机。比如 range: 1-10:R,随机和步长只能二选一。 + # 可以通过一个文件来指定列表。比如range: list.txt。文件名是相对路径时,以配置文件为基准计算。 + # 可以通过{n}的方式来重复某一个元素。比如 range: user1{100},user2{100} + # 如果区间或者几个元素需要重复,需要用[]括起来。比如 range: [user1,user2,user3]{100} + author: zentao version: 1.0 fields: - - field: field1 - note: 字符区间步长、随机 - range: a-f:R,0-9:2 - format: "%3d" - loop: 3 - loopfix: "," - prefix: "[" - postfix: "] " \ No newline at end of file + + - field: field_common # 默认的列表类型,通过逗号隔成若干区段。 + range: 1-10, 20-25, 27, 29, 30 # 1,2,3...,10,20,21,22...,25,27,29.30 + prefix: int_ # 前缀 + postfix: \t # 后缀 + + - field: field_step # 区间可以指定步长。 + range: 1-10:2, 1-2:0.1 # 1,3,5,7,9,1, 1.1,1.2...,2 + + - field: field_random # 通过R属性指定随机。R属性和步长不能同时出现。 + range: 1-10:R # 1,5,8... + + - field: field_file # 从一个文件中读取列表,并指定随机。 + range: _users.txt:R # 该文件中一行作为一个元素,并随机。 + + - field: field_loop # 自循环的字段。 + range: a-z # a_b_c | d_e_f | g_h_i + loop: 3 # 循环三次 + loopfix: _ # 每次循环的连接符。 + postfix: "|" # 特殊字符加引号,否则无法解析。 + + - field: field_repeat # 通过{}定义重复的元素。 + range: user-1{3},[user2,user3]{2} # user-1,user-1,user-1,user2,user3,user2,user3 + + - field: field_format # 通过格式化字符串输出。 + range: 1-10 # passwd 1,passwd 2,passwd 3 ... passwd10。 + format: "passwd%02d" # 用%2d补零,使密码整体保持8位,%2d默认补空格。 + + - field: field_use_another_file # 可以引用其他的定义文件。 + config: _numb_field.yaml # 引用当前目录下面的_numb_field.yaml文件里面的定义。 + + - field: field_use_ranges_file # 引用其他的定义文件,该文件定义了多个range,他们共享了一些field层面的属性。 + from: _numb_ranges.yaml # 引用当前目录下面的_numb_field.yaml文件里面的定义。 + use: medium # 使用该文件中定义的medium分组。 + + - field: field_use_instance # 引用其他的定义文件,该文件定义了多个实例。 + from: system.ip.v1.yaml # 引用data/system/ip/v1.yaml + use: privateC,privateC # 使用该文件中定义的privateC和privateB两个实例。 + + - field: field_use_excel # 从excel数据源里面取数据。 + from: system.address.v1.china # 从data/system/address/v1.xlsx文件中读取名为china的工作簿。 + select: city # 查询city字段。 + where: state like '%山东%' # 条件是 省份包含山东。 + + - field: field_with_children # 嵌套字段 + fields: + - field: child1 + range: a-z + prefix: part1_ + postfix: '|' + + - field: child2 + range: A-Z + prefix: part2_ + postfix: '|' + + - field: child_with_child + prefix: part3_ + postfix: + fields: + - field: field_grandson + prefix: int_ + range: 10-20 + postfix: diff --git a/res/doc/sample_en.yaml b/res/doc/sample_en.yaml new file mode 100644 index 0000000..68f0d69 --- /dev/null +++ b/res/doc/sample_en.yaml @@ -0,0 +1,124 @@ +title: zendata config syntax +desc: + + # File composition + + # zendata defines the format for each field in YAML file. + # YAML file is composed of file description and field definition. + + # File description + + # title: A short text to summarize the data type defined by this file. + # desc: Detailed text to describe the data type defined in this file, optional. + # author: Optional. + # version: Version number, optional. + + # Field list + + # Field is defined in fields. + # A YAML file contains one or more fields. + # Field list starts from -field. + # A child field can be defined by fields. + + # Field definition + + # field: Field name; letters, digits, underlines and dots only. + # range: List range; the most important definition. + # loop: The number of loops; define how many times a field can loop. + # loopfix: The connector for each loop. + + # format: Support formatted output. + + # prefix: Prefix of this field. + # postfix: Postfix of this field. + + # length: The length of this field. If separators are not used, specify the field length in bytes. + # leftpad: Left-padded characters. If the length is not enough, specify a character. The default is space. + # rightpad: Right-padded characters. If the length is not enough, specify a character. + + # config: Refer to the definition in other file. + + # from: Refer to a definition file. + # use: Use instances defined in the referred file. + # select: If refer to an excel table, you can query a field in it. + # where: If refer to an excel table, you can use query conditions. + + # range definition + + # Use commas to connect elements. e.g. range: 1,2,3. + # Elements can be a range, e.g. range:1-10, A-Z. + # Use colons to define steps, e.g. range:1-10:2. + # Steps can be decimals, e.g. range: 1-10:0.1. + # Intervals can be set as random by R, e.g. range: 1-10:R. Set either random or a specified step. + # Use a file to specify a list, e.g. range: list.txt. If the file name is a relative path, it is based on the config file. + # Use {n} to repeat a element, e.g. range: user1{100},user2{100}. + # Use [], if intervals and elements are repeated, e.g. range: [user1,user2,user3]{100}. + +author: zentao +version: 1.0 + +fields: + + - field: field_common # The list type by default. Separated by commas. + range: 1-10, 20-25, 27, 29, 30 # 1,2,3...,10,20,21,22...,25,27,29.30 + prefix: int_ # Prefix + postfix: \t # Postfix + + - field: field_step # Interval steps can be specified. + range: 1-10:2, 1-2:0.1 # 1,3,5,7,9,1, 1.1,1.2...,2 + + - field: field_random # Use R to specify randomly. Set either R or a specified step. + range: 1-10:R # 1,5,8... + + - field: field_file # Read a list from a file and set it as random. + range: _users.txt:R # Using the lines of users.txt as range and set it as random. + + - field: field_loop # Self-loop field. + range: a-z # a_b_c | d_e_f | g_h_i + loop: 3 # Loop three times. + loopfix: _ # The connector for each loop. + postfix: | + + - field: field_repeat # Use {} to define repeated elements. + range: user-1{3},[user2,user3]{2} # user-1,user-1,user-1,user2,user3,user2,user3 + + - field: field_format # Output as formatted strings. + range: 1-10 # passwd 1,passwd 2,passwd 3 ... passwd10。 + format: "passwd%02d" + + - field: field_use_another_file # Other definition file can be referred. + config: _numb_field.yaml # Refer to the definition in nubmer.yaml of the current directory. + + - field: field_use_ranges_file # Other definition file can be referred, in which more than one ranges are defined. + from: _numb_ranges.yaml # Refer to the definition in _numb_ranges.yaml of the current directory. + use: medium # use medium range. + + - field: field_use_instance # Refer to other definition file which defines multiple instances. + from: system.ip.v1.yaml # Refer to data/system/ip/v1.yaml. + use: privateB,privateC # Use the two instances of privateC and privateB defined in this file. + + - field: field_use_excel # Read the data from the data source of excel. + from: system.address.v1.china # Read the book named china in data/system/address/v1.xlsx. + select: city # Query the field city. + where: cityCode = 852 # Query condition. + + - field: field_with_children # Embeded field. + fields: + - field: child1 + range: a-z + prefix: part1_ + postfix: '|' + + - field: child2 + range: A-Z + prefix: part2_ + postfix: '|' + + - field: child_with_child + prefix: part3_ + postfix: + fields: + - field: field_grandson + prefix: int_ + range: 10-20 + postfix: diff --git a/res/messages_en.json b/res/messages_en.json index 7ff9e40..af78231 100644 --- a/res/messages_en.json +++ b/res/messages_en.json @@ -39,6 +39,10 @@ "id": "fail_to_read_file", "translation": "Fail to read file %s." }, + { + "id": "fail_to_write_file", + "translation": "Fail to write file %s." + }, { "id": "fail_to_parse_file", "translation": "Fail to parse the content of file %s." diff --git a/res/messages_zh.json b/res/messages_zh.json index e40d0d5..075cde0 100644 --- a/res/messages_zh.json +++ b/res/messages_zh.json @@ -34,6 +34,10 @@ "id": "fail_to_read_file", "translation": "读取文件%s失败。" }, + { + "id": "fail_to_write_file", + "translation": "写文件%s失败。" + }, { "id": "fail_to_parse_file", "translation": "解析文件%s失败。" diff --git a/src/service/md5.go b/src/service/md5.go new file mode 100644 index 0000000..4495654 --- /dev/null +++ b/src/service/md5.go @@ -0,0 +1,64 @@ +package service + +import ( + "crypto/md5" + "encoding/hex" + "github.com/360EntSecGroup-Skylar/excelize/v2" + i118Utils "github.com/easysoft/zendata/src/utils/i118" + logUtils "github.com/easysoft/zendata/src/utils/log" + "strconv" + "strings" +) + +const ( + md5Col = "CW" +) + +func AddMd5(path string, salt string) { + excel, err := excelize.OpenFile(path) + if err != nil { + logUtils.Screen(i118Utils.I118Prt.Sprintf("fail_to_read_file", path)) + return + } + + for _, sheet := range excel.GetSheetList() { + rows, _ := excel.GetRows(sheet) + + colCount := 0 + for index, row := range rows { + if index == 0 { // deal with the title + for _, col := range rows[index] { + val := strings.TrimSpace(col) + if val == "" { break } + colCount++ + } + continue + } + + if row[0] == "" { // stop when finding a blank in first column + break + } + + str := "" + for idx, col := range row { + if idx >= colCount { break } + + val := strings.TrimSpace(col) + str = str + val + } + md5Str := md5V(str, salt) + excel.SetCellValue(sheet, md5Col + strconv.Itoa(index + 1), md5Str) + } + } + + if err := excel.SaveAs(path); err != nil { + logUtils.Screen(i118Utils.I118Prt.Sprintf("fail_to_write_file", path)) + } +} + +func md5V(str, salt string) string { + h := md5.New() + h.Write([]byte(str)) + h.Write([]byte(salt)) + return hex.EncodeToString(h.Sum(nil)) +} \ No newline at end of file diff --git a/src/utils/log/print.go b/src/utils/log/print.go index 3915ee0..a322b13 100644 --- a/src/utils/log/print.go +++ b/src/utils/log/print.go @@ -5,6 +5,7 @@ import ( "fmt" commonUtils "github.com/easysoft/zendata/src/utils/common" fileUtils "github.com/easysoft/zendata/src/utils/file" + "github.com/easysoft/zendata/src/utils/vari" "github.com/fatih/color" "os" "regexp" @@ -17,19 +18,27 @@ var ( ) func PrintExample() { + if vari.Config.Language == "en" { + exampleFile = strings.Replace(exampleFile, ".yaml", "_en.yaml", -1) + usageFile = strings.Replace(usageFile, ".txt", "_en.txt", -1) + } + content := fileUtils.ReadResData(exampleFile) fmt.Printf("%s\n", content) } func PrintUsage() { - //PrintToWithColor(i118Utils.I118Prt.Sprintf("usage"), color.FgCyan) + if vari.Config.Language == "en" { + exampleFile = strings.Replace(exampleFile, ".yaml", "_en.yaml", -1) + usageFile = strings.Replace(usageFile, ".txt", "_en.txt", -1) + } usage := fileUtils.ReadResData(usageFile) exeFile := "zd" if commonUtils.IsWin() { exeFile += ".exe" } - usage = fmt.Sprintf(usage, exeFile) + if !commonUtils.IsWin() { regx, _ := regexp.Compile(`\\`) usage = regx.ReplaceAllString(usage, "/") diff --git a/src/zd.go b/src/zd.go index 24df720..9a3a4d1 100644 --- a/src/zd.go +++ b/src/zd.go @@ -38,6 +38,8 @@ var ( listRes bool viewRes string viewDetail string + md5 string + salt string example bool help bool @@ -83,6 +85,9 @@ func main() { flagSet.StringVar(&viewRes, "v", "", "") flagSet.StringVar(&viewRes, "view", "", "") + flagSet.StringVar(&md5, "md5", "", "") + flagSet.StringVar(&salt, "salt", "", "") + flagSet.StringVar(&vari.HeadSep, "H", "", "") flagSet.StringVar(&vari.HeadSep, "human", "", "") @@ -126,6 +131,9 @@ func main() { } else if viewRes != "" { service.ViewRes(viewRes) return + } else if md5 != "" { + service.AddMd5(md5, salt) + return } if vari.Ip != "" || vari.Port != 0 { -- GitLab