package main import ( "os" "regexp" "strconv" "strings" "lc/common/protocol" "lc/common/util" ) func HandleFile(topic string, obj *protocol.Pack_SeqFileObject) error { switch topic { case protocol.TP_GW_SET_APP: var app protocol.AppConfig if err := json.UnmarshalFromString(obj.Data.Content, &app); err != nil { return err } return SaveFile(obj.Data.File, obj.Data.Content, 0) case protocol.TP_GW_SET_SERIAL: sc := protocol.SerialConfig{Serial: make(map[uint8]*protocol.SerialPort)} if err := json.UnmarshalFromString(obj.Data.Content, &sc); err != nil { return err } return SaveFile(obj.Data.File, obj.Data.Content, 0) case protocol.TP_GW_SET_RTU: var rtu protocol.MapDevConfig if err := json.UnmarshalFromString(obj.Data.Content, &rtu); err != nil { return err } return SaveFile(obj.Data.File, obj.Data.Content, 1) case protocol.TP_GW_SET_MODEL: var iot protocol.IotModel if err := json.UnmarshalFromString(obj.Data.Content, &iot); err != nil { return err } return SaveFile(obj.Data.File, obj.Data.Content, 2) } return nil } func SaveFile(fname, content string, flag uint8) error { var SavePath string switch flag { case 0: SavePath = util.GetPath(0) case 1: SavePath = util.GetPath(1) case 2: SavePath = util.GetPath(2) } tmpPath := util.GetPath(4) util.GetTagLog().Infof("sys", "SaveFile:开始,fname=%s,flag=%d,tmpPath=%s,savePath=%s", fname, flag, tmpPath, SavePath) //存成临时文件 if err := os.MkdirAll(tmpPath, os.ModePerm); err != nil { util.GetTagLog().Errorf("sys", "SaveFile:MkdirAll失败,path=%s,err=%v", tmpPath, err) return err } if err := os.WriteFile(tmpPath+fname, []byte(content), os.ModePerm); err != nil { util.GetTagLog().Errorf("sys", "SaveFile:写tmp文件失败,path=%s,err=%v", tmpPath+fname, err) return err } util.GetTagLog().Infof("sys", "SaveFile:tmp文件写入成功,path=%s,len=%d", tmpPath+fname, len(content)) //备份原文件(不存在则跳过) if _, err := os.Stat(SavePath + fname); err == nil { if err := os.Rename(SavePath+fname, SavePath+fname+".bak"); err != nil { util.GetTagLog().Errorf("sys", "SaveFile:备份失败,src=%s,err=%v", SavePath+fname, err) return err } util.GetTagLog().Infof("sys", "SaveFile:备份成功,src=%s", SavePath+fname+".bak") } else { util.GetTagLog().Infof("sys", "SaveFile:原文件不存在,跳过备份,path=%s", SavePath+fname) } //拷贝新文件 if err := os.Rename(tmpPath+fname, SavePath+fname); err != nil { util.GetTagLog().Errorf("sys", "SaveFile:替换失败,src=%s,dst=%s,err=%v", tmpPath+fname, SavePath+fname, err) //拷贝失败,则还原文件 if err := os.Rename(SavePath+fname+".bak", SavePath+fname); err != nil { util.GetTagLog().Errorf("sys", "SaveFile:还原失败,src=%s,err=%v", SavePath+fname+".bak", err) } return err } util.GetTagLog().Infof("sys", "SaveFile:替换成功,path=%s", SavePath+fname) return nil } func ReadFileContent(topic string, o *protocol.Pack_SeqFileObject) { switch topic { case protocol.TP_GW_APP: if buf, err := os.ReadFile(util.GetPath(0) + "app.json"); err == nil { o.Data.File = "app.json" o.Data.Content = string(buf) } case protocol.TP_GW_SERIAL: if buf, err := os.ReadFile(util.GetPath(0) + "serial.json"); err == nil { o.Data.File = "serial.json" o.Data.Content = string(buf) } } } func ReadMutilFileContent(topic string, id uint, o *protocol.Pack_MutilFileObject) { var FileDir string if topic == protocol.TP_GW_RTU { FileDir = util.GetPath(1) } else if topic == protocol.TP_GW_MODEL { FileDir = util.GetPath(2) } else if topic == protocol.TP_GW_LOG { FileDir = util.GetPath(3) } else if topic == protocol.TP_GW_APP || topic == protocol.TP_GW_SERIAL { FileDir = util.GetPath(0) } //RTU或模型文件 if topic == protocol.TP_GW_RTU || topic == protocol.TP_GW_MODEL { if id > 0 { fname := strconv.Itoa(int(id)) + ".json" AddFileObject(FileDir, fname, o) } else { rd, _ := os.ReadDir(FileDir) for _, fi := range rd { if !fi.IsDir() { ok, _ := regexp.MatchString(`[1-9].*json`, fi.Name()) if ok { AddFileObject(FileDir, fi.Name(), o) } } } } } else if topic == protocol.TP_GW_LOG { //日志 rd, _ := os.ReadDir(FileDir) for _, fi := range rd { if !fi.IsDir() { ok := strings.HasSuffix(fi.Name(), ".log") if ok { AddFileObject(FileDir, fi.Name(), o) } } } } else if topic == protocol.TP_GW_APP { AddFileObject(FileDir, "app.json", o) } else if topic == protocol.TP_GW_SERIAL { AddFileObject(FileDir, "serial.json", o) } } func AddFileObject(fpath, fname string, o *protocol.Pack_MutilFileObject) { if buf, err := os.ReadFile(fpath + fname); err == nil { var fo protocol.FileObject fo.File = fname fo.Content = string(buf) o.Data.Files = append(o.Data.Files, fo) } }