Merge branch 'lichang' into lite

This commit is contained in:
TsMask
2025-05-30 14:25:47 +08:00
18 changed files with 185 additions and 57 deletions

View File

@@ -171,6 +171,13 @@ func Get(key string) any {
return conf.Get(key)
}
// Set 设置配置信息
//
// Set("redis.defaultDataSourceName", "std")
func Set(key string, value any) {
conf.Set(key, value)
}
// GetAssetsDirFS 访问程序内全局资源访问
func GetAssetsDirFS() *embed.FS {
return conf.Get("AssetsDir").(*embed.FS)

View File

@@ -27,7 +27,7 @@ func (c *ConnTCP) New() (*ConnTCP, error) {
proto = "tcp6"
c.Addr = fmt.Sprintf("[%s]", c.Addr)
}
address := fmt.Sprintf("%s:%d", c.Addr, c.Port)
address := net.JoinHostPort(c.Addr, fmt.Sprint(c.Port))
// 默认等待5s
if c.DialTimeOut == 0 {

View File

@@ -57,8 +57,14 @@ func (s *SocketTCP) Resolve(callback func(conn *net.Conn, err error)) {
callback(nil, fmt.Errorf("tcp service not created"))
return
}
listener := *s.Listener
defer func() {
if err := recover(); err != nil {
callback(nil, fmt.Errorf("tcp service panic err"))
}
}()
listener := *s.Listener
for {
select {
case <-s.StopChan:

View File

@@ -27,7 +27,7 @@ func (c *ConnUDP) New() (*ConnUDP, error) {
proto = "udp6"
c.Addr = fmt.Sprintf("[%s]", c.Addr)
}
address := fmt.Sprintf("%s:%d", c.Addr, c.Port)
address := net.JoinHostPort(c.Addr, fmt.Sprint(c.Port))
// 默认等待5s
if c.DialTimeOut == 0 {

View File

@@ -56,10 +56,17 @@ func (s *SocketUDP) Resolve(callback func(*net.UDPConn, error)) {
return
}
defer func() {
if err := recover(); err != nil {
callback(nil, fmt.Errorf("udp service panic err"))
}
}()
for {
select {
case <-s.StopChan:
callback(nil, fmt.Errorf("udp service not created"))
return
default:
callback(s.Conn, nil)
}

View File

@@ -439,7 +439,7 @@ func (s *NeActionController) Service(c *gin.Context) {
neTypeLower := strings.ToLower(neInfo.NeType)
cmdStr := fmt.Sprintf("sudo systemctl %s %s", body.Action, neTypeLower)
if neTypeLower == "omc" {
cmdStr = fmt.Sprintf("nohup sh -c \"sudo systemctl stop omc && sleep 5s && sudo systemctl %s omc\" > /dev/null 2>&1 &", body.Action)
cmdStr = fmt.Sprintf("nohup sh -c \"sleep 5s && sudo systemctl %s omc\" > /dev/null 2>&1 &", body.Action)
} else if neTypeLower == "ims" {
if body.Action == "restart" {
cmdStr = "ims-stop || true && ims-start"

View File

@@ -12,6 +12,7 @@ import (
neFetchlink "be.ems/src/modules/network_element/fetch_link"
"be.ems/src/modules/network_element/model"
neService "be.ems/src/modules/network_element/service"
traceService "be.ems/src/modules/trace/service"
"github.com/gin-gonic/gin"
)
@@ -214,12 +215,17 @@ func (s NeConfigController) DataInfo(c *gin.Context) {
}
if query.NeType == "OMC" {
var o *cm_omc.ConfigOMC
resData, err := o.Query(query.ParamName)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
if query.ParamName == "alarmEmailForward" || query.ParamName == "alarmSMSForward" {
var o *cm_omc.ConfigOMC
resData, err := o.Query(query.ParamName)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.OkData(resData))
return
}
resData := s.neConfigService.GetOMCYaml(query.ParamName)
c.JSON(200, resp.OkData(resData))
return
}
@@ -268,13 +274,26 @@ func (s NeConfigController) DataEdit(c *gin.Context) {
return
}
if body.NeType == "OMC" {
var o *cm_omc.ConfigOMC
resData, err := o.Modify(body.ParamName, body.ParamData)
if body.ParamName == "alarmEmailForward" || body.ParamName == "alarmSMSForward" {
var o *cm_omc.ConfigOMC
resData, err := o.Modify(body.ParamName, body.ParamData)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.OkData(resData))
return
}
err := s.neConfigService.ModifyOMCYaml(body.ParamName, body.Loc, body.ParamData)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.OkData(resData))
// 重开跟踪任务信令数据通道UDP
if body.ParamName == "trace" {
traceService.NewTraceTask.CreateUDP(true)
}
c.JSON(200, resp.Ok(nil))
return
}

View File

@@ -268,7 +268,7 @@ func (s *NeLicenseController) State(c *gin.Context) {
neLicense.Status = "0"
}
// 更新授权码
if neLicense.ActivationRequestCode == "" || strings.HasPrefix(neLicense.ActivationRequestCode, "SN") {
if neLicense.ActivationRequestCode == "" || strings.HasPrefix(neLicense.ActivationRequestCode, "SN") || neLicense.Status == "0" {
code, licensePath := s.neLicenseService.ReadLicenseInfo(neLicense)
neLicense.ActivationRequestCode = code
neLicense.LicensePath = licensePath

View File

@@ -0,0 +1,56 @@
package service
import (
"fmt"
"runtime"
"strings"
"be.ems/src/framework/cmd"
"be.ems/src/framework/config"
)
// GetOMCYaml 获取OMC网元配置文件 /usr/local/etc/omc/omc.yaml
func (r NeConfig) GetOMCYaml(paramName string) []map[string]any {
if paramName == "trace" {
traceData := config.Get("trace").(map[string]any)
return []map[string]any{traceData}
}
return []map[string]any{}
}
// ModifyOMCYaml 修改OMC网元配置文件 /usr/local/etc/omc/omc.yaml
func (r NeConfig) ModifyOMCYaml(paramName, loc string, paramData any) error {
neConfig := r.FindByNeTypeAndParamName("OMC", paramName)
if neConfig.ParamType == "list" {
if paramName == "trace" {
configPath := fmt.Sprint(config.Get("config")) // 获取配置文件路径
paramDataMap := paramData.(map[string]any)
for k, v := range paramDataMap {
config.Set(fmt.Sprintf("trace.%s", strings.ToLower(k)), v)
if runtime.GOOS == "windows" {
continue // Windows系统不支持sed命令
}
// 修改参数较少,直接命令改文件内容
if k == "enabled" {
// sed 's/enabled: \(true\|false\) # trace enabled/enabled: true # trace enabled/' /usr/local/etc/omc/omc.yaml
cmd.Execf("sed -i 's/enabled: \\(true\\|false\\) # trace enabled/enabled: %v # trace enabled/' %s", v, configPath)
}
if k == "host" {
// sed 's/host: ".*" # trace host/host: "127.2.2.2" # trace host/' /usr/local/etc/omc/omc.yaml
cmd.Execf("sed -i 's/host: \".*\" # trace host/host: \"%v\" # trace host/' %s", v, configPath)
}
if k == "port" {
// sed 's/port: [0-9]\+ # trace port/port: 6964 # trace port/' /usr/local/etc/omc/omc.yaml
cmd.Execf("sed -i 's/port: [0-9]\\+ # trace port/port: %v # trace port/' %s", v, configPath)
}
}
// 重开跟踪任务信令数据通道UDP
// service.NewTraceTask.CreateUDP(true) 方法导致循环引用,抛给上层调用
return nil
}
}
if neConfig.ParamType == "array" {
// TODO
}
return fmt.Errorf("not found method paramName")
}

View File

@@ -662,7 +662,7 @@ func (r NeVersion) operateRun(preinput map[string]string, cmdStrArr []string, ne
}
}
if !suffix {
suffix = strings.LastIndex(outputStr, "# ") != -1
suffix = strings.LastIndex(outputStr, "# ") != -1 // 特殊内容中的终端终止符
}
if len(cmdStrArr) > 0 && suffix {
if firstRead {

View File

@@ -32,6 +32,9 @@ func (r TraceTask) SelectByPage(query map[string]string) ([]model.TraceTask, int
if v, ok := query["title"]; ok && v != "" {
tx = tx.Where("title like ?", fmt.Sprintf("%s%%", v))
}
if v, ok := query["neType"]; ok && v != "" {
tx = tx.Where("ne_list like ?", fmt.Sprintf("%%%s%%", strings.ToUpper(v)))
}
if v, ok := query["startTime"]; ok && v != "" {
if len(v) == 10 {
v = fmt.Sprintf("%s000", v)
@@ -90,8 +93,7 @@ func (r TraceTask) SelectByPage(query map[string]string) ([]model.TraceTask, int
tx = tx.Order("id desc")
}
err := tx.Find(&rows).Error
if err != nil {
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}

View File

@@ -22,22 +22,25 @@ import (
// 实例化数据层 TraceTask 结构体
var NewTraceTask = &TraceTask{
udpService: socket.SocketUDP{},
tcpService: socket.SocketTCP{},
traceTaskRepository: repository.NewTraceTask,
traceDataRepository: repository.NewTraceData,
}
// TraceTask 跟踪任务 服务层处理
type TraceTask struct {
// UDP服务对象
udpService socket.SocketUDP
// 跟踪_任务数据信息
traceTaskRepository *repository.TraceTask
// 跟踪_数据信息
traceDataRepository *repository.TraceData
udpService socket.SocketUDP // UDP服务对象
tcpService socket.SocketTCP // 测试用后续调整TODO
traceTaskRepository *repository.TraceTask // 跟踪_任务数据信息
traceDataRepository *repository.TraceData // 跟踪_数据信息
}
// CreateUDP 创建UDP数据通道
func (r TraceTask) CreateUDP() error {
func (r *TraceTask) CreateUDP(reload bool) error {
if reload {
r.CloseUDP() // 关闭之前的UDP服务
}
// 跟踪配置是否开启
host, port, err := r.traceNotify()
if err != nil {
@@ -84,12 +87,12 @@ func (r TraceTask) CreateUDP() error {
// ============ 本地测试接收网元UDP发过来的数据 后续调整TODO
if config.Env() == "local" {
// 初始化TCP服务
tcpService := socket.SocketTCP{Addr: host, Port: port + 1}
if _, err := tcpService.New(); err != nil {
r.tcpService = socket.SocketTCP{Addr: host, Port: port + 1}
if _, err := r.tcpService.New(); err != nil {
return err
}
// 接收处理TCP数据
go tcpService.Resolve(func(conn *net.Conn, err error) {
go r.tcpService.Resolve(func(conn *net.Conn, err error) {
if err != nil {
logger.Errorf("TCP Resolve %s", err.Error())
return
@@ -125,7 +128,7 @@ func (r TraceTask) CreateUDP() error {
}
// pasreUDPData 解析数据
func (r TraceTask) pasreUDPData(buf []byte) error {
func (r *TraceTask) pasreUDPData(buf []byte) error {
data, err := traceHandler(buf)
if err != nil {
logger.Errorf("UDP Resolve UDPDataHandler Error: %s", err.Error())
@@ -157,8 +160,9 @@ func (r TraceTask) pasreUDPData(buf []byte) error {
}
// CloseUDP 关闭UDP数据通道
func (r TraceTask) CloseUDP() {
func (r *TraceTask) CloseUDP() {
r.udpService.Close()
r.tcpService.Close()
}
// FindByPage 根据条件分页查询

View File

@@ -141,7 +141,7 @@ func Setup(router *gin.Engine) {
// InitLoad 初始参数
func InitLoad() {
// 创建跟踪任务信令数据通道UDP
if err := service.NewTraceTask.CreateUDP(); err != nil {
if err := service.NewTraceTask.CreateUDP(false); err != nil {
logger.Errorf("socket udp init fail: %s", err.Error())
}
}