package icsconf import ( "encoding/xml" "fmt" "os" "strings" "sync" "gitlab.com/ics_cinnamon/voiceStatistics/icserror" ) type IcsConfig struct { XMLName xml.Name `xml:"ICSVS"` Version string `xml:"version,attr"` InfoConfig InfoConfig `xml:"INFO"` LogConfig LogConfig `xml:"LOG"` Linger int `xml:"LINGER"` Target Target `xml:"TARGET"` Target1 Target1 `xml:"TARGET1"` HomeDir string } type InfoConfig struct { Product string `xml:"PRODUCT"` TenentID string `xml:"TENENTID"` ServerID int `xml:"SERVERID"` ServerIP string `xml:"SERVERIP"` HostName string `xml:"HOSTNAME"` } type Target struct { Transport string `xml:"transport,attr"` TargetPort int `xml:"port,attr"` } type Target1 struct { Transport string `xml:"transport,attr"` TargetPort int `xml:"port,attr"` } type LogConfig struct { Path string `xml:"PATH"` Disklimit int `xml:"DISKLIMIT"` Level string `xml:"LEVEL"` Output string `xml:"OUTPUT"` RotateConfig RotateConfig `xml:"ROTATE"` DelConfig DelConfig `xml:"DELPERIOD"` HomeDir string } type DelConfig struct { DelDay int `xml:"day,attr"` DelHour int `xml:"hour,attr"` Value bool `xml:"value,attr"` } type RotateConfig struct { Size string `xml:"size,attr"` Num string `xml:"num,attr"` YesNo string `xml:"yesno,attr"` } var gIcsConfig *IcsConfig var onceConfig sync.Once func OpenConfig(ConfigFileName string, homeDir string) (*IcsConfig, *icserror.IcsError) { var gerr *icserror.IcsError = nil onceConfig.Do(func() { fi, err := os.Open(ConfigFileName) if err != nil { icserror.ICSERRCONFOpenFile.SetError(err) gerr = icserror.ICSERRCONFOpenFile return } defer fi.Close() FI, _ := os.Stat(ConfigFileName) FileLength := FI.Size() configdata := make([]byte, FileLength) cnt, err := fi.Read(configdata) if cnt == 0 || err != nil { icserror.ICSERRCONFFileNotFound.SetError(err) gerr = icserror.ICSERRCONFFileNotFound return } gIcsConfig = &IcsConfig{} gIcsConfig.HomeDir = homeDir err = xml.Unmarshal([]byte(configdata), gIcsConfig) if err != nil { icserror.ICSERRCONFUnmarshal.SetError(err) gerr = icserror.ICSERRCONFUnmarshal gIcsConfig = nil return } if !strings.HasPrefix(gIcsConfig.LogConfig.Path, "/") { gIcsConfig.LogConfig.Path = fmt.Sprintf("%s/%s", homeDir, gIcsConfig.LogConfig.Path) } //default setting if gIcsConfig.LogConfig.DelConfig.DelDay == 0 { gIcsConfig.LogConfig.DelConfig.DelHour = 90 } if gIcsConfig.LogConfig.DelConfig.DelHour == 0 { gIcsConfig.LogConfig.DelConfig.DelHour = 2 } gIcsConfig.LogConfig.HomeDir = homeDir }) if gerr != nil { return nil, gerr } return gIcsConfig, nil } func ReloadConfig(ConfigFileName string, homeDir string) (*IcsConfig, *icserror.IcsError) { fi, err := os.Open(ConfigFileName) if err != nil { icserror.ICSERRCONFOpenFile.SetError(err) return nil, icserror.ICSERRCONFOpenFile } defer fi.Close() FI, _ := os.Stat(ConfigFileName) FileLength := FI.Size() configdata := make([]byte, FileLength) cnt, err := fi.Read(configdata) if cnt == 0 || err != nil { icserror.ICSERRCONFFileNotFound.SetError(err) return nil, icserror.ICSERRCONFFileNotFound } gIcsConfig = &IcsConfig{} gIcsConfig.HomeDir = homeDir err = xml.Unmarshal([]byte(configdata), gIcsConfig) if err != nil { icserror.ICSERRCONFUnmarshal.SetError(err) return nil, icserror.ICSERRCONFUnmarshal } if !strings.HasPrefix(gIcsConfig.LogConfig.Path, "/") { gIcsConfig.LogConfig.Path = fmt.Sprintf("%s/%s", homeDir, gIcsConfig.LogConfig.Path) } //default setting if gIcsConfig.LogConfig.DelConfig.DelDay == 0 { gIcsConfig.LogConfig.DelConfig.DelHour = 90 } if gIcsConfig.LogConfig.DelConfig.DelHour == 0 { gIcsConfig.LogConfig.DelConfig.DelHour = 2 } gIcsConfig.LogConfig.HomeDir = homeDir return gIcsConfig, nil } func (c IcsConfig) GetHomeDir() string { return c.HomeDir } func (c IcsConfig) GetChannelID() string { return c.InfoConfig.TenentID } func (c IcsConfig) GetServerID() int { return c.InfoConfig.ServerID } //from LogConfig struct func (c LogConfig) GetHomeDir() string { return c.HomeDir } func (c *IcsConfig) SetHomeDir(homeDir string) { c.HomeDir = homeDir } func GetIcsConfig() *IcsConfig { return gIcsConfig } func (c IcsConfig) ShowConfig() string { fmt.Printf("Log Level : %s\n", c.LogConfig.Level) fmt.Printf("Log Path : %s\n", c.LogConfig.Path) fmt.Printf("Log Disk Space Size : %dMB\n", c.LogConfig.Disklimit) fmt.Printf("Log Del Day : %d\n", c.LogConfig.DelConfig.DelDay) fmt.Printf("Log Del Hour : %d\n", c.LogConfig.DelConfig.DelHour) fmt.Printf("Log Output : %s\n", c.LogConfig.Output) fmt.Printf("Log Rotate : %s\n", c.LogConfig.RotateConfig.YesNo) fmt.Printf("Log Rotate File Size : %sMB\n", c.LogConfig.RotateConfig.Size) fmt.Printf("Log Rotate File Number : %s\n\n", c.LogConfig.RotateConfig.Num) fmt.Printf("Log Del Day : %d\n", c.LogConfig.DelConfig.DelDay) fmt.Printf("Log Del Hour : %d\n", c.LogConfig.DelConfig.DelHour) /* for iter := 0; iter < len(c.AgentConfig); iter++ { fmt.Printf("==========================\n") fmt.Printf("Agent Name: %s, Use? %s\n", c.AgentConfig[iter].Name, c.AgentConfig[iter].Value) fmt.Printf("Agent Media media: %s\n", c.AgentConfig[iter].MediaConfig.Media) fmt.Printf("Agent Media Port: %d\n", c.AgentConfig[iter].MediaConfig.Port) fmt.Printf("Agent Media Format: %s\n", c.AgentConfig[iter].MediaConfig.Format) fmt.Printf("Register value: %s\n", c.AgentConfig[iter].RegisterConfig.RegisterValue) fmt.Printf("Register Transport: %s\n", c.AgentConfig[iter].RegisterConfig.RegisterTransport) fmt.Printf("Register Expire: %d\n", c.AgentConfig[iter].RegisterConfig.RegisterExpire) fmt.Printf("Register Username: %s\n", c.AgentConfig[iter].RegisterConfig.RegisterUserName) fmt.Printf("Options Use? %s\n", c.AgentConfig[iter].OptionsConfig.OptionsValue) fmt.Printf("Options Interval: %d\n\n", c.AgentConfig[iter].OptionsConfig.OptionsInterval) } */ /* confmsg += fmt.Sprintf("iComsys Voice Agent Address : %s[%d:%d]\n", c.VoiceAgentConfig.AgentAddr.VoiceAgentIP, c.VoiceAgentConfig.AgentAddr.CallSignalPort, c.VoiceAgentConfig.AgentAddr.VoicePort) */ confmsg := fmt.Sprintf("Log Level : %s\n", c.LogConfig.Level) confmsg += fmt.Sprintf("Log Path : %s\n", c.LogConfig.Path) confmsg += fmt.Sprintf("Log Disk Space Size : %dMB\n", c.LogConfig.Disklimit) confmsg += fmt.Sprintf("Log Del Day : %d\n", c.LogConfig.DelConfig.DelDay) confmsg += fmt.Sprintf("Log Del Hour : %d\n", c.LogConfig.DelConfig.DelHour) confmsg += fmt.Sprintf("Log Output : %s\n", c.LogConfig.Output) confmsg += fmt.Sprintf("Log Rotate : %s\n", c.LogConfig.RotateConfig.YesNo) confmsg += fmt.Sprintf("Log Rotate File Size : %sMB\n", c.LogConfig.RotateConfig.Size) confmsg += fmt.Sprintf("Log Rotate File Number : %s\n\n", c.LogConfig.RotateConfig.Num) return confmsg } ////////////////////////////////////////// /////////////// simulator //////////////// ////////////////////////////////////////// type SimConfig struct { XMLName xml.Name `xml:"SIMVC"` Version string `xml:"version,attr"` IsCaller string `xml:"ISCALLER"` Repeat int `xml:"REPEAT"` Channels int `xml:"CHANNELS"` TargetPhoneConfig TargetPhoneConfig `xml:"TARGET"` SimPhoneConfig SimPhoneConfig `xml:"SIM"` InOut string `xml:"INOUT"` LogConfig LogConfig `xml:"LOG"` RegiCount int `xml:"REGICOUNT"` MediaConfig []SimMediaConfig `xml:"MEDIA"` HomeDir string } type TargetPhoneConfig struct { TargetIP string `xml:"ip,attr"` TSIPPort int `xml:"sipport,attr"` TRTPPort int `xml:"rtpport,attr"` } type SimPhoneConfig struct { MYIP string `xml:"myip,attr"` SIPPort int `xml:"sipport,attr"` RTPPort int `xml:"rtpport,attr"` } type SimMediaConfig struct { Media string `xml:"m,attr"` Port int `xml:"port,attr"` Format string `xml:"format,attr"` } type SimScenarioConfig struct { XMLName xml.Name `xml:"SIMSCEN"` Version string `xml:"version,attr"` ScenarioCount int `xml:"SCENARIOCOUNT"` SipOrder SipOrder `xml:"ORDER"` } type SipOrder struct { Order []string `xml:"METHOD"` StopTime int `xml:"STOPTIME"` } func OpenSimConfig(ConfigFileName string, homeDir string) (*SimConfig, *icserror.IcsError) { fi, err := os.Open(ConfigFileName) if err != nil { icserror.ICSERRCONFOpenFile.SetError(err) return nil, icserror.ICSERRCONFOpenFile } defer fi.Close() FI, _ := os.Stat(ConfigFileName) FileLength := FI.Size() configdata := make([]byte, FileLength) cnt, err := fi.Read(configdata) if cnt == 0 || err != nil { icserror.ICSERRCONFFileNotFound.SetError(err) return nil, icserror.ICSERRCONFFileNotFound } conf := SimConfig{} conf.HomeDir = homeDir err = xml.Unmarshal([]byte(configdata), &conf) if err != nil { icserror.ICSERRCONFUnmarshal.SetError(err) return nil, icserror.ICSERRCONFUnmarshal } /* fmt.Printf("Configuration> xml name: %s, version: %s\n", conf.XMLName.Local, conf.Version) fmt.Println(conf.LicenseConfig) fmt.Println(conf.LogConfig) fmt.Println(conf.LogConfig.RotateConfig) fmt.Println(conf.CaptureConfig) */ conf.LogConfig.HomeDir = homeDir gSimConfig = &conf return &conf, nil } func OpenSimScenarioConfig(ConfigFileName string, homeDir string) (*SimScenarioConfig, *icserror.IcsError) { fi, err := os.Open(ConfigFileName) if err != nil { icserror.ICSERRCONFOpenFile.SetError(err) return nil, icserror.ICSERRCONFOpenFile } defer fi.Close() FI, _ := os.Stat(ConfigFileName) FileLength := FI.Size() configdata := make([]byte, FileLength) cnt, err := fi.Read(configdata) if cnt == 0 || err != nil { icserror.ICSERRCONFFileNotFound.SetError(err) return nil, icserror.ICSERRCONFFileNotFound } SimScenarioConf := SimScenarioConfig{} err = xml.Unmarshal([]byte(configdata), &SimScenarioConf) if err != nil { icserror.ICSERRCONFUnmarshal.SetError(err) return nil, icserror.ICSERRCONFUnmarshal } fmt.Println() gSimScenarioConfig = &SimScenarioConf return &SimScenarioConf, nil } func (c SimConfig) GetSimChannels() int { return c.Channels } func (c SimConfig) GetSimTargetIP() string { return c.TargetPhoneConfig.TargetIP } func (c SimConfig) GetSimTargetPort() int { return c.TargetPhoneConfig.TSIPPort } func (c SimConfig) ShowConfig() string { fmt.Printf("Home Path : %s\n", c.HomeDir) fmt.Printf("INOUT : %s\n", c.InOut) fmt.Printf("Channel number : %d\n", c.Channels) fmt.Printf("Repeat number : %d\n", c.Repeat) fmt.Printf("iComsys SIM Phone Address : %s\n", c.SimPhoneConfig.MYIP) fmt.Printf("iComsys Target Phone Address : %s\n", c.GetSimTargetIP()) fmt.Printf("Log Level : %s\n", c.LogConfig.Level) fmt.Printf("Log Path : %s\n", c.LogConfig.Path) fmt.Printf("Log Disk Space Limitation : %dMB\n", c.LogConfig.Disklimit) fmt.Printf("Log Output : %s\n", c.LogConfig.Output) fmt.Printf("Log Rotate : %s\n", c.LogConfig.RotateConfig.YesNo) fmt.Printf("Log Rotate File Size : %s\n", c.LogConfig.RotateConfig.Size) fmt.Printf("Log Rotate File Number : %s\n", c.LogConfig.RotateConfig.Num) fmt.Printf("SIP Port: %d\n", c.SimPhoneConfig.SIPPort) fmt.Printf("RTP Port: %d\n", c.SimPhoneConfig.RTPPort) confmsg := "" confmsg += fmt.Sprintf("Home Path : %s\n", c.HomeDir) confmsg += fmt.Sprintf("Caller : %s\n", c.IsCaller) confmsg += fmt.Sprintf("Channel number : %d\n", c.Channels) confmsg += fmt.Sprintf("iComsys SIM Phone Address : %s\n", c.SimPhoneConfig.MYIP) confmsg += fmt.Sprintf("iComsys Target Phone Address : %s\n", c.GetSimTargetIP()) confmsg += fmt.Sprintf("Log Level : %s\n", c.LogConfig.Level) confmsg += fmt.Sprintf("Log Path : %s\n", c.LogConfig.Path) confmsg += fmt.Sprintf("Log Disk Space Limitation : %dMB\n", c.LogConfig.Disklimit) confmsg += fmt.Sprintf("Log Output : %s\n", c.LogConfig.Output) confmsg += fmt.Sprintf("Log Rotate : %s\n\n", c.LogConfig.RotateConfig.YesNo) confmsg += fmt.Sprintf("Log Rotate File Size : %s\n", c.LogConfig.RotateConfig.Size) confmsg += fmt.Sprintf("Log Rotate File Number : %s\n", c.LogConfig.RotateConfig.Num) confmsg += fmt.Sprintf("SIP Port: %d\n", c.SimPhoneConfig.SIPPort) confmsg += fmt.Sprintf("RTP Port: %d\n\n", c.SimPhoneConfig.RTPPort) return confmsg } var gSimConfig *SimConfig var gSimScenarioConfig *SimScenarioConfig func GetSimConfig() *SimConfig { return gSimConfig } func GetSimScenarioConfig() *SimScenarioConfig { return gSimScenarioConfig }