package service import ( "fmt" "os" "runtime" "strings" "time" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" "be.ems/src/modules/network_element/model" "be.ems/src/modules/network_element/repository" ) // NewNeConfigBackupImpl 网元配置文件备份记录 实例化服务层 var NewNeConfigBackupImpl = &NeConfigBackupImpl{ neConfigBackupRepository: repository.NewNeConfigBackupImpl, } // NeConfigBackupImpl 网元配置文件备份记录 服务层处理 type NeConfigBackupImpl struct { // 网元配置文件备份记录 neConfigBackupRepository repository.INeConfigBackup } // SelectNeHostPage 分页查询列表数据 func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { return r.neConfigBackupRepository.SelectPage(query) } // SelectConfigList 查询列表 func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { return r.neConfigBackupRepository.SelectList(item) } // SelectByIds 通过ID查询 func (r *NeConfigBackupImpl) SelectById(id string) model.NeConfigBackup { if id == "" { return model.NeConfigBackup{} } arr := r.neConfigBackupRepository.SelectByIds([]string{id}) if len(arr) > 0 { return arr[0] } return model.NeConfigBackup{} } // Insert 新增信息 func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { return r.neConfigBackupRepository.Insert(item) } // Update 修改信息 func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { return r.neConfigBackupRepository.Update(item) } // DeleteByIds 批量删除信息 func (r *NeConfigBackupImpl) DeleteByIds(ids []string) (int64, error) { // 检查是否存在 data := r.neConfigBackupRepository.SelectByIds(ids) if len(data) <= 0 { return 0, fmt.Errorf("neConfigBackup.noData") } if len(data) == len(ids) { rows := r.neConfigBackupRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! return 0, fmt.Errorf("delete fail") } // NeConfigLocalToNe 网元配置文件复制到网元端覆盖 func (r *NeConfigBackupImpl) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { neTypeLower := strings.ToLower(neInfo.NeType) // 网管本地路径 omcPath := "/usr/local/etc/omc/ne_config" if runtime.GOOS == "windows" { omcPath = fmt.Sprintf("C:%s", omcPath) } localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) if err := file.UnZip(localFile, localDirPath); err != nil { return fmt.Errorf("unzip err") } // 网元主机的SSH客户端 sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { return fmt.Errorf("ne info ssh client err") } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { return fmt.Errorf("ne info sftp client err") } defer sftpClient.Close() // 网元配置端上的临时目录 neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) // 复制到网元端 if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { return fmt.Errorf("copy config to ne err") } // 配置复制到网元内 if neTypeLower == "ims" { // ims目录 imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} for _, v := range imsDirArr { sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) } // mf目录 sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) // rtproxy目录 sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) // iwf目录 sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) } else if neTypeLower == "omc" { sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) } else { neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) if neTypeLower == "mme" { chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) } sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) } _ = os.RemoveAll(localDirPath) // 删除本地临时目录 sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 return nil } // NeConfigNeToLocal 网元备份文件网元端复制到本地 func (r *NeConfigBackupImpl) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { // 网元主机的SSH客户端 sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { return "", fmt.Errorf("ne info ssh client err") } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { return "", fmt.Errorf("ne info sftp client err") } defer sftpClient.Close() neTypeLower := strings.ToLower(neInfo.NeType) // 网管本地路径 omcPath := "/usr/local/etc/omc/ne_config" if runtime.GOOS == "windows" { omcPath = fmt.Sprintf("C:%s", omcPath) } localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) // 网元配置文件先复制到临时目录 sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) if neTypeLower == "ims" { // ims目录 sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} for _, v := range imsDirArr { sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) } // mf目录 sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) // rtproxy目录 sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) // iwf目录 sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) } else if neTypeLower == "omc" { sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) } else { nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) if neTypeLower == "mme" { nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) } sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) } // 网元端复制到本地 if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { return "", fmt.Errorf("copy config err") } // 压缩zip文件名 zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { return "", fmt.Errorf("compress zip err") } _ = os.RemoveAll(localDirPath) // 删除本地临时目录 sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 return zipFilePath, nil }