Merge remote-tracking branch 'origin/main' into practical-training
This commit is contained in:
28
README.md
28
README.md
@@ -18,19 +18,34 @@ bind 0.0.0.0
|
|||||||
port 6379
|
port 6379
|
||||||
# 安全设置
|
# 安全设置
|
||||||
protected-mode yes
|
protected-mode yes
|
||||||
requirepass ""
|
requirepass "helloearth"
|
||||||
|
# 查看主备
|
||||||
|
info replication
|
||||||
# 从节点只能读取数据,不能直接写入数据
|
# 从节点只能读取数据,不能直接写入数据
|
||||||
|
# replicaof是新版本的命令,旧版本是slaveof命令
|
||||||
slaveof 192.168.114.114 6379
|
slaveof 192.168.114.114 6379
|
||||||
|
replicaof 192.168.114.114 6379
|
||||||
|
masterauth "helloearth"
|
||||||
# 允许从节点进行读写操作
|
# 允许从节点进行读写操作
|
||||||
replica-read-only no
|
replica-read-only no
|
||||||
```
|
```
|
||||||
|
|
||||||
## 版本发布空间
|
## 一些服务器
|
||||||
|
|
||||||
|
```txt
|
||||||
|
# 版本发布空间
|
||||||
\\192.168.1.205\share\release\omc
|
\\192.168.1.205\share\release\omc
|
||||||
|
|
||||||
|
# 研发git
|
||||||
192.168.1.120
|
192.168.1.120
|
||||||
altouser/a1t0U53r
|
altouser/a1t0U53r
|
||||||
|
|
||||||
|
# 默认IOS镜像用户和密码
|
||||||
|
agtuser/admin123
|
||||||
|
manager/admin123
|
||||||
|
omcuser/a9tU53r
|
||||||
|
```
|
||||||
|
|
||||||
## 开发
|
## 开发
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -40,7 +55,7 @@ cd ./restagent
|
|||||||
go mod download
|
go mod download
|
||||||
|
|
||||||
# 调试启动
|
# 调试启动
|
||||||
go run restagent.go -c ./restagent/etc/restconf.yaml --env local
|
go run restagent.go -c ./etc/restconf.yaml --env local
|
||||||
|
|
||||||
# 打包命名 restagent
|
# 打包命名 restagent
|
||||||
go build -ldflags="-s -w" -o restagent
|
go build -ldflags="-s -w" -o restagent
|
||||||
@@ -53,7 +68,12 @@ go env -w GOOS=linux
|
|||||||
|
|
||||||
go env -w GOOS=windows
|
go env -w GOOS=windows
|
||||||
|
|
||||||
go build -o restagent -v -ldflags "-X 'be.ems/lib/global.Version=2.2311.8' -X 'be.ems/lib/global.BuildTime=`date`' -X 'be.ems/lib/global.GoVer=`go version`'"
|
cd ./restagent
|
||||||
|
|
||||||
|
go build -o restagent -v -ldflags="-s -w -X 'be.ems/lib/global.Version=2.240620.1' -X 'be.ems/lib/global.BuildTime=`date`' -X 'be.ems/lib/global.GoVer=`go version`'"
|
||||||
|
|
||||||
|
go build -o crontask -v -ldflags="-s -w -X 'be.ems/lib/global.Version=2.240620.1' -X 'be.ems/lib/global.BuildTime=`date`' -X 'be.ems/lib/global.GoVer=`go version`'"
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ mml:
|
|||||||
port2: 5002
|
port2: 5002
|
||||||
sleep: 200
|
sleep: 200
|
||||||
deadLine: 10
|
deadLine: 10
|
||||||
sizeRow: 100
|
sizeRow: 600
|
||||||
sizeCol: 128
|
sizeCol: 128
|
||||||
bufferSize: 65535
|
bufferSize: 65535
|
||||||
user: admin
|
user: admin
|
||||||
|
|||||||
@@ -493,59 +493,59 @@ type SystemState struct {
|
|||||||
func (t *TaskFunc) TaskHandShakeToNF(uri, params, body string) {
|
func (t *TaskFunc) TaskHandShakeToNF(uri, params, body string) {
|
||||||
log.Debug("TaskHandShakeToNF processing... ")
|
log.Debug("TaskHandShakeToNF processing... ")
|
||||||
|
|
||||||
var nes []NeInfo
|
// var nes []NeInfo
|
||||||
_, err := XormGetAllNeInfo(&nes)
|
// _, err := XormGetAllNeInfo(&nes)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
log.Error("Failed to get all ne info:", err)
|
// log.Error("Failed to get all ne info:", err)
|
||||||
}
|
// }
|
||||||
|
|
||||||
for _, ne := range nes {
|
// for _, ne := range nes {
|
||||||
requestURI := fmt.Sprintf(uri, strings.ToLower(ne.NeType))
|
// requestURI := fmt.Sprintf(uri, strings.ToLower(ne.NeType))
|
||||||
if params != "" {
|
// if params != "" {
|
||||||
requestURI = fmt.Sprintf("%s?%s", requestURI, params)
|
// requestURI = fmt.Sprintf("%s?%s", requestURI, params)
|
||||||
}
|
// }
|
||||||
requestURL := fmt.Sprintf("http://%s:%s%s", ne.Ip, ne.Port, requestURI)
|
// requestURL := fmt.Sprintf("http://%s:%s%s", ne.Ip, ne.Port, requestURI)
|
||||||
log.Debug("requestURL: Get", requestURL)
|
// log.Debug("requestURL: Get", requestURL)
|
||||||
client := resty.New()
|
// client := resty.New()
|
||||||
response, err := client.R().
|
// response, err := client.R().
|
||||||
EnableTrace().
|
// EnableTrace().
|
||||||
SetHeaders(map[string]string{"User-Agent": GetDefaultUserAgent()}).
|
// SetHeaders(map[string]string{"User-Agent": GetDefaultUserAgent()}).
|
||||||
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
// SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
||||||
Get(requestURL)
|
// Get(requestURL)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
log.Error("Failed to Get:", err)
|
// log.Error("Failed to Get:", err)
|
||||||
}
|
// }
|
||||||
|
|
||||||
log.Debug("StatusCode: ", response.StatusCode())
|
// log.Debug("StatusCode: ", response.StatusCode())
|
||||||
switch response.StatusCode() {
|
// switch response.StatusCode() {
|
||||||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
// case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||||||
log.Debug("response body:", string(response.Body()))
|
// log.Debug("response body:", string(response.Body()))
|
||||||
state := new(SystemState)
|
// state := new(SystemState)
|
||||||
_ = json.Unmarshal(response.Body(), &state)
|
// _ = json.Unmarshal(response.Body(), &state)
|
||||||
neState := new(NeState)
|
// neState := new(NeState)
|
||||||
neState.NeType = ne.NeType
|
// neState.NeType = ne.NeType
|
||||||
neState.NeId = ne.NeId
|
// neState.NeId = ne.NeId
|
||||||
neState.Version = state.Version
|
// neState.Version = state.Version
|
||||||
neState.Capability = state.Capability
|
// neState.Capability = state.Capability
|
||||||
neState.SerialNum = state.SerialNum
|
// neState.SerialNum = state.SerialNum
|
||||||
neState.ExpiryDate = state.ExpiryDate
|
// neState.ExpiryDate = state.ExpiryDate
|
||||||
cu, _ := json.Marshal(state.CpuUsage)
|
// cu, _ := json.Marshal(state.CpuUsage)
|
||||||
neState.CpuUsage = string(cu)
|
// neState.CpuUsage = string(cu)
|
||||||
mu, _ := json.Marshal(state.MemUsage)
|
// mu, _ := json.Marshal(state.MemUsage)
|
||||||
neState.MemUsage = string(mu)
|
// neState.MemUsage = string(mu)
|
||||||
ds, _ := json.Marshal(state.DiskSpace)
|
// ds, _ := json.Marshal(state.DiskSpace)
|
||||||
neState.DiskSpace = string(ds)
|
// neState.DiskSpace = string(ds)
|
||||||
log.Debug("neState:", neState)
|
// log.Debug("neState:", neState)
|
||||||
_, err := XormInsertNeState(neState)
|
// _, err := XormInsertNeState(neState)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
log.Error("Failed to insert ne_state:", err)
|
// log.Error("Failed to insert ne_state:", err)
|
||||||
}
|
// }
|
||||||
default:
|
// default:
|
||||||
log.Debug("response body:", string(response.Body()))
|
// log.Debug("response body:", string(response.Body()))
|
||||||
body := new(map[string]interface{})
|
// body := new(map[string]interface{})
|
||||||
_ = json.Unmarshal(response.Body(), &body)
|
// _ = json.Unmarshal(response.Body(), &body)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TaskFunc) TaskExportCmFromNF(uri, params, body string) {
|
func (t *TaskFunc) TaskExportCmFromNF(uri, params, body string) {
|
||||||
|
|||||||
@@ -153,5 +153,9 @@ INSERT INTO `sys_dict_data` VALUES (125, 0, 'dictData.ne_version_status.0', '0',
|
|||||||
INSERT INTO `sys_dict_data` VALUES (126, 1, 'dictData.ne_version_status.1', '1', 'ne_version_status', '', 'success', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
INSERT INTO `sys_dict_data` VALUES (126, 1, 'dictData.ne_version_status.1', '1', 'ne_version_status', '', 'success', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (127, 1, 'dictData.ne_version_status.2', '2', 'ne_version_status', '', 'purple', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
INSERT INTO `sys_dict_data` VALUES (127, 1, 'dictData.ne_version_status.2', '2', 'ne_version_status', '', 'purple', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (128, 1, 'dictData.ne_version_status.3', '3', 'ne_version_status', '', 'processing', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
INSERT INTO `sys_dict_data` VALUES (128, 1, 'dictData.ne_version_status.3', '3', 'ne_version_status', '', 'processing', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (129, 0, 'dictData.udm_sub_cn_type.0', '0', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (130, 1, 'dictData.udm_sub_cn_type.1', '1', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (131, 2, 'dictData.udm_sub_cn_type.2', '2', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (132, 3, 'dictData.udm_sub_cn_type.3', '3', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
@@ -653,5 +653,10 @@ INSERT INTO `sys_dict_data` VALUES (2142, 2142, 'config.sys.i18nOpenRemark', '
|
|||||||
INSERT INTO `sys_dict_data` VALUES (2143, 2143, 'menu.dashboard.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (2143, 2143, 'menu.dashboard.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (2144, 2144, 'log.operate.title.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (2144, 2144, 'log.operate.title.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (2145, 2145, 'menu.system.user.editPost', '修改用户岗位', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (2145, 2145, 'menu.system.user.editPost', '修改用户岗位', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2146, 2146, 'dictType.udm_sub_cn_type', 'UDM Sub CN Type', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2147, 2147, 'dictData.udm_sub_cn_type.0', '没有5GC和EPC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2148, 2148, 'dictData.udm_sub_cn_type.1', '5GC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2149, 2149, 'dictData.udm_sub_cn_type.2', 'EPC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2150, 2150, 'dictData.udm_sub_cn_type.3', '5GC和EPC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
@@ -652,6 +652,11 @@ INSERT INTO `sys_dict_data` VALUES (4141, 4141, 'config.sys.i18nDefaultRemark',
|
|||||||
INSERT INTO `sys_dict_data` VALUES (4142, 4142, 'config.sys.i18nOpenRemark', 'Whether to display switched controls true/false', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (4142, 4142, 'config.sys.i18nOpenRemark', 'Whether to display switched controls true/false', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (4143, 4143, 'menu.dashboard.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (4143, 4143, 'menu.dashboard.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (4144, 4144, 'log.operate.title.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (4144, 4144, 'log.operate.title.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (4145, 4145, 'menu.system.user.editPost', 'Modify User Post', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (4145, 4145, 'menu.system.user.editPost', 'Modify User Post', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4146, 4146, 'dictType.udm_sub_cn_type', 'UDM Sub CN Type', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4147, 4147, 'dictData.udm_sub_cn_type.0', 'No 5GC and EPC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4148, 4148, 'dictData.udm_sub_cn_type.1', '5GC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4149, 4149, 'dictData.udm_sub_cn_type.2', 'EPC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4150, 4150, 'dictData.udm_sub_cn_type.3', '5GC and EPC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ INSERT INTO `sys_dict_type` VALUES (120, 'dictType.ne_host_authMode', 'ne_host_a
|
|||||||
INSERT INTO `sys_dict_type` VALUES (121, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', 'supervisor', 1702020000000, '', 0, '');
|
INSERT INTO `sys_dict_type` VALUES (121, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
INSERT INTO `sys_dict_type` VALUES (122, 'dictType.ne_info_status', 'ne_info_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
INSERT INTO `sys_dict_type` VALUES (122, 'dictType.ne_info_status', 'ne_info_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
INSERT INTO `sys_dict_type` VALUES (123, 'dictType.ne_license_status', 'ne_license_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
INSERT INTO `sys_dict_type` VALUES (123, 'dictType.ne_license_status', 'ne_license_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_type` VALUES (124, 'dictType.udm_sub_cn_type', 'udm_sub_cn_type', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
|
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|||||||
@@ -153,6 +153,10 @@ INSERT IGNORE INTO `sys_dict_data` VALUES (125, 0, 'dictData.ne_version_status.0
|
|||||||
INSERT IGNORE INTO `sys_dict_data` VALUES (126, 1, 'dictData.ne_version_status.1', '1', 'ne_version_status', '', 'success', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
INSERT IGNORE INTO `sys_dict_data` VALUES (126, 1, 'dictData.ne_version_status.1', '1', 'ne_version_status', '', 'success', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
||||||
INSERT IGNORE INTO `sys_dict_data` VALUES (127, 1, 'dictData.ne_version_status.2', '2', 'ne_version_status', '', 'purple', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
INSERT IGNORE INTO `sys_dict_data` VALUES (127, 1, 'dictData.ne_version_status.2', '2', 'ne_version_status', '', 'purple', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
||||||
INSERT IGNORE INTO `sys_dict_data` VALUES (128, 1, 'dictData.ne_version_status.3', '3', 'ne_version_status', '', 'processing', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
INSERT IGNORE INTO `sys_dict_data` VALUES (128, 1, 'dictData.ne_version_status.3', '3', 'ne_version_status', '', 'processing', '1', 'supervisor', 1706620000000, 'supervisor', 1712720201349, '');
|
||||||
|
INSERT IGNORE INTO `sys_dict_data` VALUES (129, 0, 'dictData.udm_sub_cn_type.0', '0', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT IGNORE INTO `sys_dict_data` VALUES (130, 1, 'dictData.udm_sub_cn_type.1', '1', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT IGNORE INTO `sys_dict_data` VALUES (131, 2, 'dictData.udm_sub_cn_type.2', '2', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT IGNORE INTO `sys_dict_data` VALUES (132, 3, 'dictData.udm_sub_cn_type.3', '3', 'udm_sub_cn_type', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
|
||||||
-- 指定记录条件更新
|
-- 指定记录条件更新
|
||||||
|
|
||||||
|
|||||||
@@ -660,5 +660,10 @@ REPLACE INTO `sys_dict_data` VALUES (2142, 2142, 'config.sys.i18nOpenRemark', '
|
|||||||
REPLACE INTO `sys_dict_data` VALUES (2143, 2143, 'menu.dashboard.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (2143, 2143, 'menu.dashboard.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (2144, 2144, 'log.operate.title.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (2144, 2144, 'log.operate.title.mmeUE', 'MME-UE事件', 'i18n_zh', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (2145, 2145, 'menu.system.user.editPost', '修改用户岗位', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (2145, 2145, 'menu.system.user.editPost', '修改用户岗位', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2146, 2146, 'dictType.udm_sub_cn_type', 'UDM Sub CN Type', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2147, 2147, 'dictData.udm_sub_cn_type.0', '没有5GC和EPC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2148, 2148, 'dictData.udm_sub_cn_type.1', '5GC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2149, 2149, 'dictData.udm_sub_cn_type.2', 'EPC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2150, 2150, 'dictData.udm_sub_cn_type.3', '5GC和EPC', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
@@ -654,6 +654,11 @@ REPLACE INTO `sys_dict_data` VALUES (4141, 4141, 'config.sys.i18nDefaultRemark',
|
|||||||
REPLACE INTO `sys_dict_data` VALUES (4142, 4142, 'config.sys.i18nOpenRemark', 'Whether to display switched controls true/false', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (4142, 4142, 'config.sys.i18nOpenRemark', 'Whether to display switched controls true/false', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (4143, 4143, 'menu.dashboard.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (4143, 4143, 'menu.dashboard.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (4144, 4144, 'log.operate.title.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (4144, 4144, 'log.operate.title.mmeUE', 'MME-UE Event', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (4145, 4145, 'menu.system.user.editPost', 'Modify User Post', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (4145, 4145, 'menu.system.user.editPost', 'Modify User Post', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4146, 4146, 'dictType.udm_sub_cn_type', 'UDM Sub CN Type', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4147, 4147, 'dictData.udm_sub_cn_type.0', 'No 5GC and EPC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4148, 4148, 'dictData.udm_sub_cn_type.1', '5GC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4149, 4149, 'dictData.udm_sub_cn_type.2', 'EPC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4150, 4150, 'dictData.udm_sub_cn_type.3', '5GC and EPC', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, '');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
@@ -53,5 +53,6 @@ INSERT IGNORE INTO `sys_dict_type` VALUES (120, 'dictType.ne_host_authMode', 'ne
|
|||||||
INSERT IGNORE INTO `sys_dict_type` VALUES (121, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', 'supervisor', 1702020000000, '', 0, '');
|
INSERT IGNORE INTO `sys_dict_type` VALUES (121, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
INSERT IGNORE INTO `sys_dict_type` VALUES (122, 'dictType.ne_info_status', 'ne_info_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
INSERT IGNORE INTO `sys_dict_type` VALUES (122, 'dictType.ne_info_status', 'ne_info_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
INSERT IGNORE INTO `sys_dict_type` VALUES (123, 'dictType.ne_license_status', 'ne_license_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
INSERT IGNORE INTO `sys_dict_type` VALUES (123, 'dictType.ne_license_status', 'ne_license_status', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
|
INSERT IGNORE INTO `sys_dict_type` VALUES (124, 'dictType.udm_sub_cn_type', 'udm_sub_cn_type', '1', 'supervisor', 1702020000000, '', 0, '');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ var (
|
|||||||
var (
|
var (
|
||||||
TIME_DELAY_AFTER_WRITE time.Duration = 200
|
TIME_DELAY_AFTER_WRITE time.Duration = 200
|
||||||
TIME_DEAD_LINE time.Duration = 10
|
TIME_DEAD_LINE time.Duration = 10
|
||||||
WIN_ROW_SIZE byte = 100
|
WIN_ROW_SIZE int16 = 200
|
||||||
WIN_COL_SIZE byte = 100
|
WIN_COL_SIZE int16 = 120
|
||||||
BUFFER_SIZE int = 65535
|
BUFFER_SIZE int = 65535
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -118,9 +118,15 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
// services.ResponseWithJson(w, http.StatusOK, response)
|
// services.ResponseWithJson(w, http.StatusOK, response)
|
||||||
// return
|
// return
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// 发送窗口大小设置命令
|
// 发送窗口大小设置命令
|
||||||
conn.Write([]byte{255, 251, 31}) // 发送WILL WINDOW SIZE
|
conn.Write([]byte{255, 251, 31}) // 发送WILL WINDOW SIZE
|
||||||
conn.Write([]byte{255, 250, 31, 0, WIN_ROW_SIZE, 0, WIN_COL_SIZE, 255, 240}) // 发送设置 WINDOW SIZE
|
conn.Write([]byte{
|
||||||
|
255, 250, 31,
|
||||||
|
byte(WIN_COL_SIZE >> 8), byte(WIN_COL_SIZE & 0xFF),
|
||||||
|
byte(WIN_ROW_SIZE >> 8), byte(WIN_ROW_SIZE & 0xFF),
|
||||||
|
255, 240,
|
||||||
|
}) // 发送设置 WINDOW SIZE
|
||||||
|
|
||||||
conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second))
|
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)
|
loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password)
|
||||||
|
|||||||
@@ -123,6 +123,12 @@ for ne_type in ${ne_types}; do
|
|||||||
SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} AS SELECT * FROM kpi_report WHERE 1=0;ALTER TABLE ${TABLE_NAME} MODIFY COLUMN \`id\` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (\`id\`);"
|
SQL="CREATE TABLE IF NOT EXISTS ${TABLE_NAME} AS SELECT * FROM kpi_report WHERE 1=0;ALTER TABLE ${TABLE_NAME} MODIFY COLUMN \`id\` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (\`id\`);"
|
||||||
echo -n "Create table: ${TABLE_NAME} ..."
|
echo -n "Create table: ${TABLE_NAME} ..."
|
||||||
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
||||||
|
if [ $? = 0 ]; then
|
||||||
|
echo "done"
|
||||||
|
fi
|
||||||
|
SQL="ALTER TABLE ${TABLE_NAME} ADD INDEX IF NOT EXISTS \`idx_timestamp\`(\`created_at\`) USING BTREE, ADD INDEX IF NOT EXISTS \`idx_uid_datetime\`(\`rm_uid\`, \`date\`, \`start_time\`) USING BTREE;"
|
||||||
|
echo -n "Create index of ${TABLE_NAME} ..."
|
||||||
|
mysql -u${USER} -p${PASSWORD} -P ${PORT} -h ${HOST} --protocol tcp -D ${DBNAME} -e "${SQL}"
|
||||||
if [ $? = 0 ]; then
|
if [ $? = 0 ]; then
|
||||||
echo "done"
|
echo "done"
|
||||||
fi
|
fi
|
||||||
|
|||||||
16
misc/nehosts
16
misc/nehosts
@@ -1,16 +1,2 @@
|
|||||||
# host user password
|
# host user password
|
||||||
# Example: 192.168.4.133 root password
|
# Example: 172.16.5.100 omcuser password
|
||||||
172.16.5.100 omcuser admin123
|
|
||||||
172.16.5.110 omcuser admin123
|
|
||||||
172.16.5.120 omcuser admin123
|
|
||||||
172.16.5.130 omcuser admin123
|
|
||||||
172.16.5.140 omcuser admin123
|
|
||||||
172.16.5.150 omcuser admin123
|
|
||||||
172.16.5.160 omcuser admin123
|
|
||||||
172.16.5.170 omcuser admin123
|
|
||||||
172.16.5.180 omcuser admin123
|
|
||||||
172.16.5.190 omcuser admin123
|
|
||||||
172.16.5.220 omcuser admin123
|
|
||||||
172.16.5.230 omcuser admin123
|
|
||||||
172.16.5.210 omcuser admin123
|
|
||||||
172.16.5.200 omcuser admin123
|
|
||||||
|
|||||||
@@ -177,8 +177,8 @@ type MMLParam struct {
|
|||||||
Port2 int `yaml:"port2"`
|
Port2 int `yaml:"port2"`
|
||||||
Sleep int64 `yaml:"sleep"`
|
Sleep int64 `yaml:"sleep"`
|
||||||
DeadLine int64 `yaml:"deadLine"`
|
DeadLine int64 `yaml:"deadLine"`
|
||||||
SizeRow byte `yaml:"sizeRow"`
|
SizeRow int16 `yaml:"sizeRow"`
|
||||||
SizeCol byte `yaml:"sizeCol"`
|
SizeCol int16 `yaml:"sizeCol"`
|
||||||
BufferSize int `yaml:"bufferSize"`
|
BufferSize int `yaml:"bufferSize"`
|
||||||
User string `yaml:"user"`
|
User string `yaml:"user"`
|
||||||
Password string `ymal:"password"`
|
Password string `ymal:"password"`
|
||||||
@@ -226,8 +226,8 @@ func NewYamlConfig() YamlConfig {
|
|||||||
ConnParam: "charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True",
|
ConnParam: "charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True",
|
||||||
},
|
},
|
||||||
MML: MMLParam{
|
MML: MMLParam{
|
||||||
SizeRow: 100,
|
SizeRow: 200,
|
||||||
SizeCol: 128,
|
SizeCol: 120,
|
||||||
BufferSize: 65535,
|
BufferSize: 65535,
|
||||||
},
|
},
|
||||||
Alarm: AlarmConfig{
|
Alarm: AlarmConfig{
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ mml:
|
|||||||
port2: 5002
|
port2: 5002
|
||||||
sleep: 200
|
sleep: 200
|
||||||
deadLine: 10
|
deadLine: 10
|
||||||
sizeRow: 100
|
sizeRow: 600
|
||||||
sizeCol: 128
|
sizeCol: 128
|
||||||
bufferSize: 65535
|
bufferSize: 65535
|
||||||
user: admin
|
user: admin
|
||||||
|
|||||||
@@ -50,11 +50,11 @@ func (c *ConnTelnet) NewClient() (*ConnTelnet, error) {
|
|||||||
// fmt.Fprintln(client, c.User)
|
// fmt.Fprintln(client, c.User)
|
||||||
// fmt.Fprintln(client, c.Password)
|
// fmt.Fprintln(client, c.Password)
|
||||||
|
|
||||||
// 需要确保接收方理解并正确处理发送窗口大小设置命令
|
|
||||||
client.Write([]byte{255, 251, 31}) // 发送窗口大小选项
|
|
||||||
client.Write([]byte{255, 250, 31, 0, 120, 0, 128, 255, 240}) // 发送窗口行和列的大小 (120 列 x 128 行)
|
|
||||||
c.Client = &client
|
c.Client = &client
|
||||||
|
|
||||||
|
// 调整窗口大小 (120 列 x 128 行)
|
||||||
|
requestPty(c.Client, 120, 128)
|
||||||
|
|
||||||
// 排空连接登录的信息
|
// 排空连接登录的信息
|
||||||
c.RunCMD("")
|
c.RunCMD("")
|
||||||
return c, nil
|
return c, nil
|
||||||
@@ -107,15 +107,24 @@ func (c *ConnTelnet) RunCMD(cmd string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewClient 创建Telnet客户端会话对象
|
// NewClient 创建Telnet客户端会话对象
|
||||||
func (c *ConnTelnet) NewClientSession(cols, rows uint8) (*TelnetClientSession, error) {
|
func (c *ConnTelnet) NewClientSession(cols, rows int) (*TelnetClientSession, error) {
|
||||||
if c.Client == nil {
|
if c.Client == nil {
|
||||||
return nil, fmt.Errorf("telnet client not connected")
|
return nil, fmt.Errorf("telnet client not connected")
|
||||||
}
|
}
|
||||||
conn := *c.Client
|
requestPty(c.Client, cols, rows)
|
||||||
// 调整窗口
|
|
||||||
conn.Write([]byte{255, 251, 31})
|
|
||||||
conn.Write([]byte{255, 250, 31, 0, cols, 0, rows, 255, 240})
|
|
||||||
return &TelnetClientSession{
|
return &TelnetClientSession{
|
||||||
Client: conn,
|
Client: *c.Client,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// requestPty 调整终端窗口大小
|
||||||
|
func requestPty(client *net.Conn, cols, rows int) error {
|
||||||
|
if client == nil {
|
||||||
|
return fmt.Errorf("telnet client not connected")
|
||||||
|
}
|
||||||
|
conn := *client
|
||||||
|
// 需要确保接收方理解并正确处理发送窗口大小设置命令
|
||||||
|
conn.Write([]byte{255, 251, 31})
|
||||||
|
conn.Write([]byte{255, 250, 31, byte(cols >> 8), byte(cols & 0xFF), byte(rows >> 8), byte(rows & 0xFF), 255, 240})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -96,19 +96,47 @@ func (r *PerfKPIImpl) SelectKpiReport(query model.GoldKPIQuery, kpiIds []string)
|
|||||||
params = append(params, query.RmUID)
|
params = append(params, query.RmUID)
|
||||||
}
|
}
|
||||||
if query.NeType != "" {
|
if query.NeType != "" {
|
||||||
conditions = append(conditions, "gk.ne_type = ?")
|
//conditions = append(conditions, "gk.ne_type = ?")
|
||||||
params = append(params, query.NeType)
|
// params = append(params, query.NeType)
|
||||||
tableName += strings.ToLower(query.NeType)
|
tableName += strings.ToLower(query.NeType)
|
||||||
}
|
}
|
||||||
var dateTimeStr string = "CONCAT(gk.`date`, \" \", gk.start_time)"
|
|
||||||
|
var dateStr1, dateStr2, timeStr1, timeStr2 string
|
||||||
if query.StartTime != "" {
|
if query.StartTime != "" {
|
||||||
conditions = append(conditions, dateTimeStr+" >= ?")
|
dateStr1 = query.StartTime[:10]
|
||||||
params = append(params, query.StartTime)
|
timeStr1 = query.StartTime[11:]
|
||||||
}
|
}
|
||||||
if query.EndTime != "" {
|
if query.EndTime != "" {
|
||||||
conditions = append(conditions, dateTimeStr+" <= ?")
|
dateStr2 = query.EndTime[:10]
|
||||||
params = append(params, query.EndTime)
|
timeStr2 = query.EndTime[11:]
|
||||||
}
|
}
|
||||||
|
if dateStr1 == dateStr2 && dateStr1 != "" {
|
||||||
|
conditions = append(conditions, "gk.`date` = ?")
|
||||||
|
params = append(params, dateStr1)
|
||||||
|
conditions = append(conditions, "gk.`start_time` >= ?")
|
||||||
|
params = append(params, timeStr1)
|
||||||
|
conditions = append(conditions, "gk.`start_time` <= ?")
|
||||||
|
params = append(params, timeStr2)
|
||||||
|
} else {
|
||||||
|
if dateStr1 != "" {
|
||||||
|
conditions = append(conditions, "(gk.`date` > ? OR (gk.`date` = ? AND gk.`start_time` >= ?))")
|
||||||
|
params = append(params, dateStr1, dateStr1, timeStr1)
|
||||||
|
}
|
||||||
|
if dateStr2 != "" {
|
||||||
|
conditions = append(conditions, "(gk.`date` < ? OR (gk.`date` = ? AND gk.`start_time` <= ?))")
|
||||||
|
params = append(params, dateStr2, dateStr2, timeStr2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// var dateTimeStr string = "CONCAT(gk.`date`, \" \", gk.start_time)"
|
||||||
|
// if query.StartTime != "" {
|
||||||
|
// conditions = append(conditions, dateTimeStr+" >= ?")
|
||||||
|
// params = append(params, query.StartTime)
|
||||||
|
// }
|
||||||
|
// if query.EndTime != "" {
|
||||||
|
// conditions = append(conditions, dateTimeStr+" <= ?")
|
||||||
|
// params = append(params, query.EndTime)
|
||||||
|
// }
|
||||||
// 构建查询条件语句
|
// 构建查询条件语句
|
||||||
whereSql := ""
|
whereSql := ""
|
||||||
if len(conditions) > 0 {
|
if len(conditions) > 0 {
|
||||||
@@ -116,6 +144,7 @@ func (r *PerfKPIImpl) SelectKpiReport(query model.GoldKPIQuery, kpiIds []string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询字段列
|
// 查询字段列
|
||||||
|
var dateTimeStr string = "CONCAT(gk.`date`, \" \", gk.start_time)"
|
||||||
timeFormat := "DATE_FORMAT(" + dateTimeStr + ", '%Y-%m-%d %H:%i:')"
|
timeFormat := "DATE_FORMAT(" + dateTimeStr + ", '%Y-%m-%d %H:%i:')"
|
||||||
secondGroup := fmt.Sprintf("LPAD(FLOOR(SECOND(gk.start_time) / %d) * %d, 2, '0')", query.Interval, query.Interval)
|
secondGroup := fmt.Sprintf("LPAD(FLOOR(SECOND(gk.start_time) / %d) * %d, 2, '0')", query.Interval, query.Interval)
|
||||||
groupByField := fmt.Sprintf("CONCAT( %s, %s ) AS timeGroup", timeFormat, secondGroup)
|
groupByField := fmt.Sprintf("CONCAT( %s, %s ) AS timeGroup", timeFormat, secondGroup)
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ func (s *NeLicenseController) State(c *gin.Context) {
|
|||||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if neState, err := neService.NeState(neInfo); err == nil {
|
if neState, err := neService.NeState(neInfo); err == nil && neState["sn"] != nil {
|
||||||
neLicense.Status = "1"
|
neLicense.Status = "1"
|
||||||
neLicense.SerialNum = fmt.Sprint(neState["sn"])
|
neLicense.SerialNum = fmt.Sprint(neState["sn"])
|
||||||
neLicense.ExpiryDate = fmt.Sprint(neState["expire"])
|
neLicense.ExpiryDate = fmt.Sprint(neState["expire"])
|
||||||
|
|||||||
@@ -257,18 +257,18 @@ func (s *WSController) Telnet(c *gin.Context) {
|
|||||||
defer client.Close()
|
defer client.Close()
|
||||||
|
|
||||||
// 终端单行字符数
|
// 终端单行字符数
|
||||||
cols, err := strconv.Atoi(c.Query("cols"))
|
cols, err := strconv.Atoi(c.DefaultQuery("cols", "120"))
|
||||||
if err != nil || cols > 254 {
|
if err != nil {
|
||||||
cols = 120
|
cols = 120
|
||||||
}
|
}
|
||||||
// 终端显示行数
|
// 终端显示行数
|
||||||
rows, err := strconv.Atoi(c.Query("rows"))
|
rows, err := strconv.Atoi(c.DefaultQuery("rows", "128"))
|
||||||
if err != nil || cols > rows {
|
if err != nil {
|
||||||
rows = 128
|
rows = 128
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建Telnet客户端会话
|
// 创建Telnet客户端会话
|
||||||
clientSession, err := client.NewClientSession(uint8(cols), uint8(rows))
|
clientSession, err := client.NewClientSession(cols, rows)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// 连接主机失败,请检查连接参数后重试
|
// 连接主机失败,请检查连接参数后重试
|
||||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo")))
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo")))
|
||||||
|
|||||||
Reference in New Issue
Block a user