1
0

marge: 合并代码,包名变更be.ems

This commit is contained in:
TsMask
2024-03-18 15:22:47 +08:00
parent df904f5328
commit 78bd110b03
393 changed files with 7870 additions and 5170 deletions

View File

@@ -9,11 +9,11 @@ import (
"github.com/go-resty/resty/v2"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/lib/oauth"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/lib/oauth"
"be.ems/lib/services"
"be.ems/restagent/config"
)
var (

View File

@@ -5,12 +5,12 @@ import (
"io"
"net/http"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
wsService "ems.agt/src/modules/ws/service"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
wsService "be.ems/src/modules/ws/service"
)
var (

View File

@@ -9,7 +9,7 @@ import (
"os/exec"
"time"
"ems.agt/lib/log"
"be.ems/lib/log"
)
func ExecCmd(command string) error {

View File

@@ -9,7 +9,7 @@ import (
"os/exec"
"time"
"ems.agt/lib/log"
"be.ems/lib/log"
)
func ExecCmd(command string) error {

View File

@@ -7,11 +7,12 @@ import (
"os"
"os/exec"
"strings"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/gorilla/mux"
)
@@ -153,6 +154,22 @@ func DeleteLcenseFile(w http.ResponseWriter, r *http.Request) {
services.ResponseStatusOK204NoContent(w)
}
type MMLRequest struct {
MML []string `json:"mml"`
}
var TIME_DELAY_AFTER_WRITE time.Duration = 200
var TIME_DEAD_LINE time.Duration = 10
func init() {
if config.GetYamlConfig().MML.Sleep != 0 {
TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep)
}
if config.GetYamlConfig().MML.DeadLine != 0 {
TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine)
}
}
func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) {
log.Info("UploadLicenseFileData processing... ")
@@ -207,7 +224,7 @@ func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) {
var licenseFileName, comment string
// 处理软件rpm/deb文件
// 处理license文件
if len(licFile) > 0 {
file := licFile[0]
// 打开文件
@@ -279,39 +296,213 @@ func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) {
return
}
switch neTypeLower {
case "omc":
restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir)
cmd := exec.Command("ssh", sshHost, restartCmd)
out, err := cmd.CombinedOutput()
log.Debugf("Exec output: %v", string(out))
if err != nil {
log.Error("Faile to execute ssh restart omc:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
case "ims":
restartCmd := "sudo ims-stop && sudo ims-start"
cmd := exec.Command("ssh", sshHost, restartCmd)
out, err := cmd.CombinedOutput()
log.Debugf("Exec output: %v", string(out))
if err != nil {
log.Error("Faile to execute ssh sudo systemctl command:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
default:
restartCmd := fmt.Sprintf("sudo systemctl restart %s.service", neTypeLower)
cmd := exec.Command("ssh", sshHost, restartCmd)
out, err := cmd.CombinedOutput()
log.Debugf("Exec output: %v", string(out))
if err != nil {
log.Error("Faile to execute ssh sudo systemctl command:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
}
/*
// judge license if expired
isRestart := false
hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, neTypeLower)
log.Debug("requestURI2NF:", requestURI2NF)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
//SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(requestURI2NF)
if err != nil {
log.Error("Failed to get system state:", err)
isRestart = true
} else {
systemState := make(map[string]interface{})
_ = json.Unmarshal(resp.Body(), &systemState)
expiryDate := fmt.Sprintf("%v", systemState["expiryDate"])
t1_expiry, _ := time.ParseInLocation(time.DateOnly, expiryDate, time.Local)
nowDate := time.Now().Local()
nowDate.Format(time.DateOnly)
isRestart = t1_expiry.Before(nowDate)
}
// case non-expired license: send NE reload license MML
if !isRestart {
// send reload license MML
var buf [20 * 1024]byte
//buf := make([]byte, 0)
var n int
if neInfo != nil {
switch strings.ToLower(neType) {
case "ims":
hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port)
conn, err := net.Dial("tcp", hostMML)
if err != nil {
errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err)
log.Error(errMsg)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
defer conn.Close()
conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second))
_, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\r\n"))
if err != nil {
log.Error("Failed to write:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
n, err = conn.Read(buf[0:])
if err != nil {
log.Error("Failed to read:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Trace(string(buf[0:n]))
_, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n"))
if err != nil {
log.Error("Failed to write:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
n, err = conn.Read(buf[0:])
if err != nil {
log.Error("Failed to read:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Trace(string(buf[0 : n-len(neType)-2]))
mmlCommand := "check lic\r\n"
_, err = conn.Write([]byte(mmlCommand))
if err != nil {
log.Error("Failed to write:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
n, err = conn.Read(buf[0:])
if err != nil {
log.Error("Failed to read:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Trace(string(buf[0 : n-len(neType)-2]))
re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符
//re2 := regexp.MustCompile(`\x00`) // 匹配空字符
re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符
//re := regexp.MustCompile(`[\x00-\x1F\x7F]`)
// upf telnet buffer只能读取一次需要去掉前面的多余字符
result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "")
result = re2.ReplaceAllString(result, "")
if !strings.Contains(result, "COMMAND OK") {
err = fmt.Errorf("failed to check license, %s", result)
log.Error(err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
default:
hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port)
conn, err := net.Dial("tcp", hostMML)
if err != nil {
errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err)
log.Error(errMsg)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
defer conn.Close()
conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second))
loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password)
_, err = conn.Write([]byte(loginStr))
if err != nil {
log.Error("Failed to write:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
n, err = conn.Read(buf[0:])
if err != nil {
log.Error("Failed to read:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Trace(string(buf[0:n]))
mmlCommand := "check lic\n"
_, err = conn.Write([]byte(mmlCommand))
if err != nil {
log.Error("Failed to write:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
n, err = conn.Read(buf[0:])
if err != nil {
log.Error("Failed to read:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Trace(string(buf[0 : n-len(neType)-2]))
re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符
//re2 := regexp.MustCompile(`\x00`) // 匹配空字符
re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符
//re := regexp.MustCompile(`[\x00-\x1F\x7F]`)
result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "")
result = re2.ReplaceAllString(result, "")
if !strings.Contains(result, "COMMAND OK") {
err = fmt.Errorf("failed to check license, %s", result)
log.Error(err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
}
}
} else {
// case expired license: restart NE service
switch neTypeLower {
case "omc":
restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir)
cmd := exec.Command("ssh", sshHost, restartCmd)
out, err := cmd.CombinedOutput()
log.Debugf("Exec output: %v", string(out))
if err != nil {
log.Error("Faile to execute ssh restart omc:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
case "ims":
restartCmd := "sudo ims-stop && sudo ims-start"
cmd := exec.Command("ssh", sshHost, restartCmd)
out, err := cmd.CombinedOutput()
log.Debugf("Exec output: %v", string(out))
if err != nil {
log.Error("Faile to execute ssh sudo systemctl command:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
default:
restartCmd := fmt.Sprintf("sudo systemctl restart %s.service", neTypeLower)
cmd := exec.Command("ssh", sshHost, restartCmd)
out, err := cmd.CombinedOutput()
log.Debugf("Exec output: %v", string(out))
if err != nil {
log.Error("Faile to execute ssh sudo systemctl command:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
}
}
*/
neLicense := dborm.NeLicense{
NeType: neTypeUpper,
NeID: neId,

View File

@@ -10,21 +10,19 @@ import (
"strings"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
tokenConst "ems.agt/src/framework/constants/token"
neService "ems.agt/src/modules/network_element/service"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
tokenConst "be.ems/src/framework/constants/token"
neService "be.ems/src/modules/network_element/service"
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
)
var (
UriParamOmcNeConfig = config.DefaultUriPrefix + "/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig"
UriOmcNeConfig = config.DefaultUriPrefix + "/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig"
// NE CM export/import
NeCmUri = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm"
// NE info
@@ -36,11 +34,9 @@ var (
// nf instance action uri, action: start/stop/restart
UriNeInstance = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}"
CustomUriParamOmcNeConfig = config.UriPrefix + "/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig"
CustomUriOmcNeConfig = config.UriPrefix + "/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig"
CustomNeCmUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm"
CustomUriNeInfo = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo"
CustomUriNeCmFile = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}"
CustomNeCmUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm"
CustomUriNeInfo = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo"
CustomUriNeCmFile = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}"
// service action uri, action: start/stop/restart
CustomUriNeService = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}"
// nf instance action uri, action: start/stop/restart
@@ -170,7 +166,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) {
} else {
hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port)
//hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
apiUri := fmt.Sprintf(UriParamOmcNeConfig, strings.ToLower(neInfo.NeType))
apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", config.DefaultUriPrefix, strings.ToLower(neInfo.NeType))
requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri)
log.Debug("requestURI2NF:", requestURI2NF)
@@ -280,7 +276,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) {
} else {
hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port)
//hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
apiUri := fmt.Sprintf(UriParamOmcNeConfig, neTypeLower)
apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", config.DefaultUriPrefix, neTypeLower)
requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri)
log.Debug("requestURI2NF:", requestURI2NF)
@@ -338,28 +334,6 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) {
}
}
func PutOMCNeConfig(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
neType := vars["elementTypeValue"]
if neType == "" {
log.Error("elementTypeValue is empty")
services.ResponseNotFound404UriNotExist(w, r)
return
}
body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
if err != nil {
log.Error("Failed to io.ReadAll:", err)
services.ResponseNotFound404UriNotExist(w, r)
return
}
neInfo := new(dborm.NeInfo)
_ = json.Unmarshal(body, neInfo)
neInfo.NeType = strings.ToUpper(neType)
services.ResponseStatusOK204NoContent(w)
}
func DeleteNeInfo(w http.ResponseWriter, r *http.Request) {
log.Debug("DeleteNeInfo processing... ")

View File

@@ -1,18 +1,20 @@
package cm
import (
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"strings"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"encoding/json"
"fmt"
"io"
"net/http"
tokenConst "ems.agt/src/framework/constants/token"
tokenConst "be.ems/src/framework/constants/token"
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
)
@@ -163,8 +165,14 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) {
services.ResponseNotFound404UriNotExist(w, r)
return
}
neId := services.GetUriParamString(r, "ne_id", ",", false, false)
// OMC配置接口 /api/rest/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig
if v, ok := vars["paraName"]; ok && v == "omcNeConfig" && strings.ToLower(neType) == "omc" {
PutOMCNeConfig(w, r)
return
}
neId := services.GetUriParamString(r, "ne_id", ",", false, false)
// no, _ := strconv.ParseInt(neId, 10, 64)
neInfo, err := dborm.XormGetNeInfo(neType, neId)
if err != nil {
@@ -199,6 +207,31 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) {
services.ResponseWithJson(w, http.StatusNoContent, response)
}
// PutOMCNeConfig 网元OMC配置
//
// 目前没配置返回204
func PutOMCNeConfig(w http.ResponseWriter, r *http.Request) {
// vars := mux.Vars(r)
// neType := vars["elementTypeValue"]
// if neType == "" {
// log.Error("elementTypeValue is empty")
// services.ResponseNotFound404UriNotExist(w, r)
// return
// }
// body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
// if err != nil {
// log.Error("Failed to io.ReadAll:", err)
// services.ResponseNotFound404UriNotExist(w, r)
// return
// }
// neInfo := new(dborm.NeInfo)
// _ = json.Unmarshal(body, neInfo)
// neInfo.NeType = strings.ToUpper(neType)
services.ResponseStatusOK204NoContent(w)
}
func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) {
log.Debug("DeleteParamConfigToNF processing... ")

View File

@@ -10,11 +10,11 @@ import (
"strconv"
"strings"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/gorilla/mux"
)

View File

@@ -10,11 +10,11 @@ import (
"path/filepath"
"time"
"ems.agt/lib/core/conf"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/core/conf"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
_ "github.com/go-sql-driver/mysql"
)

View File

@@ -9,12 +9,12 @@ import (
"strings"
"time"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/gorilla/mux"
"xorm.io/xorm"

View File

@@ -5,11 +5,11 @@ import (
"io"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
wsService "ems.agt/src/modules/ws/service"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
wsService "be.ems/src/modules/ws/service"
"github.com/gin-gonic/gin"
)

View File

@@ -5,12 +5,12 @@ import (
"net/http"
"path/filepath"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/dborm"
"ems.agt/lib/file"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/dborm"
"be.ems/lib/file"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/gorilla/mux"
"github.com/shirou/gopsutil/disk"
)

View File

@@ -8,7 +8,7 @@ import (
"path/filepath"
"strings"
"ems.agt/lib/file"
"be.ems/lib/file"
"github.com/spf13/afero"
)

View File

@@ -1,88 +0,0 @@
package firewall
import (
"net/http"
"ems.agt/features/firewall/model"
"ems.agt/features/firewall/service"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/services"
"ems.agt/restagent/config"
)
// 防火墙管理接口添加到路由
func Routers() []services.RouterItem {
// 实例化控制层 FirewallApi 结构体
var apis = &FirewallApi{
firewallService: *service.NewServiceFirewall,
}
rs := [...]services.RouterItem{
{
Method: "GET",
Pattern: "/base",
Handler: apis.BaseInfo,
Middleware: nil, //midware.Authorize(nil),
},
{
Method: "POST",
Pattern: "/rule",
Handler: apis.Rule,
Middleware: nil, //midware.Authorize(nil),
},
// 添加更多的 Router 对象...
}
// 生成两组前缀路由
rsPrefix := []services.RouterItem{}
for _, v := range rs {
path := "/firewallManage/{apiVersion}" + v.Pattern
// 固定前缀
v.Pattern = config.DefaultUriPrefix + path
rsPrefix = append(rsPrefix, v)
// 可配置
v.Pattern = config.UriPrefix + path
rsPrefix = append(rsPrefix, v)
}
return rsPrefix
}
// 防火墙管理
//
// PATH /firewallManage
type FirewallApi struct {
firewallService service.ServiceFirewall
}
// 获取防火墙基础信息
//
// GET /base
func (s *FirewallApi) BaseInfo(w http.ResponseWriter, r *http.Request) {
data, err := s.firewallService.LoadBaseInfo()
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
ctx.JSON(w, 200, result.OkData(data))
}
// 获取防火墙规则列表分页
//
// GET /rule
func (s *FirewallApi) Rule(w http.ResponseWriter, r *http.Request) {
var body model.RuleQuerys
err := ctx.ShouldBindJSON(r, &body)
if err != nil || body.Type == "" {
ctx.JSON(w, 400, result.CodeMsg(400, "parameter error"))
return
}
data, err := s.firewallService.RulePage(body)
if err != nil {
ctx.JSON(w, 400, result.ErrMsg(err.Error()))
return
}
ctx.JSON(w, 200, result.OkData(data))
}

View File

@@ -1,13 +0,0 @@
package model
type Firewall struct {
ID int64 `json:"id" xorm:"id"`
CreatedAt int64 `json:"createdAt" xorm:"created_at"`
UpdatedAt int64 `json:"updatedAt" xorm:"updated_at"`
Type string `json:"type" xorm:"type"`
Port string `json:"port" xorm:"port"`
Protocol string `json:"protocol" xorm:"protocol"`
Address string `json:"address" xorm:"address"`
Strategy string `json:"strategy" xorm:"strategy"`
Description string `json:"description" xorm:"description"`
}

View File

@@ -1,64 +0,0 @@
package model
type FirewallBaseInfo struct {
Name string `json:"name"`
Status string `json:"status"`
Version string `json:"version"`
PingStatus string `json:"pingStatus"`
}
type RuleQuerys struct {
PageNum int `json:"pageNum" validate:"required,number"`
PageSize int `json:"pageSize" validate:"required,number"`
Info string `json:"info"`
Status string `json:"status"`
Strategy string `json:"strategy"`
Type string `json:"type" validate:"required"`
}
type FirewallOperation struct {
Operation string `json:"operation" validate:"required,oneof=start stop disablePing enablePing"`
}
type PortRuleOperate struct {
Operation string `json:"operation" validate:"required,oneof=add remove"`
Address string `json:"address"`
Port string `json:"port" validate:"required"`
Protocol string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"`
Strategy string `json:"strategy" validate:"required,oneof=accept drop"`
Description string `json:"description"`
}
type UpdateFirewallDescription struct {
Type string `json:"type"`
Address string `json:"address"`
Port string `json:"port"`
Protocol string `json:"protocol"`
Strategy string `json:"strategy" validate:"required,oneof=accept drop"`
Description string `json:"description"`
}
type AddrRuleOperate struct {
Operation string `json:"operation" validate:"required,oneof=add remove"`
Address string `json:"address" validate:"required"`
Strategy string `json:"strategy" validate:"required,oneof=accept drop"`
Description string `json:"description"`
}
type PortRuleUpdate struct {
OldRule PortRuleOperate `json:"oldRule"`
NewRule PortRuleOperate `json:"newRule"`
}
type AddrRuleUpdate struct {
OldRule AddrRuleOperate `json:"oldRule"`
NewRule AddrRuleOperate `json:"newRule"`
}
type BatchRuleOperate struct {
Type string `json:"type" validate:"required"`
Rules []PortRuleOperate `json:"rules"`
}

View File

@@ -1,133 +0,0 @@
package repo
import (
"strings"
"ems.agt/features/firewall/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/log"
)
// 实例化数据层 RepoFirewall 结构体
var NewRepoFirewall = &RepoFirewall{
selectSql: `select
id, created_at, updated_at, type, port, protocol, address, strategy, description
from monitor_firewall`,
resultMap: map[string]string{
"id": "ID",
"created_at": "CreatedAt",
"updated_at": "UpdatedAt",
"type": "Type",
"port": "Port",
"protocol": "Protocol",
"address": "Address",
"strategy": "Strategy",
"description": "Description",
},
}
// RepoFirewall 防火墙 数据层处理
type RepoFirewall struct {
// 查询视图对象SQL
selectSql string
// 结果字段与实体映射
resultMap map[string]string
}
// convertResultRows 将结果记录转实体结果组
func (r *RepoFirewall) convertResultRows(rows []map[string]any) []model.Firewall {
arr := make([]model.Firewall, 0)
for _, row := range rows {
UdmUser := model.Firewall{}
for key, value := range row {
if keyMapper, ok := r.resultMap[key]; ok {
datasource.SetFieldValue(&UdmUser, keyMapper, value)
}
}
arr = append(arr, UdmUser)
}
return arr
}
// List 根据实体查询
func (r *RepoFirewall) List(f model.Firewall) []model.Firewall {
// 查询条件拼接
var conditions []string
var params []any
if f.Type != "" {
conditions = append(conditions, "type = ?")
params = append(params, f.Type)
}
if f.Protocol != "" {
conditions = append(conditions, "protocol = ?")
params = append(params, f.Protocol)
}
// 构建查询条件语句
whereSql := ""
if len(conditions) > 0 {
whereSql += " where " + strings.Join(conditions, " and ")
}
// 查询数据
querySql := r.selectSql + whereSql
results, err := datasource.RawDB("", querySql, params)
if err != nil {
log.Errorf("query err => %v", err)
}
// 转换实体
return r.convertResultRows(results)
}
// Insert 新增实体
func (r *RepoFirewall) Insert(f model.Firewall) int64 {
results, err := datasource.DefaultDB().Table("monitor_firewall").Insert(f)
if err != nil {
return results
}
return results
}
// Update 修改更新
func (r *RepoFirewall) Update(f model.Firewall) int64 {
// 查询先
var fd model.Firewall
if f.Type == "port" {
has, err := datasource.DefaultDB().Table("monitor_firewall").Where("type = ? AND port = ? AND protocol = ? AND address = ? AND strategy = ?", "port", f.Port, f.Protocol, f.Address, f.Strategy).Get(&fd)
if !has || err != nil {
return 0
}
} else {
has, err := datasource.DefaultDB().Table("monitor_firewall").Where("type = ? AND address = ? AND strategy = ?", "address", f.Address, f.Strategy).Get(&fd)
if !has || err != nil {
return 0
}
}
f.ID = fd.ID
results, err := datasource.DefaultDB().Table("monitor_firewall").Where("id = ?", f.ID).Update(f)
if err != nil {
return 0
}
return results
}
// Delete 删除实体
func (r *RepoFirewall) Delete(id int64) int64 {
results, err := datasource.DefaultDB().Table("u_sub_user").Where("id = ?", id).Delete()
if err != nil {
return results
}
return results
}
// DeleteFirewallRecord 删除实体
func (r *RepoFirewall) DeleteFirewallRecord(fType, port, protocol, address, strategy string) int64 {
results, err := datasource.DefaultDB().Table("u_sub_user").Where("type = ? AND port = ? AND protocol = ? AND address = ? AND strategy = ?", fType, port, protocol, address, strategy).Delete()
if err != nil {
return results
}
return results
}

View File

@@ -1,207 +0,0 @@
package service
import (
"fmt"
"os"
"strconv"
"strings"
"ems.agt/features/firewall/model"
"ems.agt/features/firewall/repo"
"ems.agt/lib/core/cmd"
"ems.agt/lib/core/utils/firewall"
fireClient "ems.agt/lib/core/utils/firewall/client"
"ems.agt/lib/core/utils/scan"
)
// 实例化服务层 ServiceFirewall 结构体
var NewServiceFirewall = &ServiceFirewall{
repoFirewall: *repo.NewRepoFirewall,
}
// ServiceFirewall 防火墙 服务层处理
type ServiceFirewall struct {
repoFirewall repo.RepoFirewall
}
// LoadBaseInfo 获取防火墙基础信息
func (s *ServiceFirewall) LoadBaseInfo() (model.FirewallBaseInfo, error) {
var baseInfo model.FirewallBaseInfo
baseInfo.PingStatus = s.pingStatus()
baseInfo.Status = "not running"
baseInfo.Version = "-"
baseInfo.Name = "-"
client, err := firewall.NewFirewallClient()
if err != nil {
if err.Error() == "no such type" {
return baseInfo, nil
}
return baseInfo, err
}
baseInfo.Name = client.Name()
baseInfo.Status, err = client.Status()
if err != nil {
return baseInfo, err
}
if baseInfo.Status == "not running" {
return baseInfo, err
}
baseInfo.Version, err = client.Version()
if err != nil {
return baseInfo, err
}
return baseInfo, nil
}
// LoadBaseInfo 获取防火墙基础信息
func (s *ServiceFirewall) RulePage(querys model.RuleQuerys) (map[string]any, error) {
var (
datas []fireClient.FireInfo
backDatas []fireClient.FireInfo
)
data := map[string]any{
"total": 0,
"rows": backDatas,
}
client, err := firewall.NewFirewallClient()
if err != nil {
return data, err
}
if querys.Type == "port" {
ports, err := client.ListPort()
if err != nil {
return data, err
}
if len(querys.Info) != 0 {
for _, port := range ports {
if strings.Contains(port.Port, querys.Info) {
datas = append(datas, port)
}
}
} else {
datas = ports
}
} else {
addrs, err := client.ListAddress()
if err != nil {
return data, err
}
if len(querys.Info) != 0 {
for _, addr := range addrs {
if strings.Contains(addr.Address, querys.Info) {
datas = append(datas, addr)
}
}
} else {
datas = addrs
}
}
var datasFilterStatus []fireClient.FireInfo
if len(querys.Status) != 0 {
for _, data := range datas {
portItem, _ := strconv.Atoi(data.Port)
if querys.Status == "free" && !scan.ScanPortWithProto(portItem, data.Protocol) {
datasFilterStatus = append(datasFilterStatus, data)
}
if querys.Status == "used" && scan.ScanPortWithProto(portItem, data.Protocol) {
datasFilterStatus = append(datasFilterStatus, data)
}
}
} else {
datasFilterStatus = datas
}
var datasFilterStrategy []fireClient.FireInfo
if len(querys.Strategy) != 0 {
for _, data := range datasFilterStatus {
if querys.Strategy == data.Strategy {
datasFilterStrategy = append(datasFilterStrategy, data)
}
}
} else {
datasFilterStrategy = datasFilterStatus
}
total, start, end := len(datasFilterStrategy), (querys.PageNum-1)*querys.PageSize, querys.PageNum*querys.PageSize
if start > total {
backDatas = make([]fireClient.FireInfo, 0)
} else {
if end >= total {
end = total
}
backDatas = datasFilterStrategy[start:end]
}
datasFromDB := s.repoFirewall.List(model.Firewall{})
for i := 0; i < len(backDatas); i++ {
for _, des := range datasFromDB {
if querys.Type != des.Type {
continue
}
if backDatas[i].Port == des.Port && querys.Type == "port" &&
backDatas[i].Protocol == des.Protocol &&
backDatas[i].Strategy == des.Strategy &&
backDatas[i].Address == des.Address {
backDatas[i].Description = des.Description
break
}
if querys.Type == "address" && backDatas[i].Strategy == des.Strategy && backDatas[i].Address == des.Address {
backDatas[i].Description = des.Description
break
}
}
}
if querys.Type == "port" {
for i := 0; i < len(backDatas); i++ {
port, _ := strconv.Atoi(backDatas[i].Port)
backDatas[i].IsUsed = scan.ScanPort(port)
if backDatas[i].Protocol == "udp" {
backDatas[i].IsUsed = scan.ScanUDPPort(port)
continue
}
}
}
go s.cleanUnUsedData(client)
return data, nil
}
func (s *ServiceFirewall) pingStatus() string {
if _, err := os.Stat("/etc/sysctl.conf"); err != nil {
return "None"
}
sudo := cmd.SudoHandleCmd()
command := fmt.Sprintf("%s cat /etc/sysctl.conf | grep net/ipv4/icmp_echo_ignore_all= ", sudo)
stdout, _ := cmd.Exec(command)
if stdout == "net/ipv4/icmp_echo_ignore_all=1\n" {
return "Enable"
}
return "Disable"
}
func (s *ServiceFirewall) cleanUnUsedData(client firewall.FirewallClient) {
list, _ := client.ListPort()
addressList, _ := client.ListAddress()
list = append(list, addressList...)
if len(list) == 0 {
return
}
records := s.repoFirewall.List(model.Firewall{})
if len(records) == 0 {
return
}
for _, item := range list {
for i := 0; i < len(records); i++ {
if records[i].Port == item.Port && records[i].Protocol == item.Protocol && records[i].Strategy == item.Strategy && records[i].Address == item.Address {
records = append(records[:i], records[i+1:]...)
}
}
}
for _, record := range records {
_ = s.repoFirewall.Delete(record.ID)
}
}

View File

@@ -10,11 +10,11 @@ import (
"strings"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"xorm.io/xorm"
"github.com/go-resty/resty/v2"
@@ -115,6 +115,27 @@ var (
CustomUriAlarmsFmt = config.UriPrefix + "/faultManagement/v1/elementType/%s/objectType/alarms"
)
var client = resty.New()
func init() {
/*
client.
SetTimeout(10 * time.Second).
SetRetryCount(1).
SetRetryWaitTime(1 * time.Second).
SetRetryMaxWaitTime(2 * time.Second).
SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
return 0, errors.New("quota exceeded")
})
*/
client.
SetTimeout(time.Duration(500 * time.Millisecond))
// SetRetryCount(1).
// SetRetryWaitTime(time.Duration(1 * time.Second)).
// SetRetryMaxWaitTime(time.Duration(2 * time.Second))
//client.SetTimeout(2 * time.Second)
}
var xEngine *xorm.Engine
type DatabaseClient struct {
@@ -439,8 +460,8 @@ func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) {
if err = AlarmEmailForward(&alarmData); err != nil {
log.Error("Failed to AlarmEmailForward:", err)
}
if err = AlarmForwardBySMS(&alarmData); err != nil {
log.Error("Failed to AlarmForwardBySMS:", err)
if err = AlarmForwardBySMSC(&alarmData); err != nil {
log.Error("Failed to AlarmForwardBySMSC:", err)
}
}
}
@@ -482,7 +503,7 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) {
apiUri := fmt.Sprintf(UriAlarmsFmt, strings.ToLower(ne.NeType))
requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri)
log.Debug("requestURI2NF: Get ", requestURI2NF)
client := resty.New()
// client := resty.New()
response, err := client.R().
EnableTrace().
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
@@ -498,7 +519,12 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) {
switch response.StatusCode() {
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
body := response.Body()
log.Debug("Request body:", string(body))
if len(body) == 0 || body == nil {
log.Infof("Empty alarm body from neType=%s, neId=%s", ne.NeType, ne.NeId)
//services.ResponseInternalServerError500ProcessError(w, err)
continue
}
//log.Debug("Request body:", string(body))
err = json.Unmarshal(body, &alarmArray)
if err != nil {
@@ -518,7 +544,7 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) {
continue
}
if alarmArray == nil {
log.Info("Not found sync alarms, neType=%s, neId=%s", ne.NeType, ne.NeId)
log.Infof("Not found sync alarms, neType=%s, neId=%s", ne.NeType, ne.NeId)
//services.ResponseInternalServerError500ProcessError(w, err)
continue
}
@@ -536,7 +562,7 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) {
Where("ne_type=? and ne_id=? and alarm_id=? and alarm_status=1", alarmData.NeType, alarmData.NeId, alarmData.AlarmId).
Exist()
if err == nil || !exist {
log.Info("Not found active alarm: ne_id=%s, alarm_id=%s", alarmData.NeId, alarmData.AlarmId)
log.Infof("Not found active alarm: ne_id=%s, alarm_id=%s", alarmData.NeId, alarmData.AlarmId)
continue
}
alarmData.ClearType = ClearTypeAutoClear
@@ -708,8 +734,8 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) {
if err = AlarmEmailForward(&alarmData); err != nil {
log.Error("Failed to AlarmEmailForward:", err)
}
if err = AlarmForwardBySMS(&alarmData); err != nil {
log.Error("Failed to AlarmForwardBySMS:", err)
if err = AlarmForwardBySMSC(&alarmData); err != nil {
log.Error("Failed to AlarmForwardBySMSC:", err)
}
}
}
@@ -717,5 +743,5 @@ func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) {
}
}
}
services.ResponseStatusOK200Null(w)
services.ResponseStatusOK204NoContent(w)
}

View File

@@ -6,9 +6,9 @@ import (
"fmt"
"strings"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/restagent/config"
"gopkg.in/gomail.v2"
)

View File

@@ -5,10 +5,14 @@ import (
"fmt"
"net/http"
"net/url"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/restagent/config"
"github.com/linxGnu/gosmpp"
"github.com/linxGnu/gosmpp/data"
"github.com/linxGnu/gosmpp/pdu"
)
func AlarmForwardBySMS(alarmData *Alarm) error {
@@ -80,8 +84,8 @@ func AlarmForwardBySMS(alarmData *Alarm) error {
// 解析响应
if resp.StatusCode == http.StatusOK {
log.Info("SMS sent successfully!")
operResult := fmt.Sprintf("SMS sent successfully!")
operResult := "SMS sent successfully!"
log.Info(operResult)
forwardLog.OperResult = operResult
affected, err := dborm.XormInsertAlarmForwardLog(forwardLog)
if err != nil && affected <= 0 {
@@ -101,3 +105,144 @@ func AlarmForwardBySMS(alarmData *Alarm) error {
}
return nil
}
func AlarmForwardBySMPP(alarmData *Alarm) error {
log.Info("AlarmForwardBySMPP processing... ")
auth := gosmpp.Auth{
SMSC: config.GetYamlConfig().Alarm.SMSC.Addr,
SystemID: config.GetYamlConfig().Alarm.SMSC.UserName,
Password: config.GetYamlConfig().Alarm.SMSC.Password,
SystemType: "",
}
// conn, err := gosmpp.NonTLSDialer(auth.SMSC)
// connection := gosmpp.NewConnection(conn)
trans, err := gosmpp.NewSession(
gosmpp.TXConnector(gosmpp.NonTLSDialer, auth),
gosmpp.Settings{
ReadTimeout: 2 * time.Second,
OnPDU: func(p pdu.PDU, _ bool) {
log.Debug("%+v", p)
},
OnSubmitError: func(_ pdu.PDU, err error) {
log.Error(err)
},
OnRebindingError: func(err error) {
log.Error(err)
},
OnClosed: func(state gosmpp.State) {
log.Error(state)
},
}, -1)
if err != nil {
log.Error(err)
return err
}
defer func() {
_ = trans.Close()
}()
toUsers, err := dborm.XormGetAlarmForward("SMS")
if err != nil {
log.Error("Failed to XormGetAlarmForward:", err)
return err
} else if toUsers == nil {
err := errors.New("not found forward phone number")
log.Error(err)
return err
}
// sending SMS(s)
for _, toUser := range *toUsers {
forwardLog := &dborm.AlarmForwardLog{
NeType: alarmData.NeType,
NeID: alarmData.NeId,
AlarmID: alarmData.AlarmId,
AlarmTitle: alarmData.AlarmTitle,
AlarmSeq: alarmData.AlarmSeq,
EventTime: alarmData.EventTime,
ToUser: toUser,
}
message := alarmData.AlarmTitle + "from" + alarmData.NeType + alarmData.NeId + "at" + alarmData.EventTime
if err = trans.Transceiver().Submit(newSubmitSM(toUser, message)); err != nil {
operResult := fmt.Sprintf("Failed to submit short message:%v", err)
log.Error(operResult)
forwardLog.OperResult = operResult
} else {
operResult := "SMS sent successfully!"
log.Trace(operResult)
forwardLog.OperResult = operResult
}
affected, err := dborm.XormInsertAlarmForwardLog(forwardLog)
if err != nil && affected <= 0 {
log.Error("Failed to insert data:", err)
continue
}
}
return nil
}
func handlePDU() func(pdu.PDU) (pdu.PDU, bool) {
return func(p pdu.PDU) (pdu.PDU, bool) {
switch pd := p.(type) {
case *pdu.Unbind:
log.Trace("Unbind Received")
return pd.GetResponse(), true
case *pdu.UnbindResp:
log.Trace("UnbindResp Received")
case *pdu.SubmitSMResp:
log.Trace("SubmitSMResp Received")
case *pdu.GenericNack:
log.Trace("GenericNack Received")
case *pdu.EnquireLinkResp:
fmt.Println("EnquireLinkResp Received")
case *pdu.EnquireLink:
log.Trace("EnquireLink Received")
return pd.GetResponse(), false
case *pdu.DataSM:
log.Trace("DataSM receiver")
return pd.GetResponse(), false
case *pdu.DeliverSM:
log.Trace("DeliverSM receiver")
return pd.GetResponse(), false
}
return nil, false
}
}
func newSubmitSM(phoneNumber string, message string) *pdu.SubmitSM {
// build up submitSM
srcAddr := pdu.NewAddress()
srcAddr.SetTon(5)
srcAddr.SetNpi(0)
_ = srcAddr.SetAddress("alarm notification:")
destAddr := pdu.NewAddress()
destAddr.SetTon(1)
destAddr.SetNpi(1)
_ = destAddr.SetAddress(phoneNumber)
submitSM := pdu.NewSubmitSM().(*pdu.SubmitSM)
submitSM.SourceAddr = srcAddr
submitSM.DestAddr = destAddr
_ = submitSM.Message.SetMessageWithEncoding(message, data.UCS2)
submitSM.ProtocolID = 0
submitSM.RegisteredDelivery = 1
submitSM.ReplaceIfPresentFlag = 0
submitSM.EsmClass = 0
return submitSM
}

60
features/fm/ucpcli.go Normal file
View File

@@ -0,0 +1,60 @@
package fm
import (
"fmt"
"strings"
"be.ems/lib/log"
"be.ems/restagent/config"
"github.com/chzyer/readline"
"github.com/go-gsm/ucp"
)
func AlarmForwardBySMSC(alarmData *Alarm) error {
opt := &ucp.Options{
Addr: config.GetYamlConfig().Alarm.SMSC.Addr,
User: config.GetYamlConfig().Alarm.SMSC.UserName,
Password: config.GetYamlConfig().Alarm.SMSC.Password,
AccessCode: "",
}
client := ucp.New(opt)
if err := client.Connect(); err != nil {
log.Error("Failed to connect:", err)
return err
}
defer client.Close()
reader, _ := readline.New(">>> ")
defer reader.Close()
for {
fmt.Print(">>> ")
lines, _ := reader.Readline()
fields := strings.Fields(lines)
if len(fields) == 1 {
// exit CLI
if fields[0] == "exit" {
return nil
}
// display help message
if fields[0] == "help" {
log.Trace("\n\tSend a 'message' to 'receiver' with a 'sender' mask\n\t>>> sender receiver message\n\n\tExit the cli\n\t>>> exit\n")
}
}
// sender receiver message...
if len(fields) >= 3 {
sender := fields[0]
receiver := fields[1]
message := strings.Join(fields[2:], " ")
ids, err := client.Send(sender, receiver, message)
if err != nil {
log.Error(err)
} else {
log.Debug("%v", ids)
}
}
}
}

View File

@@ -8,17 +8,17 @@ import (
"strconv"
"strings"
"ems.agt/lib/dborm"
"be.ems/lib/dborm"
"github.com/gorilla/mux"
g "github.com/gosnmp/gosnmp"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/oauth"
"ems.agt/lib/services"
"ems.agt/lib/session"
"ems.agt/restagent/config"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/oauth"
"be.ems/lib/services"
"be.ems/lib/session"
"be.ems/restagent/config"
)
var TodoList []stTodo

View File

@@ -6,10 +6,10 @@ import (
"os/exec"
"time"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/gorilla/mux"
"xorm.io/xorm"

View File

@@ -10,11 +10,11 @@ import (
"runtime"
"time"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/mem"

View File

@@ -10,20 +10,21 @@ import (
"strings"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/mmlp"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/mmlp"
"be.ems/lib/services"
"be.ems/restagent/config"
tokenConst "ems.agt/src/framework/constants/token"
tokenConst "be.ems/src/framework/constants/token"
"github.com/gorilla/mux"
)
// const (
// //经过测试linux下延时需要大于100ms
// TIME_DELAY_AFTER_WRITE = 200
// TIME_DEAD_LINE = 10
// )
type Response struct {
@@ -37,25 +38,150 @@ type MMLRequest struct {
var (
// MML interface
UriMML = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml"
UriMML2 = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2"
UriMMLDiscard = config.DefaultUriPrefix + "/opeartionManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml"
UriNeOmMml = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}"
UriOmMmlExt = config.DefaultUriPrefix + "/{managedType}/{apiVersion}/elementType/OMC/objectType/mml"
UriOmMmlInt = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}"
CustomUriMML = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml"
CustomUriMML2 = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2"
CustomUriNeOmMml = config.UriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}"
CustomUriOmMmlExt = config.UriPrefix + "/opeartionManagement/{apiVersion}/elementType/OMC/objectType/mml"
CustomUriOmMmlInt = config.UriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}"
)
// func init() {
// if config.GetYamlConfig().MML.Sleep != 0 {
// TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep)
// }
// if config.GetYamlConfig().MML.DeadLine != 0 {
// TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine)
// }
// }
var TIME_DELAY_AFTER_WRITE time.Duration = 200
var TIME_DEAD_LINE time.Duration = 10
func init() {
if config.GetYamlConfig().MML.Sleep != 0 {
TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep)
}
if config.GetYamlConfig().MML.DeadLine != 0 {
TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine)
}
}
func PostMML2ToNF(w http.ResponseWriter, r *http.Request) {
log.Info("PostMML2ToNF processing... ")
vars := mux.Vars(r)
neType := vars["elementTypeValue"]
neInfo := new(dborm.NeInfo)
params := r.URL.Query()
neId := params["ne_id"]
neInfo, err := dborm.XormGetNeInfo(neType, neId[0])
if err != nil {
log.Error("Failed to dborm.XormGetNeInfo:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
var buf [20 * 1024]byte
//buf := make([]byte, 0)
var n int
var mmlResult []string
port2 := 5002
if config.GetYamlConfig().MML.Port2 != 0 {
port2 = config.GetYamlConfig().MML.Port2
}
if neInfo != nil {
hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, port2)
conn, err := net.Dial("tcp", hostMML)
if err != nil {
errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err)
log.Error(errMsg)
mmlResult = append(mmlResult, errMsg)
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
}
defer conn.Close()
// localAddr := conn.LocalAddr()
// remoteAddr := conn.RemoteAddr()
// if localAddr == nil || remoteAddr == nil {
// errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr)
// log.Error(errMsg)
// mmlResult = append(mmlResult, errMsg)
// response := Response{mmlResult}
// services.ResponseWithJson(w, http.StatusOK, response)
// return
// }
conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second))
loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password)
_, err = conn.Write([]byte(loginStr))
if err != nil {
log.Error("Failed to write:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
n, err = conn.Read(buf[0:])
if err != nil {
log.Error("Failed to read:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
}
log.Trace(string(buf[0:n]))
body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
if err != nil {
log.Error("Failed to ReadAll:", err)
services.ResponseNotFound404UriNotExist(w, r)
return
}
log.Trace("Body:", string(body))
mmlRequest := new(MMLRequest)
_ = json.Unmarshal(body, mmlRequest)
for _, mml := range mmlRequest.MML {
mmlCommand := fmt.Sprintf("%s\n", mml)
_, err = conn.Write([]byte(mmlCommand))
if err != nil {
log.Error("Failed to write:", err)
mmlResult = append(mmlResult, err.Error())
// response := Response{mmlResult}
// services.ResponseWithJson(w, http.StatusOK, response)
// return
continue
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
n, err = conn.Read(buf[0:])
if err != nil {
log.Error("Failed to read:", err)
mmlResult = append(mmlResult, err.Error())
// response := Response{mmlResult}
// services.ResponseWithJson(w, http.StatusOK, response)
// return
continue
}
log.Trace(string(buf[0 : n-len(neType)-2]))
re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符
//re2 := regexp.MustCompile(`\x00`) // 匹配空字符
re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符
//re := regexp.MustCompile(`[\x00-\x1F\x7F]`)
result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "")
result = re2.ReplaceAllString(result, "")
mmlResult = append(mmlResult, result)
}
}
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
}
func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
log.Debug("PostMMLToNF processing... ")
@@ -66,14 +192,14 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
return
}
// 经过测试linux下延时需要大于100ms
var TIME_DELAY_AFTER_WRITE time.Duration = 200
var TIME_DEAD_LINE time.Duration = 10
if config.GetYamlConfig().MML.Sleep != 0 {
TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep)
}
if config.GetYamlConfig().MML.DeadLine != 0 {
TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine)
}
// var TIME_DELAY_AFTER_WRITE time.Duration = 200
// var TIME_DEAD_LINE time.Duration = 10
// if config.GetYamlConfig().MML.Sleep != 0 {
// TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep)
// }
// if config.GetYamlConfig().MML.DeadLine != 0 {
// TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine)
// }
pack := "mml"
vars := mux.Vars(r)
@@ -242,9 +368,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Error("Failed to write:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
//response := Response{mmlResult}
//services.ResponseWithJson(w, http.StatusOK, response)
//return
continue
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
mmlCommand := fmt.Sprintf("%s\n", mml)
@@ -253,9 +380,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Error("Failed to write:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
//response := Response{mmlResult}
//services.ResponseWithJson(w, http.StatusOK, response)
//return
continue
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
@@ -263,9 +391,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Error("Failed to read:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
//response := Response{mmlResult}
//services.ResponseWithJson(w, http.StatusOK, response)
//return
continue
}
log.Trace(string(buf[0 : n-len(neType)-2]))
@@ -327,7 +456,7 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
services.ResponseWithJson(w, http.StatusOK, response)
return
}
log.Debug(string(buf[0:n]))
log.Trace(string(buf[0:n]))
_, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n"))
if err != nil {
@@ -377,9 +506,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Error("Failed to write:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
// response := Response{mmlResult}
// services.ResponseWithJson(w, http.StatusOK, response)
// return
continue
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
@@ -387,9 +517,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Error("Failed to read:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
// response := Response{mmlResult}
// services.ResponseWithJson(w, http.StatusOK, response)
// return
continue
}
log.Trace(string(buf[0 : n-len(neType)-2]))
@@ -397,7 +528,6 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
//re2 := regexp.MustCompile(`\x00`) // 匹配空字符
re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符
//re := regexp.MustCompile(`[\x00-\x1F\x7F]`)
// upf telnet buffer只能读取一次需要去掉前面的多余字符
result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "")
result = re2.ReplaceAllString(result, "")
mmlResult = append(mmlResult, result)
@@ -466,9 +596,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Error("Failed to write:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
// response := Response{mmlResult}
// services.ResponseWithJson(w, http.StatusOK, response)
// return
continue
}
time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
@@ -476,9 +607,10 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Error("Failed to read:", err)
mmlResult = append(mmlResult, err.Error())
response := Response{mmlResult}
services.ResponseWithJson(w, http.StatusOK, response)
return
// response := Response{mmlResult}
// services.ResponseWithJson(w, http.StatusOK, response)
// return
continue
}
log.Trace(string(buf[0 : n-len(neType)-2]))
re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符
@@ -533,7 +665,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) {
hostUri := fmt.Sprintf("http://%s:%s", neInfo.Ip, neInfo.Port)
omcMmlVar := &mmlp.MmlVar{
Version: "16.1.1",
Version: global.Version,
Output: mmlp.DefaultFormatType,
MmlHome: config.GetYamlConfig().MML.MmlHome,
Limit: 50,

View File

@@ -6,10 +6,10 @@ import (
"strings"
"time"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/dborm"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/dborm"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/net"
)

View File

@@ -6,9 +6,9 @@ import (
"strconv"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/restagent/config"
"github.com/robfig/cron/v3"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"

View File

@@ -6,11 +6,11 @@ import (
"net/http"
"time"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/lib/wsinfo"
"ems.agt/restagent/config"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/lib/wsinfo"
"be.ems/restagent/config"
"github.com/gorilla/websocket"
"github.com/shirou/gopsutil/process"
)

View File

@@ -6,17 +6,17 @@ import (
"net/http"
"strings"
"ems.agt/lib/dborm"
"be.ems/lib/dborm"
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/oauth"
"ems.agt/lib/services"
"ems.agt/lib/session"
"ems.agt/restagent/config"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/oauth"
"be.ems/lib/services"
"be.ems/lib/session"
"be.ems/restagent/config"
)
type ErrorOAuthResponse struct {

View File

@@ -9,9 +9,9 @@ import (
"github.com/gorilla/mux"
g "github.com/gosnmp/gosnmp"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
)
func init() {

View File

@@ -10,14 +10,14 @@ import (
"strconv"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
"xorm.io/xorm"
wsService "ems.agt/src/modules/ws/service"
wsService "be.ems/src/modules/ws/service"
"github.com/go-resty/resty/v2"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"

View File

@@ -10,21 +10,21 @@ import (
"strings"
"time"
"ems.agt/features/security/service"
sysConfigService "ems.agt/features/sys_config/service"
"ems.agt/lib/core/account"
"ems.agt/lib/core/cache"
"ems.agt/lib/core/constants/cachekey"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/oauth"
"ems.agt/lib/services"
"ems.agt/restagent/config"
srcConfig "ems.agt/src/framework/config"
"ems.agt/src/framework/redis"
"be.ems/features/security/service"
sysConfigService "be.ems/features/sys_config/service"
"be.ems/lib/core/account"
"be.ems/lib/core/cache"
"be.ems/lib/core/constants/cachekey"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/vo/result"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/oauth"
"be.ems/lib/services"
"be.ems/restagent/config"
srcConfig "be.ems/src/framework/config"
"be.ems/src/framework/redis"
"github.com/mojocn/base64Captcha"
)

View File

@@ -1,11 +1,11 @@
package service
import (
menuService "ems.agt/features/sys_menu/service"
roleService "ems.agt/features/sys_role/service"
userService "ems.agt/features/sys_user/service"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/core/vo"
menuService "be.ems/features/sys_menu/service"
roleService "be.ems/features/sys_role/service"
userService "be.ems/features/sys_user/service"
"be.ems/lib/core/utils/parse"
"be.ems/lib/core/vo"
)
// 实例化服务层 ServiceAccount 结构体

View File

@@ -8,9 +8,9 @@ import (
"os/exec"
"time"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
_ "github.com/go-sql-driver/mysql"
)

View File

@@ -14,12 +14,12 @@ import (
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
tokenConst "ems.agt/src/framework/constants/token"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
tokenConst "be.ems/src/framework/constants/token"
)
type CpuUsage struct {
@@ -756,6 +756,8 @@ func GetStateFromNF(w http.ResponseWriter, r *http.Request) {
result["ipAddress"] = ne.Ip
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
//SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(requestURI2NF)

View File

@@ -11,7 +11,7 @@ import (
"syscall"
"time"
"ems.agt/lib/log"
"be.ems/lib/log"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/mem"

View File

@@ -1,7 +1,7 @@
package state
import (
"ems.agt/lib/log"
"be.ems/lib/log"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/host"

View File

@@ -5,14 +5,14 @@ import (
"net/http"
"strings"
"ems.agt/features/sys_config/model"
"ems.agt/features/sys_config/service"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/midware"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/features/sys_config/model"
"be.ems/features/sys_config/service"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/utils/parse"
"be.ems/lib/core/vo/result"
"be.ems/lib/midware"
"be.ems/lib/services"
"be.ems/restagent/config"
)
// 参数配置信息接口添加到路由

View File

@@ -5,11 +5,11 @@ import (
"strings"
"time"
"ems.agt/features/sys_config/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/date"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/features/sys_config/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/date"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoSysConfig 结构体
@@ -181,11 +181,7 @@ func (r *RepoSysConfig) SelectConfigValueByKey(configKey string) string {
return ""
}
if len(results) > 0 {
v, ok := results[0]["str"].(string)
if ok {
return v
}
return ""
return fmt.Sprint(results[0]["str"])
}
return ""
}
@@ -230,11 +226,7 @@ func (r *RepoSysConfig) CheckUniqueConfig(sysConfig model.SysConfig) string {
return ""
}
if len(results) > 0 {
v, ok := results[0]["str"].(string)
if ok {
return v
}
return ""
return fmt.Sprint(results[0]["str"])
}
return ""
}

View File

@@ -3,9 +3,9 @@ package service
import (
"errors"
"ems.agt/features/sys_config/model"
"ems.agt/lib/core/cache"
"ems.agt/lib/core/constants/cachekey"
"be.ems/features/sys_config/model"
"be.ems/lib/core/cache"
"be.ems/lib/core/constants/cachekey"
)
// 实例化服务层 ServiceSysConfig 结构体

View File

@@ -5,15 +5,15 @@ import (
"net/http"
"strings"
"ems.agt/features/sys_dict_data/model"
sysDictDataService "ems.agt/features/sys_dict_data/service"
sysDictTypeService "ems.agt/features/sys_dict_type/service"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/midware"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/features/sys_dict_data/model"
sysDictDataService "be.ems/features/sys_dict_data/service"
sysDictTypeService "be.ems/features/sys_dict_type/service"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/utils/parse"
"be.ems/lib/core/vo/result"
"be.ems/lib/midware"
"be.ems/lib/services"
"be.ems/restagent/config"
)
// 字典类型对应的字典数据信息接口添加到路由

View File

@@ -5,10 +5,10 @@ import (
"strings"
"time"
"ems.agt/features/sys_dict_data/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/features/sys_dict_data/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoSysDictData 结构体
@@ -215,11 +215,7 @@ func (r *RepoSysDictData) CheckUniqueDictData(sysDictData model.SysDictData) str
return ""
}
if len(results) > 0 {
v, ok := results[0]["str"].(string)
if ok {
return v
}
return ""
return fmt.Sprint(results[0]["str"])
}
return ""
}

View File

@@ -3,9 +3,9 @@ package service
import (
"errors"
"ems.agt/features/sys_dict_data/model"
"ems.agt/features/sys_dict_data/repo"
sysDictTypeService "ems.agt/features/sys_dict_type/service"
"be.ems/features/sys_dict_data/model"
"be.ems/features/sys_dict_data/repo"
sysDictTypeService "be.ems/features/sys_dict_type/service"
)
// 实例化服务层 ServiceSysDictData 结构体

View File

@@ -5,14 +5,14 @@ import (
"net/http"
"strings"
"ems.agt/features/sys_dict_type/model"
sysDictTypeService "ems.agt/features/sys_dict_type/service"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/midware"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/features/sys_dict_type/model"
sysDictTypeService "be.ems/features/sys_dict_type/service"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/utils/parse"
"be.ems/lib/core/vo/result"
"be.ems/lib/midware"
"be.ems/lib/services"
"be.ems/restagent/config"
)
// 字典类型信息接口添加到路由

View File

@@ -5,11 +5,11 @@ import (
"strings"
"time"
"ems.agt/features/sys_dict_type/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/date"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/features/sys_dict_type/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/date"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoSysDictType 结构体
@@ -227,11 +227,7 @@ func (r *RepoSysDictType) CheckUniqueDictType(sysDictType model.SysDictType) str
return ""
}
if len(results) > 0 {
v, ok := results[0]["str"].(string)
if ok {
return v
}
return ""
return fmt.Sprint(results[0]["str"])
}
return ""
}

View File

@@ -5,12 +5,12 @@ import (
"errors"
"fmt"
sysDictDataModel "ems.agt/features/sys_dict_data/model"
sysDictDataRepo "ems.agt/features/sys_dict_data/repo"
sysDictTypeModel "ems.agt/features/sys_dict_type/model"
"ems.agt/features/sys_dict_type/repo"
"ems.agt/lib/core/cache"
"ems.agt/lib/core/constants/cachekey"
sysDictDataModel "be.ems/features/sys_dict_data/model"
sysDictDataRepo "be.ems/features/sys_dict_data/repo"
sysDictTypeModel "be.ems/features/sys_dict_type/model"
"be.ems/features/sys_dict_type/repo"
"be.ems/lib/core/cache"
"be.ems/lib/core/constants/cachekey"
)
// 实例化服务层 ServiceSysDictType 结构体

View File

@@ -4,16 +4,16 @@ import (
"fmt"
"net/http"
"ems.agt/features/sys_menu/consts"
"ems.agt/features/sys_menu/model"
"ems.agt/features/sys_menu/service"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/utils/regular"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/midware"
"ems.agt/lib/services"
"ems.agt/restagent/config"
srcConfig "ems.agt/src/framework/config"
"be.ems/features/sys_menu/consts"
"be.ems/features/sys_menu/model"
"be.ems/features/sys_menu/service"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/utils/regular"
"be.ems/lib/core/vo/result"
"be.ems/lib/midware"
"be.ems/lib/services"
"be.ems/restagent/config"
srcConfig "be.ems/src/framework/config"
)
// 菜单接口添加到路由

View File

@@ -5,11 +5,11 @@ import (
"strings"
"time"
"ems.agt/features/sys_menu/consts"
"ems.agt/features/sys_menu/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/features/sys_menu/consts"
"be.ems/features/sys_menu/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoSysMenu 结构体
@@ -469,11 +469,7 @@ func (r *RepoSysMenu) CheckUniqueMenu(sysMenu model.SysMenu) string {
return ""
}
if len(results) > 0 {
v, ok := results[0]["str"].(string)
if ok {
return v
}
return ""
return fmt.Sprint(results[0]["str"])
}
return ""
}

View File

@@ -4,13 +4,13 @@ import (
"encoding/base64"
"strings"
"ems.agt/features/sys_menu/consts"
"ems.agt/features/sys_menu/model"
sysRoleService "ems.agt/features/sys_role/service"
sysrolemenu "ems.agt/features/sys_role_menu"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/core/utils/regular"
"ems.agt/lib/core/vo"
"be.ems/features/sys_menu/consts"
"be.ems/features/sys_menu/model"
sysRoleService "be.ems/features/sys_role/service"
sysrolemenu "be.ems/features/sys_role_menu"
"be.ems/lib/core/utils/parse"
"be.ems/lib/core/utils/regular"
"be.ems/lib/core/vo"
)
// 实例化服务层 ServiceSysMenu 结构体

View File

@@ -5,15 +5,15 @@ import (
"net/http"
"strings"
"ems.agt/features/sys_role/model"
"ems.agt/features/sys_role/service"
userService "ems.agt/features/sys_user/service"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/midware"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/features/sys_role/model"
"be.ems/features/sys_role/service"
userService "be.ems/features/sys_user/service"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/utils/parse"
"be.ems/lib/core/vo/result"
"be.ems/lib/midware"
"be.ems/lib/services"
"be.ems/restagent/config"
)
// 角色接口添加到路由

View File

@@ -5,11 +5,11 @@ import (
"strings"
"time"
"ems.agt/features/sys_role/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/date"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/features/sys_role/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/date"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoSysRole 结构体
@@ -356,11 +356,7 @@ func (r *RepoSysRole) CheckUniqueRole(sysRole model.SysRole) string {
return ""
}
if len(results) > 0 {
v, ok := results[0]["str"].(string)
if ok {
return v
}
return ""
return fmt.Sprint(results[0]["str"])
}
return ""
}

View File

@@ -4,9 +4,9 @@ import (
"errors"
"fmt"
"ems.agt/features/sys_role/model"
sysrolemenu "ems.agt/features/sys_role_menu"
sysuserrole "ems.agt/features/sys_user_role"
"be.ems/features/sys_role/model"
sysrolemenu "be.ems/features/sys_role_menu"
sysuserrole "be.ems/features/sys_user_role"
)
// 实例化服务层 ServiceSysRole 结构体

View File

@@ -4,9 +4,9 @@ import (
"fmt"
"strings"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoSysRoleMenu 结构体

View File

@@ -5,17 +5,17 @@ import (
"net/http"
"strings"
sysRoleModel "ems.agt/features/sys_role/model"
sysRoleService "ems.agt/features/sys_role/service"
sysUserModel "ems.agt/features/sys_user/model"
"ems.agt/features/sys_user/service"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/midware"
"ems.agt/lib/services"
"ems.agt/restagent/config"
srcConfig "ems.agt/src/framework/config"
sysRoleModel "be.ems/features/sys_role/model"
sysRoleService "be.ems/features/sys_role/service"
sysUserModel "be.ems/features/sys_user/model"
"be.ems/features/sys_user/service"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/utils/parse"
"be.ems/lib/core/vo/result"
"be.ems/lib/midware"
"be.ems/lib/services"
"be.ems/restagent/config"
srcConfig "be.ems/src/framework/config"
)
// 用户接口添加到路由

View File

@@ -1,6 +1,6 @@
package model
import "ems.agt/features/sys_role/model"
import "be.ems/features/sys_role/model"
type SysUser struct {
Id string `json:"id" xorm:"pk 'id' autoincr"`

View File

@@ -5,13 +5,13 @@ import (
"strings"
"time"
sysRoleModel "ems.agt/features/sys_role/model"
sysUserModel "ems.agt/features/sys_user/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/date"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"ems.agt/src/framework/utils/crypto"
sysRoleModel "be.ems/features/sys_role/model"
sysUserModel "be.ems/features/sys_user/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/date"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
"be.ems/src/framework/utils/crypto"
)
// 实例化数据层 RepoSysUser 结构体
@@ -572,11 +572,7 @@ func (r *RepoSysUser) CheckUniqueUser(sysUser sysUserModel.SysUser) string {
log.Errorf("query err %v", err)
}
if len(results) > 0 {
v, ok := results[0]["str"].(string)
if ok {
return v
}
return ""
return fmt.Sprint(results[0]["str"])
}
return ""
}

View File

@@ -4,8 +4,8 @@ import (
"errors"
"fmt"
sysUserModel "ems.agt/features/sys_user/model"
sysuserrole "ems.agt/features/sys_user_role"
sysUserModel "be.ems/features/sys_user/model"
sysuserrole "be.ems/features/sys_user_role"
)
// 实例化服务层 ServiceSysUser 结构体

View File

@@ -4,9 +4,9 @@ import (
"fmt"
"strings"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoSysUserRole 结构体

View File

@@ -7,14 +7,14 @@ import (
"strings"
"time"
"ems.agt/lib/core/conf"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/restagent/config"
"ems.agt/src/framework/cmd"
"ems.agt/src/framework/utils/ssh"
"be.ems/lib/core/conf"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/vo/result"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/restagent/config"
"be.ems/src/framework/utils/cmd"
"be.ems/src/framework/utils/ssh"
)
var (

View File

@@ -12,12 +12,12 @@ import (
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/run"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/run"
"be.ems/lib/services"
"be.ems/restagent/config"
)
var (

View File

@@ -7,20 +7,20 @@ import (
"strings"
"time"
"ems.agt/features/udm_user/model"
"ems.agt/features/udm_user/service"
"ems.agt/lib/core/conf"
mmlclient "ems.agt/lib/core/mml_client"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/lib/midware"
"ems.agt/lib/services"
"ems.agt/restagent/config"
"ems.agt/src/framework/middleware/collectlogs"
"ems.agt/src/framework/utils/file"
"ems.agt/src/framework/utils/ssh"
"be.ems/features/udm_user/model"
"be.ems/features/udm_user/service"
"be.ems/lib/core/conf"
mmlclient "be.ems/lib/core/mml_client"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/core/vo/result"
"be.ems/lib/dborm"
"be.ems/lib/log"
"be.ems/lib/midware"
"be.ems/lib/services"
"be.ems/restagent/config"
"be.ems/src/framework/middleware/collectlogs"
"be.ems/src/framework/utils/file"
"be.ems/src/framework/utils/ssh"
)
// UDM 用户信息接口添加到路由
@@ -516,7 +516,7 @@ func (s *UdmUserApi) UdmAuthUserExport(w http.ResponseWriter, r *http.Request) {
data = append(data, []string{v.Imsi, v.Ki, v.AlgoIndex, v.Amf, v.Opc})
}
// 输出到文件
err := file.WriterCSVFile(data, filePath)
err := file.WriterFileCSV(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
@@ -530,7 +530,7 @@ func (s *UdmUserApi) UdmAuthUserExport(w http.ResponseWriter, r *http.Request) {
data = append(data, []string{v.Imsi, v.Ki, v.AlgoIndex, v.Amf, v.Opc})
}
// 输出到文件
err = file.WriterTxtFile(data, filePath)
err = file.WriterFileTXT(data, ",", filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
@@ -597,12 +597,12 @@ func (s *UdmUserApi) UdmAuthUserImport(w http.ResponseWriter, r *http.Request) {
// 命令ok时
if strings.Contains(data, "ok") {
if strings.HasSuffix(fileHeader.Filename, ".csv") {
data := file.ReadCSVFile(localPath)
data := file.ReadFileCSV(localPath)
neId = ""
go s.authUser.InsertCSV(neId, data)
}
if strings.HasSuffix(fileHeader.Filename, ".txt") {
data := file.ReadTxtFile(localPath)
data := file.ReadFileTXT(",", localPath)
neId = ""
go s.authUser.InsertTxt(neId, data)
}
@@ -1116,7 +1116,7 @@ func (s *UdmUserApi) UdmSubUserExport(w http.ResponseWriter, r *http.Request) {
data = append(data, []string{v.Imsi, v.Msisdn, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat})
}
// 输出到文件
err = file.WriterCSVFile(data, filePath)
err = file.WriterFileCSV(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
@@ -1131,7 +1131,7 @@ func (s *UdmUserApi) UdmSubUserExport(w http.ResponseWriter, r *http.Request) {
data = append(data, []string{v.Imsi, v.Msisdn, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat})
}
// 输出到文件
err = file.WriterTxtFile(data, filePath)
err = file.WriterFileTXT(data, ",", filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
@@ -1197,12 +1197,12 @@ func (s *UdmUserApi) UdmSubUserImport(w http.ResponseWriter, r *http.Request) {
// 命令ok时
if strings.Contains(data, "ok") {
if strings.HasSuffix(fileHeader.Filename, ".csv") {
data := file.ReadCSVFile(localPath)
data := file.ReadFileCSV(localPath)
neId = ""
go s.subUser.InsertCSV(neId, data)
}
if strings.HasSuffix(fileHeader.Filename, ".txt") {
data := file.ReadTxtFile(localPath)
data := file.ReadFileTXT(",", localPath)
neId = ""
go s.subUser.InsertTxt(neId, data)
}

View File

@@ -4,10 +4,10 @@ import (
"strconv"
"strings"
"ems.agt/features/udm_user/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/features/udm_user/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoUdmAuthUser 结构体

View File

@@ -5,10 +5,10 @@ import (
"strconv"
"strings"
"ems.agt/features/udm_user/model"
"ems.agt/lib/core/datasource"
"ems.agt/lib/core/utils/parse"
"ems.agt/lib/log"
"be.ems/features/udm_user/model"
"be.ems/lib/core/datasource"
"be.ems/lib/core/utils/parse"
"be.ems/lib/log"
)
// 实例化数据层 RepoUdmSubUser 结构体

View File

@@ -3,8 +3,8 @@ package service
import (
"strings"
"ems.agt/features/udm_user/model"
"ems.agt/src/framework/redis"
"be.ems/features/udm_user/model"
"be.ems/src/framework/redis"
)
// phoneImsiList 获取所有imsi

View File

@@ -4,8 +4,8 @@ import (
"fmt"
"strconv"
"ems.agt/features/udm_user/model"
"ems.agt/features/udm_user/repo"
"be.ems/features/udm_user/model"
"be.ems/features/udm_user/repo"
)
// 实例化服务层 ServiceUdmAuthUser 结构体

View File

@@ -5,8 +5,8 @@ import (
"strconv"
"strings"
"ems.agt/features/udm_user/model"
"ems.agt/features/udm_user/repo"
"be.ems/features/udm_user/model"
"be.ems/features/udm_user/repo"
)
// 实例化服务层 ServiceUdmSubUser 结构体

View File

@@ -8,12 +8,12 @@ import (
"strings"
"time"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
tokenConst "ems.agt/src/framework/constants/token"
"be.ems/lib/dborm"
"be.ems/lib/global"
"be.ems/lib/log"
"be.ems/lib/services"
"be.ems/restagent/config"
tokenConst "be.ems/src/framework/constants/token"
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
)
@@ -354,6 +354,7 @@ func PostPCFUserInfo(w http.ResponseWriter, r *http.Request) {
services.ResponseNotFound404UriNotExist(w, r)
return
}
client.SetTimeout(1 * time.Minute)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
@@ -426,6 +427,7 @@ func PutPCFUserInfo(w http.ResponseWriter, r *http.Request) {
services.ResponseNotFound404UriNotExist(w, r)
return
}
client.SetTimeout(1 * time.Minute)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
@@ -504,9 +506,11 @@ func DeletePCFUserInfo(w http.ResponseWriter, r *http.Request) {
services.ResponseInternalServerError500ProcessError(w, err)
return
} else {
var response services.MapResponse
_ = json.Unmarshal(resp.Body(), &response)
services.ResponseWithJson(w, resp.StatusCode(), response)
w.WriteHeader(resp.StatusCode())
w.Write(resp.Body())
// var response services.MapResponse
// _ = json.Unmarshal(resp.Body(), &response)
// services.ResponseWithJson(w, resp.StatusCode(), response)
return
}
}
@@ -761,6 +765,7 @@ func GetUEInfoFileExportNF(w http.ResponseWriter, r *http.Request) {
log.Debug("requestURI2NF:", requestURI2NF)
client.SetTimeout(3 * time.Minute)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).