From 7bb802cc268c98ca9722560f424bef6d418999af Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 1 Aug 2024 15:52:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20udmk4=E5=92=8C=E7=BD=91=E5=85=83?= =?UTF-8?q?=E9=85=8D=E7=BD=AEyaml=E6=B5=8B=E8=AF=95=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{udm_k4_test.go => udm_auth_k4_test.go} | 6 +- src/modules/network_element/ne_config_test.go | 230 ++++++++++++++++++ 2 files changed, 233 insertions(+), 3 deletions(-) rename src/modules/network_data/{udm_k4_test.go => udm_auth_k4_test.go} (96%) create mode 100644 src/modules/network_element/ne_config_test.go diff --git a/src/modules/network_data/udm_k4_test.go b/src/modules/network_data/udm_auth_k4_test.go similarity index 96% rename from src/modules/network_data/udm_k4_test.go rename to src/modules/network_data/udm_auth_k4_test.go index 99580c4f..434cd2c1 100644 --- a/src/modules/network_data/udm_k4_test.go +++ b/src/modules/network_data/udm_auth_k4_test.go @@ -6,7 +6,7 @@ import ( "testing" ) -// 加密 +// UDM K4加密 func encrypt(origData, key []byte) ([]byte, error) { if len(origData) < 1 || len(key) < 1 { return nil, errors.New("wrong data or key") @@ -36,11 +36,11 @@ func TestEncrypt(t *testing.T) { // ki := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef} // 0123456789abcdef0123456789abcdef - // 密码 + // k4 password key := []byte{0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34} // 1234123412341234 - // 要加密的ki + // k4 crypt ki ki := []byte{0x80, 0x5D, 0xAD, 0xC6, 0xE8, 0xA5, 0x4A, 0x0D, 0x59, 0xD6, 0x22, 0xC7, 0xA0, 0x4D, 0x08, 0xE0} // 805DADC6E8A54A0D59D622C7A04D08E0 diff --git a/src/modules/network_element/ne_config_test.go b/src/modules/network_element/ne_config_test.go new file mode 100644 index 00000000..1678ddf7 --- /dev/null +++ b/src/modules/network_element/ne_config_test.go @@ -0,0 +1,230 @@ +package networkelement + +import ( + "encoding/json" + "fmt" + "log" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "testing" + "time" + + "be.ems/src/modules/network_element/model" + "gopkg.in/yaml.v3" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +const ( + // 数据库 + DbHost = "192.168.8.58" + DbPort = 33066 + DbUser = "root" + DbPassswd = "1000omc@kp!" + DbName = "omc_db" + // 配置文件路径 + configParamDir = "../../../config/param" + // configParamFile = "*" // 目录下全部更新 + configParamFile = "upf_param_config.yaml" // 单文件更新 +) + +func TestEncrypt(t *testing.T) { + fileNameList, err := getDirFileNameList(configParamDir) + if err != nil { + log.Fatal(err) + return + } + + if configParamFile == "*" { + for _, v := range fileNameList { + params := parseData(filepath.Join(configParamDir, v)) + if params == nil { + return + } + saveData(params) + } + } else { + params := parseData(filepath.Join(configParamDir, configParamFile)) + if params == nil { + return + } + saveData(params) + } +} + +// ========= Main ============= + +// parseData 文件转map数据 +func parseData(filePaht string) []map[string]string { + data, err := parseStrToMap(filePaht) + if err != nil { + log.Printf("parseStrToMap => %s", err.Error()) + return nil + } + params, err := parseParamConfig(data) + if err != nil { + log.Printf("parseParamConfig => %s", err.Error()) + return nil + } + return params +} + +// saveData 保存数据 +func saveData(params []map[string]string) { + // 定义排序函数 + sort.Slice(params, func(i, j int) bool { + paramSortI := params[i]["paramSort"] + if len(paramSortI) == 0 || paramSortI == "" { + paramSortI = "0" + } + paramSortJ := params[j]["paramSort"] + if len(paramSortJ) == 0 || paramSortJ == "" { + paramSortJ = "0" + } + // 将 age 字段转换为整数进行比较 + si, _ := strconv.Atoi(paramSortI) + sj, _ := strconv.Atoi(paramSortJ) + return si < sj + }) + // 遍历插入 + for _, v := range params { + paramSort := v["paramSort"] + if len(paramSort) == 0 || paramSort == "" { + paramSort = "0" + } + sort, err := strconv.ParseInt(paramSort, 10, 64) + if err != nil { + sort = 0 + } + + neConfig := model.NeConfig{ + NeType: v["neType"], + ParamName: v["paramName"], + ParamDisplay: v["paramDisplay"], + ParamType: v["paramType"], + ParamJson: v["paramJson"], + ParamPerms: v["paramPerms"], + ParamSort: sort, + } + neConfig.ID = saveDB(neConfig) + log.Println(neConfig.ID, neConfig.NeType, neConfig.ParamDisplay) + } +} + +// ========= DB ============= + +var gdb *gorm.DB + +// connDB 连接到数据库 +func connDB() *gorm.DB { + if gdb != nil { + return gdb + } + + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", DbUser, DbPassswd, DbHost, DbPort, DbName) + newLogger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer + logger.Config{ + SlowThreshold: time.Minute, // Slow SQL threshold + LogLevel: logger.Error, // Log level + IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger + ParameterizedQueries: true, // Don't include params in the SQL log + Colorful: false, // Disable color + }, + ) + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger}) + if err != nil { + log.Fatalln(err) + } + gdb = db + return gdb +} + +// saveDB 表插入或更新 +func saveDB(s model.NeConfig) string { + db := connDB() + // 检查是否存在 + var id string + db.Raw("SELECT id FROM ne_config WHERE ne_type = ? AND param_name = ?", s.NeType, s.ParamName).Scan(&id) + // 更新时间 + s.UpdateTime = time.Now().UnixMilli() + if id != "" { + s.ID = id + db.Save(s) + } else { + db.Create(s) + } + return s.ID +} + +// ========= Utils ============= + +// getDirFileNameList 获取文件目录下所有文件名称,不含目录名称 +func getDirFileNameList(dirPath string) ([]string, error) { + fileNames := []string{} + + dir, err := os.Open(dirPath) + if err != nil { + return fileNames, nil + } + defer dir.Close() + + fileInfos, err := dir.Readdir(-1) + if err != nil { + return fileNames, err + } + + for _, fileInfo := range fileInfos { + if fileInfo.Mode().IsRegular() { + fileNames = append(fileNames, fileInfo.Name()) + } + } + + return fileNames, nil +} + +// parseStrToMap 解析内容string到map +func parseStrToMap(filePath string) (map[string]any, error) { + // 读取文件内容 + bytes, err := os.ReadFile(filePath) + if err != nil { + return nil, err + } + content := string(bytes) + var configMap map[string]any + err = yaml.Unmarshal([]byte(content), &configMap) + + return configMap, err +} + +// parseParamConfig 解析内容文件数据 +func parseParamConfig(data map[string]any) ([]map[string]string, error) { + paramMapArr := make([]map[string]string, 0) + for k, v := range data { + for ik, iv := range v.(map[string]any) { + itemMap := make(map[string]string) + itemMap["neType"] = strings.ToUpper(k) + itemMap["paramName"] = ik + for iik, iiv := range iv.(map[string]any) { + switch iik { + case "display": + itemMap["paramDisplay"] = iiv.(string) + case "sort": + itemMap["paramSort"] = fmt.Sprint(iiv) + case "perms", "method": + itemMap["paramPerms"] = iiv.(string) + case "data", "list", "array": + itemMap["paramType"] = iik + strByte, _ := json.Marshal(iiv) + itemMap["paramJson"] = string(strByte) + } + } + paramMapArr = append(paramMapArr, itemMap) + } + } + return paramMapArr, nil +}