105 lines
2.5 KiB
Go
105 lines
2.5 KiB
Go
package core
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"io/ioutil"
|
|
"path"
|
|
|
|
"mongo.games.com/goserver/core/logger"
|
|
)
|
|
|
|
// Package 功能包
|
|
// 只做初始化,不要依赖其它功能包
|
|
type Package interface {
|
|
Name() string
|
|
Init() error
|
|
io.Closer
|
|
}
|
|
type ConfigFileEncryptorHook interface {
|
|
IsCipherText([]byte) bool
|
|
Encrypt([]byte) []byte
|
|
Decrtypt([]byte) []byte
|
|
}
|
|
|
|
var packages = make(map[string]Package)
|
|
var packagesLoaded = make(map[string]bool)
|
|
var configFileEH ConfigFileEncryptorHook
|
|
|
|
func RegistePackage(p Package) {
|
|
packages[p.Name()] = p
|
|
}
|
|
|
|
func IsPackageRegisted(name string) bool {
|
|
if _, exist := packages[name]; exist {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func IsPackageLoaded(name string) bool {
|
|
if _, exist := packagesLoaded[name]; exist {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
func RegisterConfigEncryptor(h ConfigFileEncryptorHook) {
|
|
configFileEH = h
|
|
}
|
|
func LoadPackages(configFile string) {
|
|
//logger.Logger.Infof("Build time is: %s", BuildTime())
|
|
switch path.Ext(configFile) {
|
|
case ".json":
|
|
fileBuff, err := ioutil.ReadFile(configFile)
|
|
if err != nil {
|
|
logger.Logger.Errorf("Error while reading config file %s: %s", configFile, err)
|
|
break
|
|
}
|
|
if configFileEH != nil {
|
|
if configFileEH.IsCipherText(fileBuff) {
|
|
fileBuff = configFileEH.Decrtypt(fileBuff)
|
|
}
|
|
}
|
|
var fileData interface{}
|
|
err = json.Unmarshal(fileBuff, &fileData)
|
|
if err != nil {
|
|
break
|
|
}
|
|
fileMap := fileData.(map[string]interface{})
|
|
for name, pkg := range packages {
|
|
if moduleData, ok := fileMap[name]; ok {
|
|
if data, ok := moduleData.(map[string]interface{}); ok {
|
|
modelBuff, _ := json.Marshal(data)
|
|
err = json.Unmarshal(modelBuff, &pkg)
|
|
if err != nil {
|
|
logger.Logger.Errorf("Error while unmarshalling JSON from config file %s: %s", configFile, err)
|
|
} else {
|
|
err = pkg.Init()
|
|
if err != nil {
|
|
logger.Logger.Errorf("Error while initializing package %s: %s", pkg.Name(), err)
|
|
} else {
|
|
packagesLoaded[pkg.Name()] = true
|
|
logger.Logger.Infof("package [%16s] load success", pkg.Name())
|
|
}
|
|
}
|
|
} else {
|
|
logger.Logger.Errorf("Package %v init data unmarshal failed.", pkg.Name())
|
|
}
|
|
} else {
|
|
logger.Logger.Errorf("Package %v init data not exist.", pkg.Name())
|
|
}
|
|
}
|
|
default:
|
|
panic("Unsupported config file: " + configFile)
|
|
}
|
|
}
|
|
|
|
func ClosePackages() {
|
|
for _, pkg := range packages {
|
|
err := pkg.Close()
|
|
if err != nil {
|
|
logger.Logger.Errorf("Error while closing package %s: %s", pkg.Name(), err)
|
|
}
|
|
}
|
|
}
|