diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7206e22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +# ---> VisualStudioCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ +.idea/ + +# Run temp file and dir +crontask/log/ +crontask/ftp/ +crontask/database/ +crontask/export/ +crontask/temp +crontask/crontask + +restagent/backup/ +restagent/log/ +restagent/upload/ +restagent/software/ +restagent/database/ +restagent/license/ +restagent/restagent + +sshsvc/sshsvc +sshsvc/mmllog/ +sshsvc/mmlhome/ +sshsvc/log/ + +captrace/captrace +captrace/log/ + +tools/loadmconf/loadmconf +tools/loadpconf/loadpconf + +reference +vendor + +# Built Visual Studio Code Extensions +*.vsix +*.log +*.log-* +*.bak +*.bak* +*.exe +__debug_bin*.exe + diff --git a/restagent/config/config.go b/restagent/config/config.go new file mode 100644 index 0000000..43a34dc --- /dev/null +++ b/restagent/config/config.go @@ -0,0 +1,358 @@ +package config + +import ( + "fmt" + "nms_nbi/lib/global" + "nms_nbi/lib/log" + "os" + "strings" + + "gopkg.in/yaml.v3" +) + +type DbConfig struct { + Type string `yaml:"type"` + User string `yaml:"user"` + Password string `yaml:"password"` + Host string `yaml:"host"` + Port string `yaml:"port"` + Name string `yaml:"name"` + Backup string `yaml:"backup"` +} + +// Yaml struct of config +type YamlConfig struct { + Logger struct { + File string `yaml:"file"` + Level string `yaml:"level"` + Duration int `yaml:"duration"` + Count int `yaml:"count"` + } `yaml:"logger"` + + Rest []struct { + IPv4 string `yaml:"ipv4"` + IPv6 string `yaml:"ipv6"` + Port uint16 `yaml:"port"` + Scheme string `yaml:"scheme"` + ClientAuthType int `yaml:"clientAuthType"` + CaFile string `yaml:"caFile"` + CertFile string `yaml:"certFile"` + KeyFile string `yaml:"keyFile"` + } `yaml:"rest"` + + WebServer struct { + Enabled bool `yaml:"enabled"` + RootDir string `yaml:"rootDir"` + Listen []struct { + Addr string `yaml:"addr"` + Scheme string `yaml:"scheme"` + ClientAuthType int `yaml:"clientAuthType"` + CaFile string `yaml:"caFile"` + CertFile string `yaml:"certFile"` + KeyFile string `yaml:"keyFile"` + } `yaml:"listen"` + } `yaml:"webServer"` + + Database DbConfig `yaml:"database"` + + OMC struct { + UriPrefix string `yaml:"uriPrefix"` + NeType string `yaml:"neType"` + NeId string `yaml:"neId"` + RmUID string `yaml:"rmUID"` + NeName string `yaml:"neName"` + Province string `yaml:"province"` + Vendor string `yaml:"vendor"` + Dn string `yaml:"dn"` + Chk2Ne bool `yaml:"chk2ne"` + Sn string `yaml:"sn"` + CheckSign bool `yaml:"checksign"` + RootDir string `yaml:"rootDir"` + BinDir string `yaml:"binDir"` + Backup string `yaml:"backup"` + Upload string `yaml:"upload"` + FrontUpload string `yaml:"frontUpload"` + FrontTraceDir string `yaml:"frontTraceDir"` + Software string `yaml:"software"` + License string `yaml:"license"` + GtpUri string `yaml:"gtpUri"` + CheckContentType bool `yaml:"checkContentType"` + TestMode bool `yaml:"testMode"` + RBACMode bool `yaml:"rbacMode"` + RunDir string `yaml:"runDir"` + CmdTimeout int `yaml:"cmdTimeout"` + } `yaml:"omc"` + + Alarm struct { + ForwardAlarm bool `yaml:"forwardAlarm"` + Email struct { + Smtp string `yaml:"smtp"` + Port uint16 `yaml:"port"` + User string `yaml:"user"` + Password string `yaml:"password"` + TlsSkipVerify bool `yaml:"tlsSkipVerify"` + } `yaml:"email"` + SMS struct { + ApiURL string `yaml:"apiURL"` + AccessKeyID string `yaml:"AccessKeyID"` + AccessKeySecret string `yaml:"accessKeySecret"` + SignName string `yaml:"signName"` + TemplateCode string `yaml:"templateCode"` + } `yaml:"sms"` + SMSC struct { + Addr string `yaml:"addr"` + UserName string `yaml:"userName"` + Password string `yaml:"password"` + } `yaml:"smsc"` + } `yaml:"alarm"` + + MML struct { + Port int `yaml:"port"` + Port2 int `yaml:"port2"` + Sleep int64 `yaml:"sleep"` + DeadLine int64 `yaml:"deadLine"` + User string `yaml:"user"` + Password string `ymal:"password"` + MmlHome string `yaml:"mmlHome"` + Upload string `yaml:"upload"` + } `yaml:"mml"` + + NE struct { + Addr string `yaml:"addr"` + Port uint16 `yaml:"port"` + User string `yaml:"user"` + EtcDir string `yaml:"etcdir"` + BinDir string `yaml:"bindir"` + OmcDir string `yaml:"omcdir"` + ScpDir string `yaml:"scpdir"` + LicenseDir string `yaml:"licensedir"` + EtcListIMS string `yaml:"etcListIMS"` + EtcListDefault string `yaml:"etcListDefault"` + DpkgOverwrite bool `yaml:"dpkgOverwrite"` + DpkgTimeout int `yaml:"dpkgTimeout"` + } `yaml:"ne"` + + Auth struct { + Crypt string `yaml:"crypt"` + Token bool `yaml:"token"` + Expires uint32 `yaml:"expires"` + Session string `yaml:"session"` + PublicKey string `yaml:"publicKey"` + PrivateKey string `yaml:"privateKey"` + } `yaml:"auth"` + + Params struct { + RmUIDMaxNum int `yaml:"rmuidmaxnum"` + AlarmIDMaxNum int `yaml:"alarmidmaxnum"` + PmIDMaxNum int `yaml:"pmidmaxnum"` + SubIDMaxNum int `yaml:"subidmaxnum"` + UriMaxLen int `yaml:"urimaxlen"` + RmUIDRegexp string `yaml:"rmuidregexp"` + } `yaml:"params"` + + TestConfig struct { + Enabled bool `yaml:"enabled"` + File string `yaml:"file"` + } `yaml:"testConfig"` +} + +type TestDatas struct { + UDM struct { + CapUsed uint32 `yaml:"capUsed"` + FeatureEnabled []string `yaml:"featureEnabled"` + } `yaml:"udm"` + AUSF struct { + CapUsed uint32 `yaml:"capUsed"` + FeatureEnabled []string `yaml:"featureEnabled"` + } `yaml:"ausf"` + AMF struct { + CapUsed uint32 `yaml:"capUsed"` + FeatureEnabled []string `yaml:"featureEnabled"` + } `yaml:"amf"` + SMF struct { + CapUsed uint32 `yaml:"capUsed"` + FeatureEnabled []string `yaml:"featureEnabled"` + } `yaml:"smf"` + UPF struct { + CapUsed uint32 `yaml:"capUsed"` + FeatureEnabled []string `yaml:"featureEnabled"` + } `yaml:"upf"` +} + +type NeTestData struct { + CapUsed uint32 `yaml:"capUsed"` + FeatureEnabled []string `yaml:"featureEnabled"` +} +type TestDataMap struct { + NeTestDatas []map[string]NeTestData +} + +var yamlConfig YamlConfig + +func ReadConfig(configFile string) { + yamlFile, err := os.ReadFile(configFile) + if err != nil { + fmt.Println("Read yaml config file error:", err) + os.Exit(2) + } + // fmt.Println("yamlfile:", string(yamlFile)) + + err = yaml.Unmarshal(yamlFile, &yamlConfig) + if err != nil { + fmt.Println("Unmarshal error:", err) + os.Exit(3) + } +} + +func WriteYamlConfig(newConfigData YamlConfig, configFile string) { + // 将配置转换回YAML数据 + newYamlData, err := yaml.Marshal(&newConfigData) + if err != nil { + log.Errorf("Failed to marshal YAML: %v", err) + } + + // 将新的YAML数据写入文件 + err = os.WriteFile(configFile, newYamlData, 0644) + if err != nil { + log.Errorf("Failed to write YAML file: %v", err) + } +} + +var mapYaml map[string]interface{} + +func ReadParamConfig(fileName string) *map[string]interface{} { + file, err := os.ReadFile(fileName) + if err != nil { + fmt.Println("Read yaml file error:", err) + } + + mapYaml = make(map[string]interface{}) + + err = yaml.Unmarshal(file, &mapYaml) + if err != nil { + fmt.Printf("yaml.Unmarshal: %v when to struct", err) + } + // fmt.Println("mapYaml:", mapYaml) + + return &mapYaml +} + +func GetYamlConfig() *YamlConfig { + return &yamlConfig +} + +func GetAuthFromConfig() interface{} { + return yamlConfig.Auth +} + +func GetExpiresFromConfig() uint32 { + return yamlConfig.Auth.Expires +} + +func GetRmUIDFromConfig() string { + return yamlConfig.OMC.RmUID +} + +func GetRmUIDRegexpFromConfig() string { + return yamlConfig.Params.RmUIDRegexp +} + +func GetRmUIDMaxNumFromConfig() int { + return yamlConfig.Params.RmUIDMaxNum +} + +func GetAlarmIDMaxNumFromConfig() int { + return yamlConfig.Params.AlarmIDMaxNum +} + +func GetPmIDMaxNumFromConfig() int { + return yamlConfig.Params.PmIDMaxNum +} + +func GetSubIDMaxNumFromConfig() int { + return yamlConfig.Params.SubIDMaxNum +} + +func GetUriMaxLenFromConfig() int { + return yamlConfig.Params.UriMaxLen +} + +func GetLogLevel() log.LogLevel { + var logLevel log.LogLevel + switch strings.ToLower(yamlConfig.Logger.Level) { + case "trace": + logLevel = log.LOG_TRACE + case "info": + logLevel = log.LOG_INFO + case "debug": + logLevel = log.LOG_DEBUG + case "warn": + logLevel = log.LOG_WARN + case "error": + logLevel = log.LOG_ERROR + case "fatal": + logLevel = log.LOG_FATAL + case "off": + logLevel = log.LOG_OFF + default: + logLevel = log.LOG_DEBUG + } + return logLevel +} + +var ( + DefaultUriPrefix string = "/api/rest" + UriPrefix string = "/omc/rest" + //TestDataUDM []map[string]interface{} + TDatas map[string]NeTestData +) + +func ReadTestConfigYaml(pfile string) (ret error) { + file, err := os.ReadFile(pfile) + if err != nil { + return err + } + + err = yaml.Unmarshal(file, &TDatas) + if err != nil { + fmt.Println("Failed to Unmarshal:", err) + return err + } + + return nil +} + +func GetDefaultUserAgent() string { + return "OMC-restagent/" + global.Version +} + +// const defaultConfigFile = "./etc/restconf.yaml" + +// func init() { +// cfile := flag.String("c", defaultConfigFile, "config file") +// pv := flag.Bool("version", false, "print version") +// ph := flag.Bool("help", false, "print help") + +// //global.BuildTime = "Wed May 31 18:24:04 CST 2023" +// //global.GoVer = "go version go1.15.7 linux/arm64" +// flag.Parse() +// if *pv { +// fmt.Printf("OMC restagent version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) +// os.Exit(0) +// } +// if *ph { +// flag.Usage() +// os.Exit(0) +// } + +// // 使用viper读取配置 +// conf.InitConfig(*cfile) + +// ReadConfig(*cfile) +// if GetYamlConfig().OMC.UriPrefix != "" { +// UriPrefix = GetYamlConfig().OMC.UriPrefix +// } +// if GetYamlConfig().TestConfig.Enabled { +// ReadTestConfigYaml(GetYamlConfig().TestConfig.File) +// } +// } diff --git a/restagent/config/map.go b/restagent/config/map.go new file mode 100644 index 0000000..b2c29a2 --- /dev/null +++ b/restagent/config/map.go @@ -0,0 +1,111 @@ +package config + +import ( + "io/ioutil" + "log" + + "gopkg.in/yaml.v3" + + "nms_nbi/lib/global" +) + +type Uri2Object struct { + Uri string `yaml:"uri"` + Object []Object `yaml:"object"` +} + +type Object struct { + Name string `yaml:"name"` + Syntax string `yaml:"syntax"` + Oid string `yaml:"oid"` +} + +var uri2Object []Uri2Object + +func ReadMap(pfile string) (ret error) { + file, err := ioutil.ReadFile(pfile) + if err != nil { + log.Println(err) + return err + } + + err = yaml.Unmarshal(file, &uri2Object) + if err != nil { + log.Println(err) + return err + } + /* + for _, v := range uri2Object { + log.Println(v) + } + */ + return nil +} + +func GetOid(uri string, oids *[]string) *[]string { + for _, v := range uri2Object { + if uri == v.Uri { + for _, o := range v.Object { + *oids = append(*oids, o.Oid) + } + } + } + + return oids +} + +func GetOidByFileds(uri string, fields []string, oids *[]string) *[]string { + for _, v := range uri2Object { + if uri == v.Uri { + for _, o := range v.Object { + if global.IsContain(o.Name, fields) || len(fields) == 0 { + *oids = append(*oids, o.Oid) + } + } + } + } + + return oids +} + +type NameOid struct { + Name string + Oid string +} + +type NameValue struct { + Name string + Value string +} + +func GetDataOid(Uri string, nameOids *[]NameOid) *[]NameOid { + var nameOid NameOid + for _, v := range uri2Object { + if Uri == v.Uri { + for _, o := range v.Object { + nameOid.Name = o.Name + nameOid.Oid = o.Oid + *nameOids = append(*nameOids, nameOid) + } + } + } + + return nameOids +} + +func GetDataOidByFields(uri string, fields []string, nameOids *[]NameOid) *[]NameOid { + var nameOid NameOid + for _, v := range uri2Object { + if uri == v.Uri { + for _, o := range v.Object { + nameOid.Name = o.Name + nameOid.Oid = o.Oid + if len(fields) == 0 || global.IsContainP(nameOid.Name, &fields, len(fields)) { + *nameOids = append(*nameOids, nameOid) + } + } + } + } + + return nameOids +} diff --git a/restagent/etc/certs/ca.crt b/restagent/etc/certs/ca.crt new file mode 100644 index 0000000..ed9c1a2 --- /dev/null +++ b/restagent/etc/certs/ca.crt @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE3TCCAsWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAQMQ4wDAYDVQQKEwVHbyBD +QTAeFw0yNDAxMDkwNzEyNTVaFw0zNDAxMDYwNzEyNTVaMBAxDjAMBgNVBAoTBUdv +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAx/mmbhCZS4XFvbn0 +btk8SuetjziP3kJ4/ijpwr8WD0JeskFf2qILNOCQMBOWqyxrd6kYCMyrrb/c5mX9 +q23TgV6qghp/0xoA70SHvcqv6F4ssOJSvaN29ud3puKyWgvToNGY/z5pU0IQCUtQ +6CJWJo4gUaB/5vH1ipheU7Xsiw5bNeFaWQ/nxsTwvoZVfk7noiAMd/W8nAGJbhxC +ByJhs1AZQ9d4yEezLrpyDqOdehffrEse+8BlytqkKhHYinAE4pqgeDcln05fxWrz +zzYRw2GiHFfioo4labueTe8eoOBHYJpFmthfdsgrth9+aSA5GKHpXQ0rzaahgcGU ++S9XFjYxWkMXMiUQhCFNd+1IFi0NsLas04UwXLu1x4CL7d/BRlzR6ezwq6hnxTOc +FMXAcpnfnKzF7WOHvGa/dsr92hpX48K64cHtlCLfeRR4E/60LJ6FYjqpNKgai+s+ +sbeOOyKskCQ0wHNElrebojdYlkXzam0rKbnNJNERx8/v48cwt0F5LNnN6a2CDVPN +LGMwBSNDZbiiI53Q6DE7H71XkZjkR0NRqmcIm+ElecpBLavicqfNlg8JLoorJQSW +oiSJmyxqIjnqNrfmk/l30jI2lVal4c1QSBFrFsob9rBLkXGM1EWb0PSMrwZM29et +Ch8zvN7FlOPC76cIw2QmAxWVJ+kCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOCdRGl2aikRXamo4qJu9wQ7kqI9MA0G +CSqGSIb3DQEBCwUAA4ICAQC/osh2VHoJoyG8Z3vdLH+0XZ04I8Ih2BQBcPKPZ1v0 +vdVDrQ6ldkgSKhM+/of9XtzvtphV7Yxq4LFipu9HE2xNmZjOMXZgsGgQ4qS3KkDk +u0/q7ZmE8MG7uLW76m7PGNO4Ugz3k6yVx0KVC/Fy9YdWwKkl8nL93nPqWRsN/jwE +WRyZ822Xnz19cY5vFbaO5fO1hW5+3U50Kh7BWuyd7TZ+OT8KmY834DKLDDnWdcPW +/k6Je1Y0H79E/SIjFkCxCNTDNS5SVHfTr0BCbVMXXi5dbNTjhY41TM+JwIKa1fVB +YhzWqk16riDYa+bg2xcdda8B0lQT8qRrMGFtjPsqyNhNoTFRUXx9HKX3VBIXqmlD +7v7lCWbvXkCjb2mAEG5ayy1lHKkOd6Q1E0HXZST2PHIippOFwndGz0P9tij+g1Df +cDisGxdfOZwpJTLhO5QYDom6YQgcWxfOUPK1HVnRrbniEQIykHldoIk3YL+vGwRZ +qEcJDf4F98KyxfYv9OvMGfP+imyOg4Yh4HKt4Cm+WxoKbF+qO3kPgXzGgLfthKNe +qi8fKCnbe91yuXzvKfjtfS7SYz9E0mlZkUUcpQ9r7thk4xEF5PHxHjFzZYzLX5c3 +SMfjmtiTnD0wPFlaDtd/3absBC7xHCfs3v+DfyKyuYOvi2CUHiR2k8sZIDaEpwxF +Dw== +-----END CERTIFICATE----- diff --git a/restagent/etc/certs/omc-ca.crt b/restagent/etc/certs/omc-ca.crt new file mode 100644 index 0000000..43bde59 --- /dev/null +++ b/restagent/etc/certs/omc-ca.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID4TCCAcmgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAQMQ4wDAYDVQQKEwVHbyBD +QTAeFw0yNDAxMDkwNzEyNTVaFw0zNDAxMDYwNzEyNTVaMBQxEjAQBgNVBAoTCUdv +IE9NQyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPidCkI9UhWg +7EOKoS/JGH95Q3ekfU+rK0EULJbJfeszJkYZ2u2gQ5gbBcyWUQvFhOuFpgcchsGA +Vy3QfudO0Jxysf67rBFFjyB2NQXc68B3zJS5L+N9P0XEwgz9hr9rijDrNT8RvY+z +L8Blrbl4oBEssOEyFOBYkHIMlvUEIMZYaA1NPA+Wwk8x3ENS1YVGml5u7JBk2oe2 +gHDktHe98hU0Nd88K3ZxGte3pwmeynMslTw9Oct6Wy2fu0zcZlnJZPmoY2LXYyhx +mj9oO3n5KgXxHlfGxPl5N2lqu/tmAr/1fAwUKVHUZzpmIbEyqMTDow8qTvjYa4o/ +41Bvg1JOrDsCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFJ2woDwnDKwmU3bU8cA+EAG0MVMwMA0GCSqGSIb3DQEBCwUA +A4ICAQAuT4aMkcJWZeAJXGjSxSCoLclnrQw4SAVjNvIUNS83+0flHLTFzj1fAU4M +/RZjZE22mdF+wgAhMfC+zoJq7plHELSkG9HY1dmscK7MVRrVdnooYD+HXS8rjOaD +oUapFmEK5ivXF6Cx1gQoPeo/Q0FRDd9Ky5rjB0vWFxsnU/BZkfOLCC2zQoZcL+UN +rmSq+iPkUMvFDVWSR/XY+xtXaW9GboqaqtoNvR24RSquI5xe1Co7JuDuu+j83lv/ +5YpOG14pNA3IF6TNFChR63l/VkaT15QDSnKxSgIQdcaPuv9yvA7OPIiaTOAqcDKi +4RSTqRezh6TnbWIFSJI03EY8gFa7PkelcWqurCXgc4vevC3bLAHuys4QIVboq0yw +CmCMVmJtgyXT15yc4x+ivwHyDT25wI2ynPnoXgKqzudFav0ZhoR7l2YmH2by7wrN +5AnNbyer72NJhKRleLyboPtqWwTLfvtOW2Aqbg+cWKwTq9NNAqJ47tZ1ZrCuWI/H +oOehNKM5QpW5k6shWuOmhYD9kROE/D1U9huzGEzijUZkT4yUF0udCNoFofz6wl4t +Czk1+Pjd3tecIj9/NitBiDzjCPJVXeAOphvCO0Z0R5fKA+Y/4kd+HmiuNiW1tnGG +D7z+beF+SsnagRquwdfZTpICfu/2+ogHwfxpsm8cHhx8DzMslA== +-----END CERTIFICATE----- diff --git a/restagent/etc/certs/omc-server.crt b/restagent/etc/certs/omc-server.crt new file mode 100644 index 0000000..eebe4b0 --- /dev/null +++ b/restagent/etc/certs/omc-server.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC2jCCAcKgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQKEwlHbyBP +TUMgQ0EwHhcNMjQwMTA5MDcxMjU1WhcNMzQwMTA2MDcxMjU1WjAVMRMwEQYDVQQK +EwpPTUMgU2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApSTG +HNOWScYVHHiGw9z8q2u3ZMUaOFBm6+F4p4PrpM1h3FtHmYv5IWr5kqoMgCU/FmPG +HrSqDzrm+J4QMdguq40Jd4QOadiDg5oyLIM6Su32sjtG/y5an3abtY9hNCoWDdpy +kNRb1i9NQ2uTSBHm1lTVWutZWgm7D9jES8JB2byDwAOONwGlqAw6buxUlIP2vCtn +SpMF8Mqdypnw8K17DLXpP+D8Exw4mjOmJEVOGnw/pinjDCHm9SEiFtagdXIWliwl +DgbyVeSE70JhaGV2bGlmldV2sN2qPvG/W99pCeObxNcCko9JdJqsDVQTiOTY6uaH +o/GdDnzZh4TbbDutDQIDAQABozYwNDAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAww +CgYIKwYBBQUHAwEwDQYDVR0OBAYEBAECAwQwDQYJKoZIhvcNAQELBQADggEBAJY6 +eI54wSn+kNteFEdoFS2jVM+GAMS0x4blX2wzNro6HqhlYC6oJ8TxRS6V22ugWLFX +M/pcqV5FA1XCSibYdwscdaoUSUYc6inlkHxrbfSryiQqXAkEv8Ote3dqtOu7Z0BY +PkykdMrCUXn5ksYgoTa7G1CdAiaKMeuTz801l1g8AIOpNV1+Xhi29TKA134VDW9S +2aDcD6jEs63rqKx/knStli0F58N0kOKjmmt45stP90o5NsshAMumzP0xhfwC94Gg +eBXg6ThM3nuOBQyzPEtUZioRKKV4XmgZF/F4ePCnS4ST9ft09kx7UcR9MVzGIHov +whwVw6o5O7h1xQr6Pjw= +-----END CERTIFICATE----- diff --git a/restagent/etc/certs/omc-server.key b/restagent/etc/certs/omc-server.key new file mode 100644 index 0000000..b1b3a94 --- /dev/null +++ b/restagent/etc/certs/omc-server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEApSTGHNOWScYVHHiGw9z8q2u3ZMUaOFBm6+F4p4PrpM1h3FtH +mYv5IWr5kqoMgCU/FmPGHrSqDzrm+J4QMdguq40Jd4QOadiDg5oyLIM6Su32sjtG +/y5an3abtY9hNCoWDdpykNRb1i9NQ2uTSBHm1lTVWutZWgm7D9jES8JB2byDwAOO +NwGlqAw6buxUlIP2vCtnSpMF8Mqdypnw8K17DLXpP+D8Exw4mjOmJEVOGnw/pinj +DCHm9SEiFtagdXIWliwlDgbyVeSE70JhaGV2bGlmldV2sN2qPvG/W99pCeObxNcC +ko9JdJqsDVQTiOTY6uaHo/GdDnzZh4TbbDutDQIDAQABAoIBAHxE49+lSJ5TNGes +Op0AmhHUiLiHqWde+VPe4xALMTNeaZmMBqEAt4PyH8PBuo5jeMm8YsWQZbf4Nv42 +0zDu4I+vHcSV1tLHXo+VZNQiG6du0gjkmlRD6WW9twY00oySbu4Vx8g8RK80AQwO +01GURwRZ6gL0vtQGJoGSOIRZtXvGLltVR52OfkgNMjNepwtJvMV7PW5xYwEcnx+i +sZD/6hl49Qv5g4dCCGrnr8Garx9+cUkVP/ipkBnjyKACfzYQhoauo03Rv4iuNdy6 +QD9KB95ALHq66vYXF72YW75JQhQ3C1qGcghNn68RIlufSnA7D7J9VCG5VSXfVrk2 +a5Xw2HECgYEAzaXU75hl87fmf88X+8M6+OuaMnnLAwIadbcecakkO4bgzNF1SYwv +dbZ608LvdUt+BYVU43CCX3//a/MI+Ncp5sk85TLsXUxXGWonO1zXpa3+BAEXJe1n +xnWVdytWMeoyzhBZ/Vkx7/NAu5WSViXgQ3trB0Wr3OGw3Nksb4Son8cCgYEAzZQc +SlglEiU+Z+BsCV07FEkU6xgsmxQQuptPuGcm713Ik8c8a5KAyjbhpp+oBvn8v69i +hVGHcFmZYeazBL39dC4/6E/wDOVEwN2fY8oYBnrPvoz7FUTvObRjZakrgVj+XAjS +lg9RuMm1tYPFR52V5BTngJ9Rkj/AewxWnGMDtIsCgYEAng1i/5ZQXSUs+XPwCeY9 +b8yb4Ulr9u7p6SkJM+/8UefS5HfjPdiJLV5HPnOm2K5ht9qGqJrzCHT2mT/b2Gx9 +3ssxizI9KWOf2X+VkXFEqCh2fxtbcCHrTUNX0ZQ0Ff7adzdoAmhIEhQR31oQczd/ +Cj5Tvu4ULZoj9UjQdxEtDEcCgYAYrW3T8s7IZdYe7A6r9RgRcFBlhCpel0MG03v3 +W9KNq0lXi/QRya1SGNJviPzHkZyoeeourMHAV9EUsnfM2u2g06hyP55GPgNJz5DB +jtHhfT6Q1iWRwQuidqfz3SHOzhsCe0CkKMSblQMN/fphhWYn0eaURwuoraRyYOHI +tg4MzwKBgGImdyBx/l6bkWa4GywZ9iw5RDe7KYN9UclnBcHDkIELXskp8bTbwpBy +m/IyLC5eLOzdK7c2Odtd3LP/AG5fYPAzQ5S6YmSDPp1JEKODbg51wcMJpLSvG2Q/ +P5paV/ZAKbxgXpilBrjSejM/QLYqD8756z5lgo5biR7bGkBA+nkj +-----END RSA PRIVATE KEY----- diff --git a/restagent/etc/certs/omc-web.crt b/restagent/etc/certs/omc-web.crt new file mode 100644 index 0000000..a8b532d --- /dev/null +++ b/restagent/etc/certs/omc-web.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC5DCCAcygAwIBAgIBBDANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQKEwlHbyBP +TUMgQ0EwHhcNMjQwMTA5MDcxMjU2WhcNMzQwMTA2MDcxMjU2WjAWMRQwEgYDVQQD +EwtzZXJ2ZXIxLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2S +c4sRbErMBY8q8JVzNWRDBUUIWRBI6ENWCR/SzvF1a5gkxTnTWLtn4Szkclbsbwij +YWEXcuGaodIiY7gjJ8KM+x2qaFRVOxIoyTZvshBQUS8R8YPhnmQZHvEmoVScw9R3 +yKNLmIiXaTltP1tLoF+KSl6icqmY1bepDuhrZrYc4rLlU+BKvcWHf2xOozzd5KxX +ENaLWkIEWNWHOHWoScp8nfYNttEmz+kOwjikothkEfsXbFImNsdDrNk3ZYFUFnjv +S2lJPzwlc0hd+iHU5yC1YBDgAGpITSni0HqOzghNPHwwakGa96jGYw69AU1fAssI +TEELmhhwlHGm/MX+5IcCAwEAAaM/MD0wDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQM +MAoGCCsGAQUFBwMBMBYGA1UdEQQPMA2CC3NlcnZlcjEuY29tMA0GCSqGSIb3DQEB +CwUAA4IBAQDqoK6iKz7Q8L+0GgqD84tXJFbJKGnJNkyJaw/jCxlL6A8QTO7IB/ym +zZL3PcdNZYlyiNbyN62WzBKjYUaZMsXxEFtutav1GQsWmtQb3SO5Nn/8t+HFUwEt +YJc09LoLlYLOII0n8mN+CaMwv1mfZjWKewdXgwXvNzMrhOWJF9r+tRaJefNDpuT/ +dRj+iKFXG0aH4gCOc7Ur0HYjlQ+OFvUgWEOpk2OS1JeBNi4HjiQdAZbREg7PQI0D +sjMaHMIHC9WPZzEQ9InLmZzu0n++FKHFo8htz2bQFsNJNSB44pcKkJvpt1Xq854/ +rvcwWe89C7y5JCJGlzvHpGRecEMFPsZU +-----END CERTIFICATE----- diff --git a/restagent/etc/certs/omc-web.key b/restagent/etc/certs/omc-web.key new file mode 100644 index 0000000..4fadafd --- /dev/null +++ b/restagent/etc/certs/omc-web.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEArZJzixFsSswFjyrwlXM1ZEMFRQhZEEjoQ1YJH9LO8XVrmCTF +OdNYu2fhLORyVuxvCKNhYRdy4Zqh0iJjuCMnwoz7HapoVFU7EijJNm+yEFBRLxHx +g+GeZBke8SahVJzD1HfIo0uYiJdpOW0/W0ugX4pKXqJyqZjVt6kO6GtmthzisuVT +4Eq9xYd/bE6jPN3krFcQ1otaQgRY1Yc4dahJynyd9g220SbP6Q7COKSi2GQR+xds +UiY2x0Os2TdlgVQWeO9LaUk/PCVzSF36IdTnILVgEOAAakhNKeLQeo7OCE08fDBq +QZr3qMZjDr0BTV8CywhMQQuaGHCUcab8xf7khwIDAQABAoIBAE+rFe+yGpOmW7Lg +Ebd3Pv17KbMK5t5rqHgnyF5cA3Ke47jcv84P7P1v69IQNU8ijMBZRXwsKCXXNQlf +kYfWUwygay6tpd93k3p9UAX1dLS6ONkzEjjnWS02vpYPliNhJR2jsWsKasPfQ4QB +WgBMkRrpPcN8KscfiJEZPud9TJKvo/ffMDNOM01d2Lyytqt4mVvbQa68EjwoBSGe +6AEsEjoiLnnxlzuXXGCEcTXOEfcUeF8Bbk74lCJDdeXgrUB/Uy28FlhELsLpg2TD +IvwgJ3vFYEZzNKAVTsr4V8no8n4GButdQlSCpofACWx6mhq03535b+mSgN4AKLzR +YkhaQcECgYEA0x00F6rCneNzQ/b1wFK24OD59Nwu0NjKWYylXR++bbDHD/raJSCY +hBGFk/QB6KPVxH9ovoSSzov3o7nYBSXlTZCCm3Y1feaykHWkhKEsHcJ1tQXPehxe +40do8KI4vbaZwFk/gB4K5PQorizKDf3LEzz4R6TEFxVkzv4y4pq4yycCgYEA0nnc +tJnU1OtJNVW12+ABeiKxFbtAMpHGtqbg+ZJ9VRLJa813WkKbAtDMFTyvQa4sdIzV +F4yeApow4LILLICIcj8XfU0noGxmHAB66PgGPfx3Rj+AUxP7e24/vgF4DydKIr2J +5jwQc5EmCFBR0aQpmJsd808PtKPXJT5mIJrod6ECgYEAvmQ39qApo/rcmQ6/0xLF +m0lKI2nvTqo0003kVHesZYBoBiFVWuZqpbCnpycIEaavwuaksC0fuObCDwYrq3jh +s3IAV/PjigfkQiPWm0Y/Yxdc0ETNOHMdoBtmqJ2kTnO/dZkHi6OMb69CgNIj5zpb +Sp5Ry0rtDWRd5c+aVIL05UECgYEAtRPQlLQQDkqKhk9CEXOL8cbs8VRS6+7MthGm +VjD4kPuDvLJdb5MEB40ZN2ApK2msp20OW59HxddgG8Axqsy+FwQ+sjdx0yvPQWIM +XGgd/rA48X/qaA81+cAlKNPctbTIrFDC1ghw4uxKezaW3bTNcJRrVQt86J1YmJsx +g/Wh8GECgYEAhYFWpiMqcwoYYY7BFrYK4QGxPZ5OESevnJOvMRra5m+qlHhS8X9f +0Ewos6yV2qFZB7lRiPMve85ysUySwKl3rTWoJuwAlZZOkXU3MCjJ+5+nvMm7jzgf +eKWNu8avLOENdRu1bIFKM8iTVs+zDpe8LpcuEs4D+Ql7Gw2+9cZmanw= +-----END RSA PRIVATE KEY----- diff --git a/restagent/etc/restconf-t.yaml b/restagent/etc/restconf-t.yaml new file mode 100644 index 0000000..8bdccfb --- /dev/null +++ b/restagent/etc/restconf-t.yaml @@ -0,0 +1,134 @@ +# 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: d:/local.git/nms_nbi/restagent/log/restagent-t.log + level: trace + duration: 24 + count: 2 + +# rest agent listen ipv4/v6 and port, support multiple routines +# ip: 0.0.0.0 or ::0, support IPv4/v6 +rest: + - ipv4: 0.0.0.0 + ipv6: + port: 33030 + - ipv4: 0.0.0.0 + ipv6: + port: 36060 + +database: + type: mysql + user: root + password: 1000omc@kp! + host: 127.0.0.1 + port: 33066 + name: omc_db + backup: d:/local.git/nms_nbi/restagent/database + +# Redis 缓存数据,数据源声明全小写 +redis: + dataSource: + # OMC系统使用库 + default: + port: 6379 # Redis port + host: "192.168.2.166" # Redis host + password: "" + db: 10 # Redis db_num + # UDM网元用户库 + udmuser: + port: 6379 # Redis port + host: "192.168.2.166" + password: "" + db: 0 # Redis db_num + # 多个数据源时可以用这个指定默认的数据源 + defaultDataSourceName: "default" + +mml: + port: 4100 + sleep: 200 + user: admin + password: admin + mmlHome: ./mmlhome + +ne: + user: root + etcdir: /usr/local/etc + bindir: /usr/local/bin + omcdir: /usr/local/omc + scpdir: /tmp + licensedir: /usr/local/etc/{neType}/license + +# chk2ne: true/false, if put OmcNeConfig parameters to NE +omc: + uriPrefix: "/omc/rest" + neType: OMC + neId: 001 + rmUID: 4400HX101 + neName: OMC + province: GD + vendor: "" + dn: 4600 + chk2ne: false + sn: 13750650 + checksign: false + backup: ./backup + upload: ./upload + frontUpload: d:/local.git/fe.ems/upload + frontTraceDir: d:/local.git/fe.ems/trace + software: ./software + license: ./license + gtpUri: gtp:192.168.2.119:2152 + checkContentType: false + testMode: false + rbacMode: true + runDir: + +# Alarm module setting +# Forward interface: +# email/sms +alarm: + forwardAlarm: true + email: + smtp: smtp@xxx.com.cn + port: 25 + user: smtpuser + password: smtpuser@omc + sms: + apiURL: http://smsc.xxx.com.cn/ + accessKeyID: xxxx + accessKeySecret: xxxx + signName: xxx SMSC + templateCode: 1000 + +#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: ./etc/certs/omc_pub.key + privateKey: ./etc/certs/omc_pri.key + +# 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: true + file: ./etc/testconfig.yaml \ No newline at end of file diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml new file mode 100644 index 0000000..f65509b --- /dev/null +++ b/restagent/etc/restconf.yaml @@ -0,0 +1,202 @@ +# 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: d:/local.git/be.ems/restagent/log/restagent.log + level: trace + duration: 24 + count: 2 + +# 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: 33040 + - ipv4: 0.0.0.0 + ipv6: + port: 33443 + scheme: https + clientAuthType: 0 + caFile: ./etc/certs/omc-ca.crt + certFile: ./etc/certs/omc-server.crt + keyFile: ./etc/certs/omc-server.key + +webServer: + enabled: true + rootDir: d:/local.git/fe.ems.vue3/dist + listen: + - addr: :80 + schema: http + - addr: :443 + scheme: https + clientAuthType: 0 + caFile: ./etc/certs/omc-ca.crt + certFile: ./etc/certs/omc-server.crt + keyFile: ./etc/certs/omc-server.key + +database: + type: mysql + user: root + password: 1000omc@kp! + host: 127.0.0.1 + port: 33066 + name: omc_db + backup: d:/local.git/be.ems/restagent/database + +# Redis 缓存数据,数据源声明全小写 +redis: + dataSource: + # OMC系统使用库 + default: + port: 6379 # Redis port + host: "192.168.2.219" # Redis host + password: "123456" + db: 10 # Redis db_num + # UDM网元用户库 + udmuser: + port: 6379 # Redis port + host: "192.168.2.219" + password: "123456" + db: 0 # Redis db_num + # 多个数据源时可以用这个指定默认的数据源 + defaultDataSourceName: "default" + +# sleep: time delay for after write buffer (millisecond) +# deadLine: timeout for io read and write (second) +mml: + port: 4100 + port2: 5002 + sleep: 200 + deadLine: 10 + user: admin + password: admin + mmlHome: ./mmlhome + upload: /home/agtuser + +# NE config +ne: + user: root + 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,no space + 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: GD + vendor: "" + dn: 4600 + chk2ne: false + sn: "-" + checksign: false + rootDir: ./ + binDir: ./bin + backup: ./backup + upload: ./upload + frontUpload: d:/local.git/fe.ems/upload + frontTraceDir: d:/local.git/fe.ems/trace + software: ./software + license: ./license + gtpUri: gtp:192.168.2.219:2152 + checkContentType: false + testMode: false + rbacMode: true + runDir: + cmdTimeout: 120 + +# Alarm module setting +# Forward interface: +# email/sms +alarm: + forwardAlarm: true + email: + smtp: mail.agrandtech.com + port: 25 + user: smtpext@agrandtech.com + password: "1000smtp@omc!" + # TLS skip verify: true/false + tlsSkipVerify: true + sms: + apiURL: http://smsc.xxx.com.cn/ + accessKeyID: xxxx + accessKeySecret: xxxx + signName: xxx SMSC + templateCode: 1000 + smsc: + addr: "192.168.14.211:2775" + userName: OMC + password: "123456" + +#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: ./etc/certs/omc_pub.key + privateKey: ./etc/certs/omc_pri.key + +# 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: true + file: ./etc/testconfig.yaml + +# NMS-中国星网研究院 +cxy: + # 专业编码2位 核心网HX 无线网WX + professionCode: "HX" + # 厂商编码2位 中信科ZX + vendorCode: "AG" + # OMC编号3位 + omcCode: "001" + # 设备序列号 + serialNumber: "1153492" + # Kafka配置 + kafka: + addrs: + - "192.168.5.59:19092" + - "192.168.5.59:29092" + - "192.168.5.59:39092" + # OSS配置 + oss: + bucketname: "omc-bucket" + endpoint: "192.168.5.59:9000" + useSSL: false + accessKeyID: "aOW0r1gfw74G88Z3XZJ6" + secretAccessKey: "9tDErvtCEuVox6LoQu5BOVtycQKcQjlXOGvjl1eD" diff --git a/restagent/etc/testconfig.yaml b/restagent/etc/testconfig.yaml new file mode 100644 index 0000000..b001290 --- /dev/null +++ b/restagent/etc/testconfig.yaml @@ -0,0 +1,19 @@ +UDM: + capUsed: 16 + featureEnabled: [N8,N10,N13] +AUSF: + capUsed: 16 + featureEnabled: [N12] +AMF: + capUsed: 16 + featureEnabled: [N1,N2,N8,N11,N12,N14,N15] +SMF: + capUsed: 16 + featureEnabled: [N4,N7,N10,N11] +UPF: + capUsed: 16 + featureEnabled: [N3,N4,N6,N9] +OMC: + capUsed: 0 + featureEnabled: [] + diff --git a/restagent/makefile b/restagent/makefile new file mode 100644 index 0000000..0630d8a --- /dev/null +++ b/restagent/makefile @@ -0,0 +1,26 @@ +# Makefile for rest agent project + +PROJECT = OMC +VERSION = 2.2403.1 +PLATFORM = amd64 +ARMPLATFORM = aarch64 +BUILDDIR = ../../build +DEBBUILDDIR = ../../debbuild +RPMBUILDDIR = $(HOME)/goprojects/rpmbuild +INSTALLDIR = /usr/local/omc +RELEASEDIR = ../../release +LIBDIR = nms_nbi/lib +BINNAME = restagent + +.PHONY: build $(BINNAME) +build $(BINNAME): + go build -o $(BINNAME) -v -ldflags "-X '$(LIBDIR)/global.Version=$(VERSION)' \ + -X '$(LIBDIR)/global.BuildTime=`date`' \ + -X '$(LIBDIR)/global.GoVer=`go version`'" + +run: $(BINNAME) + ./$(BINNAME) + +clean: + rm ./$(BINNAME) + diff --git a/restagent/restagent.go b/restagent/restagent.go new file mode 100644 index 0000000..4c3c33b --- /dev/null +++ b/restagent/restagent.go @@ -0,0 +1,241 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "net/http" + "os" + "strconv" + "strings" + + "nms_nbi/features/dbrest" + "nms_nbi/features/event" + "nms_nbi/features/fm" + "nms_nbi/features/lm" + "nms_nbi/features/pm" + "nms_nbi/lib/dborm" + "nms_nbi/lib/global" + "nms_nbi/lib/log" + "nms_nbi/lib/routes" + "nms_nbi/restagent/config" + "nms_nbi/src" + "nms_nbi/src/framework/middleware" + libSession "nms_nbi/src/lib_features/session" + + "github.com/gin-gonic/gin" + "golang.org/x/net/http2" + "golang.org/x/net/http2/h2c" +) + +func HttpListen(addr string, router http.Handler) { + // 创建HTTP服务器 + h2s := &http2.Server{ + // ... + } + server := &http.Server{ + Addr: addr, + Handler: h2c.NewHandler(router, h2s), + } + + err := server.ListenAndServe() + if err != nil { + fmt.Println("ListenAndServe err:", err) + os.Exit(12) + } +} + +func HttpListenTLS(addr, caFile, certFile, keyFile string, clientAuthType int, router http.Handler) { + // 加载根证书 + caCert, err := os.ReadFile(caFile) + if err != nil { + log.Fatal(err) + } + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCert) + + // 创建自定义的TLS配置 + tlsConfig := &tls.Config{ + MinVersion: tls.VersionTLS10, + MaxVersion: tls.VersionTLS13, + ClientCAs: caCertPool, + ClientAuth: tls.ClientAuthType(clientAuthType), + } + + // 创建HTTP服务器 + server := &http.Server{ + Addr: addr, + Handler: router, + TLSConfig: tlsConfig, + } + + // support http 2.0 server + http2.ConfigureServer(server, &http2.Server{}) + if err != nil { + fmt.Println("ConfigureServer err:", err) + os.Exit(13) + } + err = server.ListenAndServeTLS(certFile, keyFile) + if err != nil { + fmt.Println("ListenAndServeTLS err:", err) + os.Exit(14) + } +} + +func HttpListenWebServerTLS(addr, caFile, certFile, keyFile string, clientAuthType int) { + // 加载根证书 + caCert, err := os.ReadFile(caFile) + if err != nil { + log.Fatal(err) + } + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCert) + + // 创建自定义的TLS配置 + tlsConfig := &tls.Config{ + MinVersion: tls.VersionTLS10, + MaxVersion: tls.VersionTLS13, + ClientCAs: caCertPool, + ClientAuth: tls.ClientAuthType(clientAuthType), + } + + // 创建HTTP服务器 + server := &http.Server{ + Addr: addr, + TLSConfig: tlsConfig, + } + + // support http 2.0 server + http2.ConfigureServer(server, &http2.Server{}) + if err != nil { + fmt.Println("ConfigureServer err:", err) + os.Exit(9) + } + err = server.ListenAndServeTLS(certFile, keyFile) + if err != nil { + fmt.Println("ListenAndServeTLS err:", err) + os.Exit(10) + } +} + +func HttpListenWebServer(addr string) { + // 创建HTTP服务器 + server := &http.Server{ + Addr: addr, + } + + // support http 2.0 server + err := http2.ConfigureServer(server, &http2.Server{}) + if err != nil { + fmt.Println("ConfigureServer err:", err) + os.Exit(7) + } + err = server.ListenAndServe() + if err != nil { + fmt.Println("ListenAndServe err:", err) + os.Exit(8) + } +} + +func main() { + // src 配置中心初始加载 + src.ConfigurationInit() + app := src.AppEngine() + + conf := config.GetYamlConfig() + + log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:restagent", config.GetLogLevel()) + fmt.Printf("OMC restagent version: %s\n", global.Version) + log.Infof("========================= OMC restagent startup =========================") + log.Infof("OMC restagent version: %s %s %s", global.Version, global.BuildTime, global.GoVer) + + err := dborm.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, + conf.Database.Host, conf.Database.Port, conf.Database.Name) + if err != nil { + fmt.Println("dborm.initDbClient err:", err) + os.Exit(4) + } + err = fm.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, + conf.Database.Host, conf.Database.Port, conf.Database.Name) + if err != nil { + fmt.Println("dborm.initDbClient err:", err) + os.Exit(4) + } + err = pm.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, + conf.Database.Host, conf.Database.Port, conf.Database.Name) + if err != nil { + fmt.Println("dborm.initDbClient err:", err) + os.Exit(4) + } + err = dbrest.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, + conf.Database.Host, conf.Database.Port, conf.Database.Name) + if err != nil { + fmt.Println("dbrest.initDbClient err:", err) + os.Exit(4) + } + err = lm.InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, + conf.Database.Host, conf.Database.Port, conf.Database.Name) + if err != nil { + fmt.Println("lm.initDbClient err:", err) + os.Exit(4) + } + + // 将 mux.Router 注册到 gin.Engine + + // 默认路由组 + defaultUriGroup := app.Group(config.DefaultUriPrefix) + defaultUriGroup.Use(middleware.PreAuthorize(nil)) + defaultUriGroup.Use(libSession.SessionHeader()) + defaultUriGroup.Any("/*any", gin.WrapH(routes.NewRouter())) + // 可配置前缀路由组 + uriGroup := app.Group(config.UriPrefix) + uriGroup.Use(libSession.SessionHeader()) + uriGroup.Any("/*any", gin.WrapH(routes.NewRouter())) + // AMF上报的UE事件, 无前缀,暂时特殊处理 + app.POST(event.UriUEEvent, event.PostUEEventFromAMF) + + for _, rest := range conf.Rest { + // ipv4 goroutines + if rest.IPv4 != "" { + listen := rest.IPv4 + ":" + strconv.Itoa(int(rest.Port)) + if strings.ToLower(rest.Scheme) == "https" { + go HttpListenTLS(listen, rest.CaFile, rest.CertFile, rest.KeyFile, rest.ClientAuthType, app) + } else { + go HttpListen(listen, app) + } + } + if rest.IPv4 != "0.0.0.0" { + // 默认启动localhost侦听 + listenLocal := "127.0.0.1" + ":" + strconv.Itoa(int(rest.Port)) + if strings.ToLower(rest.Scheme) == "https" { + go HttpListenTLS(listenLocal, rest.CaFile, rest.CertFile, rest.KeyFile, rest.ClientAuthType, app) + } else { + go HttpListen(listenLocal, app) + } + } + // ipv6 goroutines + if rest.IPv6 != "" { + listenv6 := "[" + rest.IPv6 + "]" + ":" + strconv.Itoa(int(rest.Port)) + if strings.ToLower(rest.Scheme) == "https" { + go HttpListenTLS(listenv6, rest.CaFile, rest.CertFile, rest.KeyFile, rest.ClientAuthType, app) + } else { + go HttpListen(listenv6, app) + } + } + + } + + if conf.WebServer.Enabled { + fs := http.FileServer(http.Dir(conf.WebServer.RootDir)) + http.Handle("/", fs) + for _, listen := range conf.WebServer.Listen { + if strings.ToLower(listen.Scheme) == "https" { + go HttpListenWebServerTLS(listen.Addr, listen.CaFile, listen.CertFile, listen.KeyFile, listen.ClientAuthType) + } else { + go HttpListenWebServer(listen.Addr) + } + } + } + + select {} +} diff --git a/restagent/static/helpDoc/zh_doc.pdf b/restagent/static/helpDoc/zh_doc.pdf new file mode 100644 index 0000000..e25d5ca Binary files /dev/null and b/restagent/static/helpDoc/zh_doc.pdf differ diff --git a/restagent/static/logo/en_brand.png b/restagent/static/logo/en_brand.png new file mode 100644 index 0000000..200025e Binary files /dev/null and b/restagent/static/logo/en_brand.png differ diff --git a/restagent/static/logo/en_icon.png b/restagent/static/logo/en_icon.png new file mode 100644 index 0000000..3ed445d Binary files /dev/null and b/restagent/static/logo/en_icon.png differ diff --git a/restagent/static/logo/zh_brand.png b/restagent/static/logo/zh_brand.png new file mode 100644 index 0000000..5810cf5 Binary files /dev/null and b/restagent/static/logo/zh_brand.png differ diff --git a/restagent/static/logo/zh_icon.png b/restagent/static/logo/zh_icon.png new file mode 100644 index 0000000..a5b6907 Binary files /dev/null and b/restagent/static/logo/zh_icon.png differ