198 lines
5.7 KiB
Go
198 lines
5.7 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
|
|
"be.ems/src/framework/utils/file"
|
|
"be.ems/src/modules/network_element/model"
|
|
"be.ems/src/modules/network_element/repository"
|
|
)
|
|
|
|
// 实例化服务层 NeLicense 结构体
|
|
var NewNeLicense = &NeLicense{
|
|
neLicenseRepository: repository.NewNeLicense,
|
|
}
|
|
|
|
// NeLicense 网元授权激活信息 服务层处理
|
|
type NeLicense struct {
|
|
neLicenseRepository *repository.NeLicense // 网元授权激活信息表
|
|
}
|
|
|
|
// FindByPage 分页查询列表数据
|
|
func (r *NeLicense) FindByPage(query map[string]string) ([]model.NeLicense, int64) {
|
|
return r.neLicenseRepository.SelectByPage(query)
|
|
}
|
|
|
|
// Find 查询列表
|
|
func (r *NeLicense) Find(neLicense model.NeLicense) []model.NeLicense {
|
|
return r.neLicenseRepository.Select(neLicense)
|
|
}
|
|
|
|
// FindById 通过ID查询
|
|
func (r *NeLicense) FindById(id int64) model.NeLicense {
|
|
if id <= 0 {
|
|
return model.NeLicense{}
|
|
}
|
|
neLicenses := r.neLicenseRepository.SelectByIds([]int64{id})
|
|
if len(neLicenses) > 0 {
|
|
return neLicenses[0]
|
|
}
|
|
return model.NeLicense{}
|
|
}
|
|
|
|
// Insert 新增信息
|
|
func (r *NeLicense) Insert(neLicense model.NeLicense) int64 {
|
|
return r.neLicenseRepository.Insert(neLicense)
|
|
}
|
|
|
|
// Update 修改信息
|
|
func (r *NeLicense) Update(neLicense model.NeLicense) int64 {
|
|
return r.neLicenseRepository.Update(neLicense)
|
|
}
|
|
|
|
// DeleteByIds 批量删除信息
|
|
func (r *NeLicense) DeleteByIds(ids []int64) (int64, error) {
|
|
// 检查是否存在
|
|
rowIds := r.neLicenseRepository.SelectByIds(ids)
|
|
if len(rowIds) <= 0 {
|
|
return 0, fmt.Errorf("neLicense.noData")
|
|
}
|
|
|
|
if len(rowIds) == len(ids) {
|
|
rows := r.neLicenseRepository.DeleteByIds(ids)
|
|
return rows, nil
|
|
}
|
|
// 删除信息失败!
|
|
return 0, fmt.Errorf("delete fail")
|
|
}
|
|
|
|
// FindByTypeAndID 通过网元类型和网元ID查询
|
|
func (r *NeLicense) FindByTypeAndID(neType, neId string) model.NeLicense {
|
|
neLicenses := r.neLicenseRepository.Select(model.NeLicense{
|
|
NeType: neType,
|
|
NeId: neId,
|
|
})
|
|
if len(neLicenses) > 0 {
|
|
return neLicenses[0]
|
|
}
|
|
return model.NeLicense{}
|
|
}
|
|
|
|
// FindByNeTypeAndNeID 通过ne_type和ne_id查询信息
|
|
func (r *NeLicense) FindByNeTypeAndNeID(neType, neId string) model.NeLicense {
|
|
neLicenses := r.neLicenseRepository.Select(model.NeLicense{
|
|
NeType: neType,
|
|
NeId: neId,
|
|
})
|
|
if len(neLicenses) > 0 {
|
|
return neLicenses[0]
|
|
}
|
|
return model.NeLicense{}
|
|
}
|
|
|
|
// ReadLicenseInfo 读取授权文件信息
|
|
// 返回激活申请码, 激活文件
|
|
func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) {
|
|
neTypeLower := strings.ToLower(neLicense.NeType)
|
|
// 网管本地路径
|
|
omcPath := "/usr/local/omc/backup/ne_license"
|
|
if runtime.GOOS == "windows" {
|
|
omcPath = fmt.Sprintf("C:%s", omcPath)
|
|
}
|
|
omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId)
|
|
// 网元端授权文件路径
|
|
nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower)
|
|
|
|
// 网元主机的SSH客户端
|
|
sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId)
|
|
if err != nil {
|
|
return "", ""
|
|
}
|
|
defer sshClient.Close()
|
|
// 网元主机的SSH客户端进行文件传输
|
|
sftpClient, err := sshClient.NewClientSFTP()
|
|
if err != nil {
|
|
return "", ""
|
|
}
|
|
defer sftpClient.Close()
|
|
|
|
// 复制授权申请码到本地
|
|
if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil {
|
|
return "", ""
|
|
}
|
|
// 读取文件内容
|
|
bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt")
|
|
if err != nil {
|
|
return "", ""
|
|
}
|
|
|
|
// 复制激活文件到本地
|
|
licensePath := ""
|
|
if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil {
|
|
licensePath = omcPath + "/system.ini"
|
|
}
|
|
|
|
activationRequestCode := string(bytes)
|
|
parts := strings.Split(activationRequestCode, "\n")
|
|
if len(parts) > 1 && strings.HasPrefix(parts[0], "SN") {
|
|
activationRequestCode = parts[1] // 获取第二行内容
|
|
}
|
|
return strings.TrimSpace(activationRequestCode), licensePath
|
|
}
|
|
|
|
// UploadLicense 授权文件上传到网元主机
|
|
func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error {
|
|
// 检查文件是否存在
|
|
omcLicensePath := file.ParseUploadFileAbsPath(neLicense.LicensePath)
|
|
if _, err := os.Stat(omcLicensePath); err != nil {
|
|
return fmt.Errorf("file read failure")
|
|
}
|
|
|
|
// 网元主机的SSH客户端
|
|
sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer sshClient.Close()
|
|
// 网元主机的SSH客户端进行文件传输
|
|
sftpClient, err := sshClient.NewClientSFTP()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer sftpClient.Close()
|
|
|
|
// 网元端授权文件路径
|
|
neTypeLower := strings.ToLower(neLicense.NeType)
|
|
neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower)
|
|
neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath))
|
|
// 修改网元文件权限
|
|
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath))
|
|
|
|
// 尝试备份授权文件
|
|
neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405"))
|
|
sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack))
|
|
|
|
// 上传授权文件去覆盖
|
|
if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil {
|
|
return fmt.Errorf("please check if scp remote copy is allowed")
|
|
}
|
|
|
|
// 重启服务
|
|
if neLicense.Reload {
|
|
cmdStr := fmt.Sprintf("sudo systemctl restart %s", neTypeLower)
|
|
switch neTypeLower {
|
|
case "ims":
|
|
cmdStr = "ims-stop || true && ims-start"
|
|
case "omc":
|
|
cmdStr = "sudo systemctl restart omc"
|
|
}
|
|
sshClient.RunCMD(cmdStr)
|
|
}
|
|
return nil
|
|
}
|