1
0

23 Commits

Author SHA1 Message Date
simon
6b5e958113 release: 2.2508.2 2025-08-21 09:43:51 +08:00
simon
0c3a264b24 chore: nbi reference doc and tools for generate data or cdr 2025-08-20 16:06:04 +08:00
simon
c4e620d2a7 feat: etc default config file check 2025-08-11 17:39:13 +08:00
simon
d38cf41630 feat: add config file nbi_pm.yaml 2025-08-11 17:25:05 +08:00
simon
e8059871d5 chore: remove and ignore default file 2025-08-11 17:18:26 +08:00
simon
a666f177cc release: 2.2508.1 support alarm/nbi_pm/nbi_kpi redis queue and generate nbi pm whole kpi random data 2025-08-11 17:14:08 +08:00
simon
847d9ab781 chore: nbi pm xlxs generate to json schema 2025-08-11 17:00:39 +08:00
simon
16ef83f04b release 2.2507.1 2025-07-24 09:33:23 +08:00
simon
e4c0806468 fix: add project tag 2025-06-23 18:35:10 +08:00
simon
e5b8df0753 feat: nbi release 2.2506.1 2025-06-23 18:29:03 +08:00
simon
1386f2aa41 release 2.2504.1 2025-05-23 18:48:08 +08:00
simon
d0d4efed93 feat: nbi interface md 2025-05-23 18:11:05 +08:00
simon
1cda2618f3 fix: ../spec 2025-04-30 11:29:15 +08:00
simon
9046f4daa7 fix> ... 2025-04-30 11:16:48 +08:00
simon
c3eb9874a8 fix: firewall cmd 2025-04-29 20:51:46 +08:00
simon
22d3f6f9fa fix... 2025-04-29 20:43:13 +08:00
simon
efa3b6e627 fix: ... 2025-04-29 20:37:57 +08:00
simon
c565a3ee8f fix: ignore rpm buildroot 2025-04-29 20:26:30 +08:00
simon
1e1b8394a5 fix: spec for epenEuler 2025-04-29 20:25:21 +08:00
simon
91ac4aa3ff fix: openEuler majorVersion 2025-04-28 17:23:25 +08:00
simon
3451f36ece feat: build sh update 2025-04-27 20:01:59 +08:00
simon
c12c9d2f31 fix: restconf.yaml 2025-04-27 11:54:18 +08:00
zhangsz
f1685db6ed release nbi 2.2504.1 2025-04-25 15:19:20 +08:00
23 changed files with 566 additions and 224 deletions

1
.gitignore vendored
View File

@@ -27,5 +27,6 @@ release
rpmbuild/RPMS
rpmbuild/SOURCES
rpmbuild/BUILD
rpmbuild/BUILDROOT

View File

@@ -56,7 +56,7 @@ fi
ProjectL=omc
ProjectU=OMC
PROJECT=${ProjectL}
VERSION=2.2503.5
VERSION=2.2508.2
RelDate=`date +%Y%m%d`
RelVer=${VERSION}-${RelDate}
Ky10Arch=ky10.aarch64
@@ -69,7 +69,7 @@ RpmArch=`arch`
RpmsDir=${EmsBuildRoot}/rpmbuild/RPMS
ReleaseDir=${EmsBuildRoot}/release
DumpToolDir=${EmsBEDir}/tools/misc
ProjectTag=""
ProjectTag="nbi"
BuildDir=${EmsBuildRoot}/build
CustomizedDir=${EmsBuildRoot}/customized
@@ -159,7 +159,8 @@ case $(get_os_info) in
;;
openEuler)
ptype=rpm
RelOS=oe20
majorVersion=${OSVersion:0:2}
RelOS=oe${majorVersion}
RpmPkgName=${ProjectL}-${RelVer}.${RpmArch}.${ptype}
RpmPkgRename=${ProjectL}-r${RelVer}-${RelOS}-${RelArch}.${ptype}
;;
@@ -220,7 +221,11 @@ case "${pkgtype}" in
cp -rf ${CustomizedDir}/omc.d ${RpmBuildOMCDir}/static
cd ${RpmBuildDir}
rpmbuild -bb -D "_topdir ${RpmBuildDir}" ${RpmBuildDir}/SPECS/omc.spec
if [ ! ProjectTag = "" ]; then
RpmPkgRename=${ProjectL}-r${RelVer}-${RelOS}-${RelArch}-${ProjectTag}.${ptype}
fi
mv -f $RpmsDir/$RpmArch/$RpmPkgName ${ReleasePkgDir}/$RpmPkgRename
cd ${ReleasePkgDir}
rm -f omc-md5sum.txt

View File

@@ -107,7 +107,7 @@ makefe() {
}
makebe() {
cd ${builddir}
cd ${builddir}/bin
#chmod +x mkpkg.sh
chmod +x build.sh
./build.sh ${be_args[@]}

View File

@@ -1,193 +0,0 @@
# file: log file name
# level: /trace/debug/info/warn/error/fatal, default: debug
# duration: rotation time with xx hours, example: 1/12/24 hours
# count: rotation count of log, default is 30 rotation
logger:
file: /usr/local/omc/log/restagent.log
level: warn
duration: 24
count: 90
# rest agent listen ipv4/v6 and port, support multiple routines
# ip: 0.0.0.0 or ::0, support IPv4/v6
# clientAuthType: 0:NoClientCert (default), 1:RequestClientCert, 2:RequireAnyClientCert,
# 3:VerifyClientCertIfGiven, 4:RequireAndVerifyClientCerts
rest:
- ipv4: 0.0.0.0
ipv6:
port: 33030
- ipv4: 0.0.0.0
ipv6:
port: 33443
schema: https
clientAuthType: 0
caFile: /usr/local/omc/etc/certs/omc-ca.crt
certFile: /usr/local/omc/etc/certs/omc-server.crt
keyFile: /usr/local/omc/etc/certs/omc-server.key
webServer:
enabled: true
rootDir: /usr/local/omc/htdocs/front
listen:
- addr: :80
schema: http
- addr: :443
schema: https
clientAuthType: 0
caFile: /usr/local/omc/etc/certs/omc-ca.crt
certFile: /usr/local/omc/etc/certs/omc-server.crt
keyFile: /usr/local/omc/etc/certs/omc-server.key
database:
type: mysql
user: root
password: 1000omc@kp!
host: 127.0.0.1
port: 33066
name: omc_db
connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True
backup: /usr/local/omc/database
# Redis data cache
redis:
dataSource:
# OMC system db
default:
port: 6379 # Redis port
host: "127.0.0.1" # Redis host
password: "helloearth"
db: 10 # Redis db_num
# UDM sub/auth db
udmuser:
port: 6379 # Redis port
host: "127.0.0.1"
password: "helloearth"
db: 0 # Redis db_num
# used to specify the default data source for multiple data resourece
defaultDataSourceName: "default"
# sleep: time delay for after write buffer (millisecond)
# deadLine: timeout for io read and write (second)
mml:
sleep: 200
deadLine: 10
sizeRow: 600
sizeCol: 128
bufferSize: 65535
mmlHome: ./mmlhome
# Tracking configuration
trace:
enabled: true
host: "172.16.5.100" # Fill in the specific IP address
port: 33033
# NE config
ne:
user: omcuser
etcdir: /usr/local/etc
bindir: /usr/local/bin
omcdir: /usr/local/omc
scpdir: /tmp
licensedir: /usr/local/etc/{neType}/license
# backup etc list of IMS, does not contain spaces
etcListIMS: '{*.yaml,mmtel,vars.cfg}'
etcListDefault: '{*.yaml,*.conf,*.cfg}'
# true/false to overwrite config file when dpkg ne software
dpkgOverwrite: false
# dpkg timeout (second)
dpkgTimeout: 180
# chk2ne: true/false, if put OmcNeConfig parameters to NE
omc:
uriPrefix: "/omc/rest"
neType: OMC
neId: 001
rmUID: 4400HX101
neName: OMC
province: ""
vendor: ""
dn: ""
chk2ne: false
sn: "-"
checksign: false
rootDir: /usr/local/omc
binDir: /usr/local/omc/bin
backup: /usr/local/omc/backup
upload: /usr/local/omc/upload
frontUpload: /usr/local/omc/htdocs/front/upload
frontTraceDir: /usr/local/omc/htdocs/front/trace
software: /usr/local/omc/software
license: /usr/local/omc/license
gtpUri: gtp:192.168.2.119:32152
checkContentType: false
testMode: false
rbacMode: true
runDir: /usr/local/omc/run
cmdTimeout: 120
# Alarm module setting
# Forward interface:
# TLS Skip verify: true/false
# email/sms
# smProxy: sms(Short Message Service)/smsc(SMS Centre)
# dataCoding: 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1,
# 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2
alarm:
alarmEmailForward:
enable: true
emailList:
smtp: mail.smtp.com
port: 25
user: smtpext@smtp.com
password: "1000smtp@omc!"
tlsSkipVerify: true
alarmSMSForward:
enable: true
mobileList:
smscAddr: "192.168.13.114:2775"
systemID: "omc"
password: "omc123"
systemType: "UTRAN"
dataCoding: 0
serviceNumber: "OMC"
sms:
apiURL: http://smsc.xxx.com/
accessKeyID: xxxx
accessKeySecret: xxxx
signName: xxx SMSC
templateCode: 1000
smProxy: smsc
# User authorized information
# crypt: mysql/md5/bcrypt
# token: true/false to check accessToken
# expires for session, unit: second
# Support single/multiple session of user
#
auth:
crypt: bcrypt
token: true
expires: 1800
session: multiple
publicKey: /usr/local/omc/etc/certs/omc
privateKey: /usr/local/omc/etc/certs/omc
# Parameter for limit number
# rmuid_maxnum: the max number of rmUID, default: 50
# alarmid_maxnum: the max number of AlarmID, default: 50
# pmid_maxnum: the max number of pmID, default: 50
# subid_maxnum: the max number of subscription ID, default: 20
# uri_maxlen: the max length of uri, default: 8192
# rmuid_regexp: regexp pattern of rmUID
params:
rmuidmaxnum: 50
alarmidmaxnum: 50
pmidmaxnum: 50
subidmaxnum: 20
urimaxlen: 2100000
rmuidregexp: "[0-9]{4}[A-Z]{2}[A-Z]{2}[0-9A-Z]{1}[0-9A-Z]{3}[0-9A-Z]{1,16}"
testConfig:
enabled: false
file: /usr/local/omc/etc/testconfig.yaml

View File

@@ -1,5 +1,5 @@
Package: OMC
Version: 2.2503.5-YYYYMMDD
Version: 2.2508.2-YYYYMMDD
Section: AGrandTech
Prioritt: optional
Architecture: amd64

View File

@@ -10,7 +10,7 @@ UsrLocalBinDir=/usr/local/bin
OmcDaemon=omcd
NginxEtcDir=/etc/nginx
NginxConfDir=${NginxEtcDir}/conf.d
CFileList="restconf.yaml sshsvc.yaml omc.conf"
CFileList=$(ls ${OMCEtcDir}/default)
LogoFileList="zh_brand.png zh_icon.png en_brand.png en_icon.png"
echo ""

View File

@@ -1,5 +1,5 @@
Package: OMC
Version: 2.2503.5-YYYYMMDD
Version: 2.2508.2-YYYYMMDD
Section: AGrandTech
Prioritt: optional
Architecture: amd64

View File

@@ -10,7 +10,7 @@ UsrLocalBinDir=/usr/local/bin
OmcDaemon=omcd
NginxEtcDir=/etc/nginx
NginxConfDir=${NginxEtcDir}/conf.d
CFileList="restconf.yaml sshsvc.yaml omc.conf"
CFileList=$(ls ${OMCEtcDir}/default)
LogoFileList="zh_brand.png zh_icon.png en_brand.png en_icon.png"
echo ""

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,175 @@
# -*- coding: utf-8 -*-
import pandas as pd
import json
import random
import os
import glob
def generate_pm_json(excel_file_path, output_file_path):
"""
从 Excel 文件中提取英文名称和空间粒度,生成 PM JSON 文件
"""
try:
# 检查文件是否存在
if not os.path.exists(excel_file_path):
print(f"错误:文件 {excel_file_path} 不存在")
return False
print(f"正在读取 Excel 文件: {excel_file_path}")
# 读取 Excel 文件的所有工作表
excel_data = pd.read_excel(excel_file_path, sheet_name=None)
# 使用字典按 granularity 分组
granularity_groups = {}
processed_sheets = 0
# 遍历所有工作表,查找包含"英文名称"列的表格
for sheet_name, df in excel_data.items():
print(f" 处理工作表: {sheet_name}")
# 检查是否包含"英文名称"列
if '英文名称' in df.columns:
processed_sheets += 1
print(f" - 找到英文名称列,共 {len(df)} 行数据")
# 检查是否有空间粒度列
granularity_col = None
for col in df.columns:
if '空间粒度' in str(col) or '粒度' in str(col):
granularity_col = col
break
# 用于记录当前sheet中最后一个不为空的空间粒度
last_valid_granularity = "DefaultFunction"
for index, row in df.iterrows():
english_name = row['英文名称']
# 跳过空值和非字符串值
if pd.notna(english_name) and str(english_name).strip() and str(english_name) != 'nan':
english_name = str(english_name).strip()
# 获取空间粒度信息
current_granularity = None
if granularity_col and pd.notna(row[granularity_col]):
current_granularity = str(row[granularity_col]).strip()
if current_granularity: # 确保不是空字符串
last_valid_granularity = current_granularity
# 如果当前行的空间粒度为空,使用最后一个有效的空间粒度
granularity = last_valid_granularity
# 生成随机值
random_value = random.randint(0, 16)
kpi = {
"KPIID": english_name,
"KPIValues": [
{
"Name": "Total",
"Value": random_value
}
]
}
# 按 granularity 分组
if granularity not in granularity_groups:
granularity_groups[granularity] = []
granularity_groups[granularity].append(kpi)
# 显示使用的粒度信息
granularity_info = ""
if current_granularity:
granularity_info = f" (当前: {granularity})"
else:
granularity_info = f" (继承: {granularity})"
print(f" 添加 KPI: {english_name} = {random_value}{granularity_info}")
else:
print(f" - 跳过(无英文名称列)")
# 生成最终的 JSON 结构
result = []
for granularity, kpis in granularity_groups.items():
result.append({
"ObjectType": granularity,
"KPIs": kpis
})
# 写入文件
with open(output_file_path, 'w', encoding='utf-8') as f:
json.dump(result, f, indent=4, ensure_ascii=False)
print(f" 成功生成文件: {output_file_path}")
print(f" 处理了 {processed_sheets} 个工作表")
print(f" 生成了 {len(granularity_groups)} 个对象类型")
for granularity, kpis in granularity_groups.items():
print(f" - {granularity}: {len(kpis)} 个 KPI")
return True
except Exception as e:
print(f"错误: {str(e)}")
import traceback
traceback.print_exc()
return False
def main():
print("PM JSON 批量生成器")
print("=" * 60)
# 定义要处理的文件列表
pm_files = [
"AMF-PM(V1.1.5)-Company-Version00.xlsx",
"PCF-PM(V1.1.4)-Company-Version00.xlsx",
"SMF-PM(V1.2.1)-Company-Version00.xlsx",
"UDM-PM(V1.2.2)-Company-Version00.xlsx",
"UPF-PM(V1.2.1)-Company-Version00.xlsx"
]
# 也可以自动发现当前目录下的所有 PM Excel 文件
# pm_files = glob.glob("*-PM(*)-Company-Version*.xlsx")
successful_files = 0
failed_files = 0
for excel_file in pm_files:
print(f"\n处理文件: {excel_file}")
print("-" * 50)
# 检查文件是否存在
if not os.path.exists(excel_file):
print(f" 警告:文件 {excel_file} 不存在,跳过")
failed_files += 1
continue
# 生成输出文件名
base_name = os.path.splitext(excel_file)[0]
output_file = f"{base_name}-generated.json"
# 处理文件
if generate_pm_json(excel_file, output_file):
successful_files += 1
else:
failed_files += 1
# 汇总结果
print("\n" + "=" * 60)
print("批量处理完成!")
print(f"成功处理: {successful_files} 个文件")
print(f"失败/跳过: {failed_files} 个文件")
print(f"总计: {successful_files + failed_files} 个文件")
if successful_files > 0:
print("\n生成的文件列表:")
for excel_file in pm_files:
if os.path.exists(excel_file):
base_name = os.path.splitext(excel_file)[0]
output_file = f"{base_name}-generated.json"
if os.path.exists(output_file):
print(f" - {output_file}")
if __name__ == "__main__":
main()

225
docs/nbi/pm/pm_generator.go Normal file
View File

@@ -0,0 +1,225 @@
package main
import (
"encoding/json"
"fmt"
"math/rand"
"os"
"path/filepath"
"strings"
)
// KPIValue 表示单个 KPI 值
type KPIValue struct {
Name string `json:"Name"`
Value int `json:"Value"`
}
// KPI 表示单个 KPI 项
type KPI struct {
KPIID string `json:"KPIID"`
KPIValues []KPIValue `json:"KPIValues"`
}
// PMObject 表示性能管理对象
type PMObject struct {
ObjectType string `json:"ObjectType"`
KPIs []KPI `json:"KPIs"`
}
// PMData 表示完整的性能管理数据
type PMData []PMObject
// generateRandomValue 生成 0-16 之间的随机数
func generateRandomValue() int {
return rand.Intn(17) // 0-16
}
// generatePMDataFromSchema 从 schema 文件生成随机数据
func generatePMDataFromSchema(schemaFile string, outputFile string) error {
// 读取 schema 文件
schemaData, err := os.ReadFile(schemaFile)
if err != nil {
return fmt.Errorf("读取 schema 文件失败: %v", err)
}
// 解析 JSON
var pmSchema PMData
if err := json.Unmarshal(schemaData, &pmSchema); err != nil {
return fmt.Errorf("解析 JSON 失败: %v", err)
}
// 生成新的随机数据
var newPMData PMData
for _, pmObj := range pmSchema {
newObj := PMObject{
ObjectType: pmObj.ObjectType,
KPIs: make([]KPI, len(pmObj.KPIs)),
}
for i, kpi := range pmObj.KPIs {
newKPI := KPI{
KPIID: kpi.KPIID,
KPIValues: make([]KPIValue, len(kpi.KPIValues)),
}
for j, kpiVal := range kpi.KPIValues {
newKPI.KPIValues[j] = KPIValue{
Name: kpiVal.Name,
Value: generateRandomValue(),
}
}
newObj.KPIs[i] = newKPI
}
newPMData = append(newPMData, newObj)
}
// 写入新文件
outputData, err := json.MarshalIndent(newPMData, "", " ")
if err != nil {
return fmt.Errorf("序列化 JSON 失败: %v", err)
}
if err := os.WriteFile(outputFile, outputData, 0644); err != nil {
return fmt.Errorf("写入文件失败: %v", err)
}
fmt.Printf("成功生成随机数据文件: %s\n", outputFile)
return nil
}
// generatePMDataFromMultipleSchemas 批量处理多个 schema 文件
func generatePMDataFromMultipleSchemas(schemaDir string) error {
// 查找所有 *-generated.json 文件
pattern := filepath.Join(schemaDir, "*-generated.json")
schemaFiles, err := filepath.Glob(pattern)
if err != nil {
return fmt.Errorf("查找 schema 文件失败: %v", err)
}
if len(schemaFiles) == 0 {
return fmt.Errorf("未找到任何 schema 文件 (pattern: %s)", pattern)
}
fmt.Printf("找到 %d 个 schema 文件\n", len(schemaFiles))
successCount := 0
failCount := 0
for _, schemaFile := range schemaFiles {
// 生成输出文件名:将 "-generated.json" 替换为 "-random.json"
outputFile := strings.Replace(schemaFile, "-generated.json", "-random.json", 1)
fmt.Printf("\n处理文件: %s\n", filepath.Base(schemaFile))
fmt.Printf("输出文件: %s\n", filepath.Base(outputFile))
if err := generatePMDataFromSchema(schemaFile, outputFile); err != nil {
fmt.Printf("错误: %v\n", err)
failCount++
} else {
successCount++
}
}
fmt.Printf("\n处理完成! 成功: %d, 失败: %d\n", successCount, failCount)
return nil
}
// printPMDataSummary 打印 PM 数据摘要信息
func printPMDataSummary(file string) error {
data, err := os.ReadFile(file)
if err != nil {
return err
}
var pmData PMData
if err := json.Unmarshal(data, &pmData); err != nil {
return err
}
fmt.Printf("\n文件: %s\n", filepath.Base(file))
fmt.Printf("对象类型数量: %d\n", len(pmData))
totalKPIs := 0
for _, obj := range pmData {
fmt.Printf(" - %s: %d 个 KPI\n", obj.ObjectType, len(obj.KPIs))
totalKPIs += len(obj.KPIs)
}
fmt.Printf("总 KPI 数量: %d\n", totalKPIs)
return nil
}
// 示例用法函数
func main() {
// 设置随机种子
// rand.Seed(time.Now().UnixNano())
if len(os.Args) < 2 {
fmt.Println("用法:")
fmt.Println(" go run pm_generator.go <command> [args]")
fmt.Println("")
fmt.Println("命令:")
fmt.Println(" batch <directory> - 批量处理目录下的所有 *-generated.json 文件")
fmt.Println(" single <input> <output> - 处理单个文件")
fmt.Println(" summary <file> - 显示文件摘要信息")
fmt.Println("")
fmt.Println("示例:")
fmt.Println(" go run pm_generator.go batch .")
fmt.Println(" go run pm_generator.go single AMF-PM-generated.json AMF-PM-random.json")
fmt.Println(" go run pm_generator.go summary AMF-PM-random.json")
return
}
command := os.Args[1]
switch command {
case "batch":
dir := "."
if len(os.Args) > 2 {
dir = os.Args[2]
}
fmt.Println("PM 数据随机生成器 - 批量模式")
fmt.Println(strings.Repeat("=", 50))
if err := generatePMDataFromMultipleSchemas(dir); err != nil {
fmt.Printf("错误: %v\n", err)
os.Exit(1)
}
case "single":
if len(os.Args) < 4 {
fmt.Println("用法: go run pm_generator.go single <input_file> <output_file>")
os.Exit(1)
}
inputFile := os.Args[2]
outputFile := os.Args[3]
fmt.Printf("处理单个文件: %s -> %s\n", inputFile, outputFile)
if err := generatePMDataFromSchema(inputFile, outputFile); err != nil {
fmt.Printf("错误: %v\n", err)
os.Exit(1)
}
case "summary":
if len(os.Args) < 3 {
fmt.Println("用法: go run pm_generator.go summary <file>")
os.Exit(1)
}
file := os.Args[2]
if err := printPMDataSummary(file); err != nil {
fmt.Printf("错误: %v\n", err)
os.Exit(1)
}
default:
fmt.Printf("未知命令: %s\n", command)
os.Exit(1)
}
}

47
docs/nbi/pm/protocol.md Normal file
View File

@@ -0,0 +1,47 @@
# OMC->北向通信协议 基于redis stream消息队列实现
## 告警关联关系数据上报变更
alarm_relation告警新增时
* streamkey和数据格式
```json
alarm_relation
{
"payload": "{\"ids\":[\"871847\",\"557903\"]}"
}
```
1、871847,557903为alarm_relation表主键至少一个数据
## 资源数据上报变更
nbi_cm表新增时
* streamkey和数据格式
```json
nbi_cm
{
"payload": "{\"ids\":[\"642470\",\"105633\"]}"
}
```
1、642470,105633为nbi_cm表主键IDID支持多个
## 1分钟性能订阅上报数据
kpi_report_*表新增时
* 数据格式
```json
nbi_pm
{
"payload": "{\"neType\":\"AMF\",\"id\":\"606538\"}"
}
```
1、AMF、PCF等为具体对应的网元
2、606538为kpi_report_amf、kpi_report_pcf等表主键IDID支持一个

View File

@@ -0,0 +1,66 @@
-- 1. 建辅助数字表
DROP TABLE IF EXISTS tmp_num_100;
CREATE TABLE tmp_num_100 (n TINYINT UNSIGNED PRIMARY KEY);
INSERT INTO tmp_num_100(n)
SELECT a.n + b.n AS n FROM (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) a
CROSS JOIN (
SELECT 0 n UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40
UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90
) b
ORDER BY a.n + b.n;
DROP TABLE IF EXISTS tmp_num_500;
CREATE TABLE tmp_num_500 (n SMALLINT UNSIGNED PRIMARY KEY);
INSERT INTO tmp_num_500(n)
SELECT t.n FROM (
SELECT @r:=@r+1 n
FROM (SELECT 0 FROM tmp_num_100) a,
(SELECT 0 FROM tmp_num_100) b,
(SELECT @r:=-1) init
LIMIT 500
) t;
-- 2. 目标表(若未建)
-- CREATE TABLE cdr_event_smsc (
-- id BIGINT AUTO_INCREMENT PRIMARY KEY,
-- ne_type VARCHAR(16),
-- ne_name VARCHAR(64),
-- rm_uid VARCHAR(64),
-- `timestamp` BIGINT,
-- cdr_json JSON,
-- created_at DATETIME,
-- tenant_id VARCHAR(64)
-- ) ENGINE=InnoDB;
-- 3. 关闭一些约束提高插入速度(可选)
SET autocommit = 0;
SET unique_checks = 0;
SET foreign_key_checks = 0;
-- 4. 插入 500 万100 * 100 * 500
-- 随机时间:过去一年内的任意秒(不均匀)
SET @start_ts = UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 365 DAY));
SET @range_sec = 365 * 24 * 3600;
INSERT INTO cdr_event_smsc
(ne_type, ne_name, rm_uid, `timestamp`, cdr_json, created_at)
SELECT
'SMSC' AS ne_type,
'SMSC_001' AS ne_name,
'4400HXSMSC001' AS rm_uid,
@start_ts + FLOOR(RAND()*@range_sec) AS `timestamp`,
'{\"calledParty\":\"15731123455\",\"callerParty\":\"18165338055\",\"cause\":28,\"recordType\":\"MTSM\",\"result\":0,\"serviceType\":\"Normal\",\"updateTime\":\"2025-08-18T11:09:52.703Z\"}' AS cdr_json,
NOW() AS created_at
FROM tmp_num_100 a
CROSS JOIN tmp_num_100 b
CROSS JOIN tmp_num_500 c;
COMMIT;
-- 5. 恢复
SET unique_checks = 1;
SET foreign_key_checks = 1;
SET autocommit = 1;

View File

@@ -6,9 +6,10 @@
%define project_lname omc
%define project_Uname OMC
Name: %{project_lname}
Summary: 5GC OMC
Version: 2.2503.5
Version: 2.2508.2
Release: %{release_date}
Vendor: omc
URL: https://www.omc.com/
@@ -28,6 +29,13 @@ chmod +rx ${RPM_BUILD_ROOT}/usr/local/bin/*
chmod +x ${RPM_BUILD_ROOT}/usr/local/omc/htdocs/front
chmod +rx ${RPM_BUILD_ROOT}/usr/lib64/*
# 安装前执行
%pre
echo -n "Stopping OMC service ... "
systemctl stop restagent.service
systemctl stop sshsvc.service
echo "done"
# 安装完成后执行
%post
OMCRootDir=/usr/local/omc
@@ -38,13 +46,13 @@ OMCStaticDir=${OMCRootDir}/static
UsrLocalBinDir=/usr/local/bin
OMCDaemon=omcd
NginxEtcDir=/etc/nginx
CFileList="restconf.yaml sshsvc.yaml omc.conf"
CFileList=$(ls ${OMCEtcDir}/default)
LogoFileList="zh_brand.png zh_icon.png en_brand.png en_icon.png"
echo -n "Stopping OMC service ... "
systemctl stop restagent.service
systemctl stop sshsvc.service
echo "done"
# echo -n "Stopping OMC service ... "
# systemctl stop restagent.service
# systemctl stop sshsvc.service
# echo "done"
for CFile in ${CFileList}; do
if [ ! -e "${OMCEtcDir}/${CFile}" ]; then
@@ -67,12 +75,17 @@ done
if ! id -u omc >/dev/null 2>&1 ; then useradd -d /opt/omc -m -s /bin/bash -p1000ftp@kp omc; else echo "user omc exist"; fi
mkdir -p /opt/omc/ftp
mkdir -p /opt/omc/ftp/log
cd ${UsrLocalBinDir}
if [ ! -e ${OMCDaemon} ]; then ln -s ${OMCBinDir}/omcsvc.sh ${OMCDaemon}; fi
if [ ! -e ${UsrLocalBinDir}/${OMCDaemon} ]; then
echo -n "Creating symbolic link ${UsrLocalBinDir}/${OMCDaemon} ... "
ln -s ${OMCBinDir}/omcsvc.sh ${UsrLocalBinDir}/${OMCDaemon};
echo "done"
fi
# setting firewall
PortList="80 443 44080 44443 33030 22222"
for Port in ${PortList}; do
port_list="80 443 44080 44443 33030 33443 33066 6379 22222"
for Port in ${port_list}; do
echo -n "firewall-cmd add port ${Port} ... "
firewall-cmd --zone=public --add-port=${Port}/tcp --permanent
done
firewall-cmd --reload
@@ -97,22 +110,15 @@ if [ "$M_PARAM" = "install" -o "$M_PARAM" = "upgrade" ]; then
fi
fi
echo -n "Starting OMC service ... "
systemctl start sshsvc.service
systemctl start restagent.service
echo "done"
# echo -n "Starting OMC service ... "
# systemctl start sshsvc.service
# systemctl start restagent.service
# echo "done"
# 卸载时执行
%postun
UsrLocalBinDir=/usr/local/bin
rm -f ${UsrLocalBinDir}/omcd
# setting firewall
PortList="80 443 44080 44443 33030 22222"
for Port in ${PortList}; do
firewall-cmd --zone=public --remove-port=${Port}/tcp --permanent
done
firewall-cmd --reload
OMCDaemon=omcd
if [ "$1" = "0" ] ; then
sudo systemctl stop restagent.service
@@ -122,12 +128,22 @@ if [ "$1" = "0" ] ; then
sudo systemctl disable restagent.service
sudo systemctl disable sshsvc.service
sudo systemctl daemon-reload
# setting firewall
port_list="80 443 44080 44443 33030 33443 33066 6379 22222"
for Port in ${port_list}; do
echo -n "firewall-cmd remove port ${Port} ... "
firewall-cmd --zone=public --remove-port=${Port}/tcp --permanent
done
firewall-cmd --reload
rm -f ${UsrLocalBinDir}/${OMCDaemon}
else
echo -n "Starting OMC service ... "
sudo systemctl daemon-reload
sudo systemctl stop restagent.service
sudo systemctl stop sshsvc.service
sudo systemctl start sshsvc.service
sudo systemctl start restagent.service
echo "done"
fi
# 规定那些文件必须放入安装程序中,如果没有就报错