init project
parent
a92d2788ab
commit
09bab32589
@ -0,0 +1,11 @@
|
||||
module gitlab.com/ics_cinnamon/voiceStatistics
|
||||
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/satori/go.uuid v1.2.0
|
||||
github.com/stretchr/testify v1.7.0
|
||||
gitlab.com/ics_cinnamon/joy4 v1.0.26
|
||||
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1
|
||||
)
|
@ -0,0 +1,22 @@
|
||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
gitlab.com/ics_cinnamon/joy4 v1.0.26 h1:pW6grM/elr/Nv/ibbES3ChaREafCy2h950NZUTXVYVM=
|
||||
gitlab.com/ics_cinnamon/joy4 v1.0.26/go.mod h1:LFfF6nA92KMmd/hrGEgQzkIsX/n+IlqCI8vbY8/NnNI=
|
||||
gocv.io/x/gocv v0.27.0 h1:3X8I74ULsWHd4m7DQRv2Nqx5VkKscfUFnKgLNodiboI=
|
||||
gocv.io/x/gocv v0.27.0/go.mod h1:n4LnYjykU6y9gn48yZf4eLCdtuSb77XxSkW6g0wGf/A=
|
||||
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1 h1:kwrAHlwJ0DUBZwQ238v+Uod/3eZ8B2K5rYsUHBQvzmI=
|
||||
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
@ -0,0 +1,70 @@
|
||||
package icsapp
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsnet"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsstat"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icssvc"
|
||||
)
|
||||
|
||||
const (
|
||||
LINEEND1 = "\r\n"
|
||||
LINEEND2 = "EOM"
|
||||
)
|
||||
|
||||
type IcsExec struct {
|
||||
service *icssvc.IcsService
|
||||
config *icsconf.IcsConfig
|
||||
hbNet *icsnet.IcsTCPNet
|
||||
//pcap icspcap.IcsPcap
|
||||
}
|
||||
|
||||
func Init(conf *icsconf.IcsConfig) (e *IcsExec) {
|
||||
e = &IcsExec{}
|
||||
e.service = icssvc.GetServiceStatus()
|
||||
e.config = conf
|
||||
//e.pcap = icspcap.New()
|
||||
|
||||
return e
|
||||
}
|
||||
|
||||
func (exe IcsExec) Execute() *icserror.IcsError {
|
||||
l := icslog.GetIcsLog()
|
||||
|
||||
l.Printf(icslog.LOG_LEVEL_FATAL, -1, "11111")
|
||||
for !exe.service.GetExit() {
|
||||
for exe.service.GetStop() {
|
||||
time.Sleep(time.Millisecond)
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
//start statistic tcp
|
||||
cmdDone := make(chan *icserror.IcsError)
|
||||
go func() {
|
||||
cmdErr := icsstat.ListenStatMNG()
|
||||
if cmdErr != nil {
|
||||
cmdDone <- cmdErr
|
||||
return
|
||||
}
|
||||
//defer sm.Close()
|
||||
|
||||
//cmdDone <- nil
|
||||
}()
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
select {
|
||||
case err := <-cmdDone:
|
||||
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Closed Stat TCP Connection: %s", err)
|
||||
if err != nil {
|
||||
//err.Print()
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
@ -0,0 +1,407 @@
|
||||
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"`
|
||||
HomeDir string
|
||||
}
|
||||
|
||||
type InfoConfig struct {
|
||||
Product string `xml:"PRODUCT"`
|
||||
TenentID string `xml:"TENENTID"`
|
||||
ServerID int `xml:"SERVERID"`
|
||||
ServerIP string `xml:"SERVERIP"`
|
||||
}
|
||||
|
||||
type Target 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"`
|
||||
}
|
||||
|
||||
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
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
//error system package
|
||||
package icserror
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type IcsError struct {
|
||||
code interface{}
|
||||
message string
|
||||
err error
|
||||
}
|
||||
|
||||
func GetModName() string {
|
||||
return "icserror"
|
||||
}
|
||||
|
||||
func NewIcsError(errString string, code interface{}) *IcsError {
|
||||
var err IcsError
|
||||
err.err = errors.New(errString)
|
||||
err.code = code
|
||||
err.message = errString
|
||||
|
||||
return &err
|
||||
}
|
||||
|
||||
func (e IcsError) Print() {
|
||||
fmt.Printf("Code: %v, Message: %s, Error: %v\n", e.code, e.message, e.err)
|
||||
}
|
||||
|
||||
func (e IcsError) PrintWithCaller(depth int) {
|
||||
errstr := fmt.Sprintf("Code: %v, Message: %s, Error: %s", e.code, e.message, e.err)
|
||||
funcname, file, line, ok := runtime.Caller(depth)
|
||||
if ok {
|
||||
files := strings.Split(file, "/")
|
||||
fileslen := len(files)
|
||||
func1 := runtime.FuncForPC(funcname).Name()
|
||||
funcs := strings.Split(func1, "/")
|
||||
funcslen := len(funcs)
|
||||
|
||||
fmt.Printf("[%s:%d %s] %s\n", files[fileslen-1], line, funcs[funcslen-1], errstr)
|
||||
}
|
||||
}
|
||||
|
||||
func (e IcsError) Equal(i *IcsError) bool {
|
||||
return e.code == i.code
|
||||
}
|
||||
|
||||
func (e *IcsError) SetError(baseError error) {
|
||||
e.err = baseError
|
||||
}
|
||||
|
||||
func (e *IcsError) GetCode() interface{} {
|
||||
return e.code
|
||||
}
|
||||
|
||||
func (e *IcsError) GetMessage() string {
|
||||
return e.message
|
||||
}
|
||||
|
||||
func (e *IcsError) GetError() error {
|
||||
return e.err
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package icserror
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestGetModName(t *testing.T) {
|
||||
got := GetModName()
|
||||
assert.Equal(t, "icserror", got, "not expected value")
|
||||
|
||||
g1 := NewIcsError("Test", 0)
|
||||
g2 := NewIcsError("Test", 0)
|
||||
assert.Equal(t, g1, g2, "not expected value")
|
||||
|
||||
assert.Equal(t, g1.Equal(g2), true, "not expected value")
|
||||
}
|
@ -0,0 +1,205 @@
|
||||
package icserror
|
||||
|
||||
const (
|
||||
ICS_ERROR_COMMON = iota
|
||||
ICS_ERROR_CONFIG = ICS_ERROR_COMMON + 1000
|
||||
ICS_ERROR_SVC = ICS_ERROR_COMMON + 2000
|
||||
ICS_ERROR_UTIL = ICS_ERROR_COMMON + 2500
|
||||
ICS_ERROR_SIP_PROCESSOR = ICS_ERROR_COMMON + 3000
|
||||
ICS_ERROR_NET = ICS_ERROR_COMMON + 4000
|
||||
ICS_ERROR_RECORDDATA = ICS_ERROR_COMMON + 4500
|
||||
ICS_ERROR_SIP_PARSER = ICS_ERROR_COMMON + 5000
|
||||
ICS_ERROR_SDP_PARSER = ICS_ERROR_COMMON + 5500
|
||||
ICS_ERROR_RTP_PARSER = ICS_ERROR_COMMON + 6000
|
||||
ICS_ERROR_DTMF = ICS_ERROR_COMMON + 6500
|
||||
ICS_ERROR_CONV = ICS_ERROR_COMMON + 7000
|
||||
ICS_ERROR_SESS = ICS_ERROR_COMMON + 8000
|
||||
ICS_ERROR_EVENT = ICS_ERROR_COMMON + 9000
|
||||
)
|
||||
|
||||
//common error
|
||||
const (
|
||||
ICSOK = iota + ICS_ERROR_COMMON
|
||||
ICSFALSE
|
||||
ICS_ERROR_NOTFOUND_HOME
|
||||
ICS_ERROR_INVALID_PARAM
|
||||
ICS_ERROR_FILE_OPEN
|
||||
ICS_ERROR_MAKE_DIR
|
||||
ICS_ERROR_STRING_CONV
|
||||
ICS_ERROR_DAEMONIZE
|
||||
ICS_ERROR_UNKNOWN
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRTest = NewIcsError("This Is Error Test", ICSOK)
|
||||
ICSERRNotFoundHome = NewIcsError("Not found HOME Directory", ICS_ERROR_NOTFOUND_HOME)
|
||||
ICSERRInvalidParam = NewIcsError("Invalid Parameter", ICS_ERROR_INVALID_PARAM)
|
||||
ICSERRFileOpen = NewIcsError("File Open Error", ICS_ERROR_FILE_OPEN)
|
||||
ICSERRMakeDir = NewIcsError("File Open Error", ICS_ERROR_MAKE_DIR)
|
||||
ICSERRStrConv = NewIcsError("Atoi Error", ICS_ERROR_STRING_CONV)
|
||||
ICSERRDeamonize = NewIcsError("Process Deamonize Error", ICS_ERROR_DAEMONIZE)
|
||||
ICSERRUnkown = NewIcsError("Unknown Error", ICS_ERROR_UNKNOWN)
|
||||
)
|
||||
|
||||
//config error
|
||||
const (
|
||||
ICS_ERROR_CONFIG_FILE_NOTFOUND = iota + ICS_ERROR_CONFIG
|
||||
ICS_ERROR_CONFIG_OPEN_FILE
|
||||
ICS_ERROR_CONFIG_UNMARSHAL
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRCONFFileNotFound = NewIcsError("icsconfig: Not Found The Config File ", ICS_ERROR_CONFIG_FILE_NOTFOUND)
|
||||
ICSERRCONFOpenFile = NewIcsError("icsconfig: Configuration File Open Error", ICS_ERROR_CONFIG_OPEN_FILE)
|
||||
ICSERRCONFUnmarshal = NewIcsError("icsconfig: Config File Unmarshal Error", ICS_ERROR_CONFIG_UNMARSHAL)
|
||||
)
|
||||
|
||||
//service error
|
||||
const (
|
||||
ICS_ERROR_SVC_WRONG_TIME = iota + ICS_ERROR_SVC
|
||||
ICS_ERROR_SVC_NOT_INIT
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRSVCTime = NewIcsError("icsservice: Wrong time", ICS_ERROR_SVC_WRONG_TIME)
|
||||
ICSERRSVCInit = NewIcsError("icsapp: Not init service", ICS_ERROR_SVC_NOT_INIT)
|
||||
)
|
||||
|
||||
//util error
|
||||
const (
|
||||
ICS_ERROR_UTIL_DISK_FULL = iota + ICS_ERROR_UTIL
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRUTILDiskFull = NewIcsError("icsutil: Disk Full", ICS_ERROR_UTIL_DISK_FULL)
|
||||
)
|
||||
|
||||
/*
|
||||
//sip processor error
|
||||
const (
|
||||
ICS_ERROR_PCAP_OPENLIVE = iota + ICS_ERROR_PCAP
|
||||
ICS_ERROR_PCAP_SETFILTER
|
||||
ICS_ERROR_PCAP_EOF
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRPCAPOpenLive = NewIcsError("icspcap: OpenLive Error", ICS_ERROR_PCAP_OPENLIVE)
|
||||
ICSERRPCAPSetFilter = NewIcsError("icspcap: Set filter Error", ICS_ERROR_PCAP_SETFILTER)
|
||||
ICSERRPCAPEOF = NewIcsError("icspcap: Packet EOF", ICS_ERROR_PCAP_EOF)
|
||||
)
|
||||
*/
|
||||
|
||||
//net error
|
||||
const (
|
||||
ICS_ERROR_NET_RESOLVEADDR = iota + ICS_ERROR_NET
|
||||
ICS_ERROR_NET_LISTEN
|
||||
ICS_ERROR_NET_CONNECT
|
||||
ICS_ERROR_NET_NOT_CONNECTED
|
||||
ICS_ERROR_NET_CLOSE
|
||||
ICS_ERROR_NET_WRITE
|
||||
ICS_ERROR_NET_READ
|
||||
ICS_ERROR_NET_ACCEPT
|
||||
ICS_ERROR_NET_NOT_FOUND_IF
|
||||
ICS_ERROR_NET_GET_ADDR
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRNETResolveAddrError = NewIcsError("icsnet: Resolve Address Error", ICS_ERROR_NET_RESOLVEADDR)
|
||||
ICSERRNETListenError = NewIcsError("icsnet: Listen Error", ICS_ERROR_NET_LISTEN)
|
||||
ICSERRNETConnectError = NewIcsError("icsnet: Connect Error", ICS_ERROR_NET_CONNECT)
|
||||
ICSERRNETNotConnectError = NewIcsError("icsnet: Connection is not completed yet", ICS_ERROR_NET_NOT_CONNECTED)
|
||||
ICSERRNETCloseError = NewIcsError("icsnet: Close Error", ICS_ERROR_NET_CLOSE)
|
||||
ICSERRNETWriteError = NewIcsError("icsnet: Write Error", ICS_ERROR_NET_WRITE)
|
||||
ICSERRNETReadError = NewIcsError("icsnet: Read Error", ICS_ERROR_NET_READ)
|
||||
ICSERRNETAcceptError = NewIcsError("icsnet: Accept Error", ICS_ERROR_NET_ACCEPT)
|
||||
ICSERRNETNotFoundIF = NewIcsError("icsnet: Not Found Interface", ICS_ERROR_NET_NOT_FOUND_IF)
|
||||
ICSERRNETGetAddr = NewIcsError("icsnet: Could Not Get Address", ICS_ERROR_NET_GET_ADDR)
|
||||
)
|
||||
|
||||
//recorddata error
|
||||
const (
|
||||
ICS_ERROR_RECORDDATA_CALLSIGNAL_PARSING = iota + ICS_ERROR_RECORDDATA
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRRECORDDATAParsing = NewIcsError("recorddata: Parsing Error", ICS_ERROR_RECORDDATA_CALLSIGNAL_PARSING)
|
||||
)
|
||||
|
||||
//sip parsing error
|
||||
var (
|
||||
ICSERRSIPHeader = NewIcsError("icssip: Header format Error", ICS_ERROR_SIP_PARSER)
|
||||
ICSERRINVITERequired = NewIcsError("icssip: INVITE Method required SDP", ICS_ERROR_SIP_PARSER)
|
||||
ICSERR200OKRequired = NewIcsError("icssip: 200 OK Method required SDP", ICS_ERROR_SIP_PARSER)
|
||||
)
|
||||
|
||||
//sdp parsing error
|
||||
var (
|
||||
ICSERRSDPParser = NewIcsError("icssdp: Data parser Error", ICS_ERROR_SDP_PARSER)
|
||||
ICSERRNotFoundSdpMedia = NewIcsError("icssdp: Not Found SDP Media audio tag", ICS_ERROR_SDP_PARSER)
|
||||
ICSERRSDPAudiotagPortValue = NewIcsError("icssdp: SDP Media audio tag port is not numeric", ICS_ERROR_SDP_PARSER)
|
||||
)
|
||||
|
||||
//rtp parser error
|
||||
const (
|
||||
ICS_ERROR_RTP_NO = iota + ICS_ERROR_RTP_PARSER
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRRTPNo = NewIcsError("icsrtp: This packet may not be RTP", ICS_ERROR_RTP_NO)
|
||||
)
|
||||
|
||||
//dtmf parser error
|
||||
const (
|
||||
ICS_ERROR_DTMF_OK = iota + ICS_ERROR_DTMF
|
||||
ICS_ERROR_DTMF_CONT
|
||||
ICS_ERROR_DTMF_FAIL
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRDTMFOK = NewIcsError("icsdtmf: Detected DTMF", ICS_ERROR_DTMF_OK)
|
||||
ICSERRDTMFCont = NewIcsError("icsdtmf: Processing detect", ICS_ERROR_DTMF_CONT)
|
||||
ICSERRDTMFFail = NewIcsError("icsdtmf: Failed detection DTMF", ICS_ERROR_DTMF_FAIL)
|
||||
)
|
||||
|
||||
//media converter error
|
||||
const (
|
||||
ICS_ERROR_CONV_NOT_SUPPORTED_CODEC = iota + ICS_ERROR_CONV
|
||||
ICS_ERROR_CONV_DECODE
|
||||
ICS_ERROR_CONV_ENCODE
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRCONVNotSupportedCodec = NewIcsError("icsmediaconv: Not Supported codec", ICS_ERROR_CONV_NOT_SUPPORTED_CODEC)
|
||||
ICSERRCONVDecodeFail = NewIcsError("icsmediaconv: Decoding Fail", ICS_ERROR_CONV_DECODE)
|
||||
ICSERRCONVEncodeFail = NewIcsError("icsmediaconv: Encoding Fail", ICS_ERROR_CONV_ENCODE)
|
||||
)
|
||||
|
||||
//session error
|
||||
const (
|
||||
ICS_ERROR_SESS_NOT_FOUND_SESSION = iota + ICS_ERROR_SESS
|
||||
ICS_ERROR_SESS_SESSION_MAX_IDLE
|
||||
ICS_ERROR_SESS_SESSION_NUM_EXCEED
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERRSESSNotFoundSession = NewIcsError("icssessionmanager: Not Found Session", ICS_ERROR_SESS_NOT_FOUND_SESSION)
|
||||
ICSERRSESSMaxSessionIdle = NewIcsError("icssessionmanager: Exceeded Session Max Idling Time", ICS_ERROR_SESS_SESSION_MAX_IDLE)
|
||||
ICSERRSESSMaxSessionNumber = NewIcsError("icssessionmanager: Licensed Channel Number Exceeded ", ICS_ERROR_SESS_SESSION_NUM_EXCEED)
|
||||
)
|
||||
|
||||
//event error
|
||||
const (
|
||||
ICS_ERROR_EVT_ALLOC = iota + ICS_ERROR_EVENT
|
||||
ICS_ERROR_EVT_REMOVE
|
||||
ICS_ERROR_EVT_POST
|
||||
ICS_ERROR_EVT_NOT_INITIALIZE
|
||||
ICS_ERROR_EVT_UNKNOWN
|
||||
)
|
||||
|
||||
var (
|
||||
ICSERREVTAlloc = NewIcsError("icsevent: Event Allocation Error", ICS_ERROR_EVT_ALLOC)
|
||||
ICSERREVTRemove = NewIcsError("icsevent: Event Remove Error", ICS_ERROR_EVT_REMOVE)
|
||||
ICSERREVTPost = NewIcsError("icsevent: Event Post Error", ICS_ERROR_EVT_POST)
|
||||
ICSERREVTNotInit = NewIcsError("icsevent: Event System Not Initialized", ICS_ERROR_EVT_NOT_INITIALIZE)
|
||||
ICSERREVTUnkown = NewIcsError("icsevent: Unkown Error", ICS_ERROR_EVT_UNKNOWN)
|
||||
)
|
@ -0,0 +1,90 @@
|
||||
package icsevent
|
||||
|
||||
import (
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
)
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// round robin data structure
|
||||
type RRData struct {
|
||||
data interface{}
|
||||
//data *interface{}
|
||||
|
||||
tail *RRData
|
||||
}
|
||||
|
||||
func NewRRData() *RRData {
|
||||
r := &RRData{
|
||||
tail: nil,
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func Push(first *RRData, data interface{}) *icserror.IcsError {
|
||||
if first == nil {
|
||||
return icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
ret := NewRRData()
|
||||
ret.data = data
|
||||
var tmp *RRData
|
||||
|
||||
//search end point
|
||||
cnt := 0
|
||||
for tmp = first; tmp.tail != nil; tmp = tmp.tail {
|
||||
cnt++
|
||||
}
|
||||
|
||||
//assign data to end point
|
||||
tmp.tail = ret
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func Pop(first *RRData) (*RRData, interface{}, *icserror.IcsError) {
|
||||
if first == nil {
|
||||
return nil, nil, icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
//l := icslog.GetIcsLog()
|
||||
|
||||
ftail := first.tail
|
||||
|
||||
ret := first.tail
|
||||
|
||||
if ret != nil && ret.data != nil {
|
||||
} else {
|
||||
return first, nil, nil
|
||||
}
|
||||
first = ftail
|
||||
|
||||
return first, ret.data, nil
|
||||
}
|
||||
|
||||
func (r *RRData) GetData() interface{} {
|
||||
return r.data
|
||||
}
|
||||
|
||||
func GetLength(first *RRData) (int, *icserror.IcsError) {
|
||||
if first == nil {
|
||||
return -1, icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
l := icslog.GetIcsLog()
|
||||
var iter int = 0
|
||||
for tmp := first; tmp != nil && tmp.tail != nil; tmp = tmp.tail {
|
||||
var id int
|
||||
h := NewEventH()
|
||||
switch v := tmp.data.(type) {
|
||||
case int:
|
||||
id = v
|
||||
}
|
||||
p := h.getEvt(id)
|
||||
l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "GetLength(%d)>%d-%v tmp>%p-%p", iter, id, p, tmp, tmp.tail)
|
||||
|
||||
iter++
|
||||
}
|
||||
|
||||
return iter, nil
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package icsevent
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
)
|
||||
|
||||
func TestDataStruct(t *testing.T) {
|
||||
var header *RRData
|
||||
header = NewRRData()
|
||||
|
||||
for i := 0; i < 128; i++ {
|
||||
err := Push(header, i)
|
||||
if err != nil {
|
||||
err.Print()
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < 128; i++ {
|
||||
var data interface{}
|
||||
var err *icserror.IcsError
|
||||
//fmt.Printf("%p\n", header)
|
||||
header, data, err = Pop(header)
|
||||
if err != nil {
|
||||
err.Print()
|
||||
break
|
||||
}
|
||||
|
||||
fmt.Printf("[%d]>>> %v\n", i, data)
|
||||
}
|
||||
|
||||
for i := 0; i < 128; i++ {
|
||||
err := Push(header, i)
|
||||
if err != nil {
|
||||
err.Print()
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < 128; i++ {
|
||||
var data interface{}
|
||||
var err *icserror.IcsError
|
||||
//fmt.Printf("%p\n", header)
|
||||
header, data, err = Pop(header)
|
||||
if err != nil {
|
||||
err.Print()
|
||||
break
|
||||
}
|
||||
|
||||
fmt.Printf("[%d]>>> %v\n", i, data)
|
||||
}
|
||||
}
|
@ -0,0 +1,219 @@
|
||||
/*
|
||||
****************************
|
||||
struct Event
|
||||
****************************
|
||||
실제 이벤트 데이터
|
||||
|
||||
Copy()
|
||||
이벤트 데이터 복사
|
||||
|
||||
****************************
|
||||
struct EventH
|
||||
****************************
|
||||
struct Event 핸들링 구조체. singleton이며 전역 변수.
|
||||
struct Event를 array로 가진다.
|
||||
|
||||
AllocEvent()
|
||||
array에서 빈 event item을 확보하고 데이터를 넣는다.
|
||||
|
||||
RemoveEvent()
|
||||
array에서 해당 event를 삭제.
|
||||
|
||||
PostEvent()
|
||||
이벤트를 받을 세션에 이벤트를 보낸다.
|
||||
|
||||
GetEvent()
|
||||
이벤트 수신.
|
||||
polling 방식
|
||||
|
||||
*/
|
||||
|
||||
package icsevent
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
)
|
||||
|
||||
const (
|
||||
MAX_EVENT_NUM = 655360
|
||||
MAX_CHANNEL_NUM = 256
|
||||
)
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// 단위 이벤트
|
||||
type Event struct {
|
||||
Data *interface{}
|
||||
ID int
|
||||
//m *sync.Mutex
|
||||
}
|
||||
|
||||
func (e *Event) GetData() *interface{} {
|
||||
return e.Data
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// 전역 이벤트 배열
|
||||
type EventH struct {
|
||||
evtArray []*Event
|
||||
m *sync.Mutex
|
||||
}
|
||||
|
||||
var eventData []*Event
|
||||
var onceEvent sync.Once
|
||||
var onceEventInit sync.Once
|
||||
|
||||
var channelNum int = MAX_CHANNEL_NUM
|
||||
var eventNum int = MAX_EVENT_NUM
|
||||
var lastPos int
|
||||
|
||||
func getEventInstance() []*Event {
|
||||
onceEvent.Do(func() {
|
||||
eventData = make([]*Event, eventNum)
|
||||
for iter := 0; iter < eventNum; iter++ {
|
||||
eventData[iter] = new(Event)
|
||||
//eventData[iter].m = &sync.Mutex{}
|
||||
}
|
||||
lastPos = 0
|
||||
})
|
||||
|
||||
return eventData
|
||||
}
|
||||
|
||||
//make global Event Array
|
||||
func NewEventH() *EventH {
|
||||
//s := icssvc.NewService()
|
||||
//channelNum = s.GetIcsConfig().GetChannelNum()
|
||||
//TODO: add recover
|
||||
|
||||
h := &EventH{}
|
||||
h.evtArray = getEventInstance()
|
||||
h.m = &sync.Mutex{}
|
||||
|
||||
return h
|
||||
}
|
||||
|
||||
//initialize Event Array
|
||||
func (h *EventH) Init() {
|
||||
onceEventInit.Do(func() {
|
||||
for iter := 0; iter < eventNum; iter++ {
|
||||
h.evtArray[iter].Data = nil
|
||||
h.evtArray[iter].ID = iter
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
//put data to event array
|
||||
func (h *EventH) AllocEvent(data interface{}) (*Event, *icserror.IcsError) {
|
||||
count := 0
|
||||
for iter := lastPos; count < eventNum; iter++ {
|
||||
if iter == eventNum {
|
||||
iter = 0
|
||||
}
|
||||
|
||||
//h.evtArray[iter].m.Lock()
|
||||
h.m.Lock()
|
||||
if h.evtArray[iter].Data == nil {
|
||||
h.evtArray[iter].Data = &data
|
||||
lastPos = iter + 1
|
||||
//h.evtArray[iter].m.Unlock()
|
||||
h.m.Unlock()
|
||||
return h.evtArray[iter], nil
|
||||
}
|
||||
//h.evtArray[iter].m.Unlock()
|
||||
h.m.Unlock()
|
||||
count++
|
||||
}
|
||||
|
||||
return nil, icserror.ICSERREVTAlloc
|
||||
}
|
||||
|
||||
//remove data from Event Array
|
||||
func (h *EventH) RemoveEvent(event *Event) *icserror.IcsError {
|
||||
if event == nil {
|
||||
return icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
if h.evtArray[event.ID].Data == nil {
|
||||
return icserror.ICSERREVTRemove
|
||||
}
|
||||
|
||||
//h.evtArray[event.ID].m.Lock()
|
||||
h.m.Lock()
|
||||
h.evtArray[event.ID].Data = nil
|
||||
//h.evtArray[event.ID].m.Unlock()
|
||||
h.m.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *EventH) removeEvent(id int) *icserror.IcsError {
|
||||
if h.evtArray[id].Data == nil {
|
||||
return icserror.ICSERREVTRemove
|
||||
}
|
||||
|
||||
//h.evtArray[id].m.Lock()
|
||||
h.m.Lock()
|
||||
h.evtArray[id].Data = nil
|
||||
//h.evtArray[id].m.Unlock()
|
||||
h.m.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *EventH) Copy(src *Event, dst *Event) *icserror.IcsError {
|
||||
if dst == nil {
|
||||
return icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
//e.m.Lock()
|
||||
h.m.Lock()
|
||||
dst.Data = src.Data
|
||||
dst.ID = src.ID
|
||||
h.m.Unlock()
|
||||
//e.m.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *EventH) PostEvent(targetID int, event *Event) *icserror.IcsError {
|
||||
if targetID < 0 || event == nil {
|
||||
return icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
target := GetEvtSystemInstance()
|
||||
q := target[targetID]
|
||||
esErr := q.PutJob(event)
|
||||
if esErr != nil {
|
||||
|
||||
return esErr
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *EventH) GetEvent(targetID int) (*Event, *icserror.IcsError) {
|
||||
if targetID < 0 {
|
||||
return nil, icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
target := GetEvtSystemInstance()
|
||||
q := target[targetID]
|
||||
pos, esErr := q.GetJob()
|
||||
if esErr != nil || pos < 0 {
|
||||
return nil, esErr
|
||||
}
|
||||
|
||||
e := &Event{}
|
||||
//h.evtArray[pos].Copy(e)
|
||||
h.Copy(h.evtArray[pos], e)
|
||||
h.RemoveEvent(h.evtArray[pos])
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
//FOR ONLY DEBUG. DO NOT USE THIS FUNCTION-getEvt()!
|
||||
func (h *EventH) getEvt(eventID int) *Event {
|
||||
return h.evtArray[eventID]
|
||||
}
|
@ -0,0 +1,118 @@
|
||||
/*
|
||||
****************************
|
||||
struct EventSystem
|
||||
****************************
|
||||
session의 Job queue
|
||||
각 세션마다 자기 자신이 처리해야 할 Event struct의 Event ID를 저장하는 JobQ를 가진다.
|
||||
*/
|
||||
|
||||
package icsevent
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
)
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
//전역 세션용 이벤트 시스템 구조체.
|
||||
type EventSystem struct {
|
||||
id int //session id
|
||||
JobQ *RRData //event id q for session
|
||||
m *sync.Mutex
|
||||
}
|
||||
|
||||
var bigEvtSystem []*EventSystem
|
||||
var onceEvtSystem sync.Once
|
||||
|
||||
//make singleton EventSystem struct
|
||||
func GetEvtSystemInstance() []*EventSystem {
|
||||
onceEvtSystem.Do(func() {
|
||||
bigEvtSystem = make([]*EventSystem, channelNum)
|
||||
|
||||
for iter := 0; iter < channelNum; iter++ {
|
||||
bigEvtSystem[iter] = new(EventSystem)
|
||||
bigEvtSystem[iter].Init(iter)
|
||||
}
|
||||
})
|
||||
|
||||
return bigEvtSystem
|
||||
}
|
||||
|
||||
func SetChannelNum(chNum int) {
|
||||
channelNum = chNum
|
||||
}
|
||||
|
||||
func (es *EventSystem) Init(id int) {
|
||||
es.id = id
|
||||
es.JobQ = NewRRData()
|
||||
es.m = &sync.Mutex{}
|
||||
}
|
||||
|
||||
func GetMyEventSystem(id int) *EventSystem {
|
||||
es := GetEvtSystemInstance()
|
||||
return es[id]
|
||||
}
|
||||
|
||||
func (es *EventSystem) GetMyID() int {
|
||||
return es.id
|
||||
}
|
||||
|
||||
func (es *EventSystem) PutJob(event *Event) (err *icserror.IcsError) {
|
||||
if event == nil {
|
||||
return icserror.ICSERRInvalidParam
|
||||
}
|
||||
if es.JobQ == nil {
|
||||
return icserror.ICSERREVTNotInit
|
||||
}
|
||||
|
||||
es.m.Lock()
|
||||
rrerr := Push(es.JobQ, event.ID)
|
||||
if rrerr != nil {
|
||||
es.m.Unlock()
|
||||
return rrerr
|
||||
}
|
||||
es.m.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (es *EventSystem) GetJob() (pos int, err *icserror.IcsError) {
|
||||
if es.JobQ == nil {
|
||||
return -1, icserror.ICSERREVTNotInit
|
||||
}
|
||||
|
||||
es.m.Lock()
|
||||
var data interface{}
|
||||
var h *RRData
|
||||
h, data, err = Pop(es.JobQ)
|
||||
//es.JobQ, data, err = icsutil.Pop(es.JobQ)
|
||||
if err != nil || data == nil {
|
||||
//err.Print()
|
||||
es.m.Unlock()
|
||||
return -1, err
|
||||
}
|
||||
|
||||
switch v := data.(type) {
|
||||
case int:
|
||||
es.JobQ = h
|
||||
pos = v
|
||||
|
||||
default:
|
||||
pos = -1
|
||||
es.m.Unlock()
|
||||
return pos, nil
|
||||
}
|
||||
es.m.Unlock()
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
|
||||
func (es *EventSystem) ClearJob() (err *icserror.IcsError) {
|
||||
h := NewEventH()
|
||||
for pos, err := es.GetJob(); err != nil; {
|
||||
h.removeEvent(pos)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
@ -0,0 +1,298 @@
|
||||
package icslog
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsutil"
|
||||
)
|
||||
|
||||
type IcsLog struct {
|
||||
logger *log.Logger
|
||||
|
||||
Output int
|
||||
Level int
|
||||
Path string
|
||||
LogFileName string
|
||||
LogFile *os.File
|
||||
DiskLimit int
|
||||
DelDay int
|
||||
DelHour int
|
||||
isRotate bool
|
||||
logSize int
|
||||
rotateNum int
|
||||
|
||||
buf bytes.Buffer
|
||||
CurrentDate time.Time
|
||||
conf *icsconf.LogConfig
|
||||
//conf *icsconf.IcsConfig
|
||||
IsDiskFull bool
|
||||
|
||||
M *sync.Mutex
|
||||
}
|
||||
|
||||
//default max log size 30 megabytes
|
||||
const DEFAULT_LOG_MAX_SIZE = 30
|
||||
|
||||
//default log rotate num
|
||||
const DEFAULT_LOG_ROTATE_NUM = 10
|
||||
|
||||
//max log rotate num
|
||||
const MAX_LOG_ROTATE_NUM = 99
|
||||
|
||||
const (
|
||||
LOG_LEVEL_DEBUG2 = iota
|
||||
LOG_LEVEL_DEBUG1
|
||||
LOG_LEVEL_DEBUG
|
||||
LOG_LEVEL_STATIS
|
||||
LOG_LEVEL_INFO
|
||||
LOG_LEVEL_WARN
|
||||
LOG_LEVEL_ERROR
|
||||
LOG_LEVEL_FATAL
|
||||
LOG_LEVEL_MAX
|
||||
)
|
||||
|
||||
//log output
|
||||
const (
|
||||
LOG_OUTPUT_FILE = 1 << (32 - 1 - iota)
|
||||
LOG_OUTPUT_STDOUT
|
||||
)
|
||||
|
||||
var IcsLogLevelStr [LOG_LEVEL_MAX]string
|
||||
|
||||
var gIcsLog *IcsLog
|
||||
var onceLog sync.Once
|
||||
|
||||
func init() {
|
||||
IcsLogLevelStr[LOG_LEVEL_DEBUG2] = "DEBUG2"
|
||||
IcsLogLevelStr[LOG_LEVEL_DEBUG1] = "DEBUG1"
|
||||
IcsLogLevelStr[LOG_LEVEL_DEBUG] = "DEBUG"
|
||||
IcsLogLevelStr[LOG_LEVEL_STATIS] = "STATISTICS"
|
||||
IcsLogLevelStr[LOG_LEVEL_INFO] = "INFO"
|
||||
IcsLogLevelStr[LOG_LEVEL_WARN] = "WARN"
|
||||
IcsLogLevelStr[LOG_LEVEL_ERROR] = "ERROR"
|
||||
IcsLogLevelStr[LOG_LEVEL_FATAL] = "FATAL"
|
||||
}
|
||||
|
||||
//if fail, return icserror
|
||||
func NewIcsLog(conf *icsconf.LogConfig, level int, output int, path string, disklimit int) (*IcsLog, *icserror.IcsError) {
|
||||
//func NewIcsLog(conf *icsconf.IcsConfig, level int, output int, path string, disklimit int) (*IcsLog, *icserror.IcsError) {
|
||||
//func NewIcsLog(conf *icsconf.IcsConfig, level interface{}, output interface{}, path string, disklimit int) (*IcsLog, *icserror.IcsError) {
|
||||
var reterr *icserror.IcsError = nil
|
||||
|
||||
//singleton
|
||||
onceLog.Do(func() {
|
||||
gIcsLog = &IcsLog{
|
||||
conf: conf,
|
||||
Level: level,
|
||||
Output: output,
|
||||
Path: path,
|
||||
DiskLimit: disklimit,
|
||||
IsDiskFull: false,
|
||||
logSize: DEFAULT_LOG_MAX_SIZE,
|
||||
rotateNum: DEFAULT_LOG_ROTATE_NUM,
|
||||
}
|
||||
|
||||
gIcsLog.M = &sync.Mutex{}
|
||||
gIcsLog.isRotate = strings.Compare("YES", strings.ToUpper(gIcsLog.conf.RotateConfig.YesNo)) == 0
|
||||
//gIcsLog.isRotate = strings.Compare("YES", strings.ToUpper(gIcsLog.conf.LogConfig.RotateConfig.YesNo)) == 0
|
||||
var serr error
|
||||
gIcsLog.logSize, serr = strconv.Atoi(gIcsLog.conf.RotateConfig.Size)
|
||||
//gIcsLog.logSize, serr = strconv.Atoi(gIcsLog.conf.LogConfig.RotateConfig.Size)
|
||||
if serr != nil {
|
||||
gIcsLog.logSize = DEFAULT_LOG_MAX_SIZE
|
||||
}
|
||||
gIcsLog.rotateNum, serr = strconv.Atoi(gIcsLog.conf.RotateConfig.Num)
|
||||
//gIcsLog.rotateNum, serr = strconv.Atoi(gIcsLog.conf.LogConfig.RotateConfig.Num)
|
||||
if serr != nil {
|
||||
gIcsLog.rotateNum = DEFAULT_LOG_ROTATE_NUM
|
||||
}
|
||||
if gIcsLog.rotateNum > MAX_LOG_ROTATE_NUM {
|
||||
gIcsLog.rotateNum = MAX_LOG_ROTATE_NUM
|
||||
}
|
||||
|
||||
gIcsLog.logger = log.New(&gIcsLog.buf, "", log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
|
||||
|
||||
gIcsLog.CurrentDate = time.Now()
|
||||
gIcsLog.DelDay = conf.DelConfig.DelDay
|
||||
gIcsLog.DelHour = conf.DelConfig.DelHour
|
||||
|
||||
//make log file - icsvg.log-yyyymmdd
|
||||
yyyy, mm, dd := gIcsLog.CurrentDate.Date()
|
||||
gIcsLog.LogFileName = fmt.Sprintf("%s/icsvs.log-%d%02d%02d", gIcsLog.Path, yyyy, mm, dd)
|
||||
|
||||
stat, err := os.Stat(gIcsLog.LogFileName)
|
||||
if err == nil {
|
||||
if gIcsLog.checkLogRotate() && stat.Size()/ONEMB >= int64(gIcsLog.logSize) {
|
||||
rotateNum := gIcsLog.getTodayLogFileNum()
|
||||
//fmt.Println("rotate num:", rotateNum)
|
||||
if rotateNum > 0 && rotateNum < gIcsLog.rotateNum {
|
||||
gIcsLog.shiftLogFiles(rotateNum)
|
||||
|
||||
var oerr error
|
||||
oerr = os.MkdirAll(filepath.Dir(gIcsLog.LogFileName), 0777)
|
||||
if oerr != nil {
|
||||
icserror.ICSERRMakeDir.SetError(oerr)
|
||||
icserror.ICSERRMakeDir.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
|
||||
gIcsLog.LogFile, oerr = os.OpenFile(gIcsLog.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if oerr != nil {
|
||||
//fmt.Println(gIcsLog.LogFileName)
|
||||
icserror.ICSERRFileOpen.SetError(oerr)
|
||||
reterr = icserror.ICSERRFileOpen
|
||||
reterr.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
}
|
||||
} else if stat.Size()/ONEMB < int64(gIcsLog.logSize) {
|
||||
var oerr error
|
||||
oerr = os.MkdirAll(filepath.Dir(gIcsLog.LogFileName), 0777)
|
||||
if oerr != nil {
|
||||
icserror.ICSERRMakeDir.SetError(oerr)
|
||||
icserror.ICSERRMakeDir.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
|
||||
gIcsLog.LogFile, oerr = os.OpenFile(gIcsLog.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if oerr != nil {
|
||||
//fmt.Println(gIcsLog.LogFileName)
|
||||
icserror.ICSERRFileOpen.SetError(oerr)
|
||||
reterr = icserror.ICSERRFileOpen
|
||||
reterr.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var oerr error
|
||||
oerr = os.MkdirAll(filepath.Dir(gIcsLog.LogFileName), 0777)
|
||||
if oerr != nil {
|
||||
icserror.ICSERRMakeDir.SetError(oerr)
|
||||
icserror.ICSERRMakeDir.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
|
||||
gIcsLog.LogFile, oerr = os.OpenFile(gIcsLog.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if oerr != nil {
|
||||
//fmt.Println(gIcsLog.LogFileName)
|
||||
icserror.ICSERRFileOpen.SetError(oerr)
|
||||
reterr = icserror.ICSERRFileOpen
|
||||
reterr.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
return gIcsLog, reterr
|
||||
}
|
||||
|
||||
func GetIcsLog() *IcsLog {
|
||||
return gIcsLog
|
||||
}
|
||||
|
||||
func GetLogLevelID(str string) int {
|
||||
switch str {
|
||||
case "DEBUG2":
|
||||
return LOG_LEVEL_DEBUG2
|
||||
case "DEBUG1":
|
||||
return LOG_LEVEL_DEBUG1
|
||||
case "DEBUG":
|
||||
return LOG_LEVEL_DEBUG
|
||||
case "STATISTICS":
|
||||
return LOG_LEVEL_STATIS
|
||||
case "INFO":
|
||||
return LOG_LEVEL_INFO
|
||||
case "WARN":
|
||||
return LOG_LEVEL_WARN
|
||||
case "ERROR":
|
||||
return LOG_LEVEL_ERROR
|
||||
case "FATAL":
|
||||
return LOG_LEVEL_FATAL
|
||||
default:
|
||||
return -1
|
||||
}
|
||||
}
|
||||
|
||||
func GetLogOutputID(str string) int {
|
||||
switch str {
|
||||
case "FILE":
|
||||
return LOG_OUTPUT_FILE
|
||||
default:
|
||||
return LOG_OUTPUT_STDOUT
|
||||
}
|
||||
}
|
||||
|
||||
func (s *IcsLog) DelLog() {
|
||||
//var derr *icserror.IcsError = nil
|
||||
delLogCount := 0
|
||||
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
switch v := err.(type) {
|
||||
case error:
|
||||
icserror.ICSERRFileOpen.SetError(v)
|
||||
s.Printf(LOG_LEVEL_WARN, -1, "PANIC! %s\n%s", icserror.ICSERRFileOpen.GetError().Error(), string(debug.Stack()))
|
||||
default:
|
||||
s.Print(LOG_LEVEL_WARN, -1, icserror.ICSERRFileOpen.GetError().Error())
|
||||
}
|
||||
}
|
||||
//derr = icserror.ICSERRFileOpen
|
||||
}()
|
||||
|
||||
// 1. Get Log Del Time
|
||||
yyyy, mm, dd := s.CurrentDate.Date()
|
||||
curTime, _ := time.Parse("2006-01-02", fmt.Sprintf("%d-%02d-%02d", yyyy, mm, dd))
|
||||
delTime := curTime.AddDate(0, 0, -s.DelDay)
|
||||
|
||||
files, rderr := ioutil.ReadDir(s.Path)
|
||||
if rderr != nil {
|
||||
s.Printf(LOG_LEVEL_ERROR, -1, " Read Log Dir error - %s \n", rderr)
|
||||
fmt.Printf("Read Log Dir error - %s", rderr)
|
||||
} else {
|
||||
var logYYYY, logMM, logDD string
|
||||
for _, file := range files {
|
||||
/*
|
||||
TODO
|
||||
1. 로그 파일을 시간으로 변환
|
||||
2. 현재 시간 - 삭제기간
|
||||
3. 둘 시간 차이가 0 이상 나면 삭제대상
|
||||
*/
|
||||
logTime := strings.SplitN(file.Name(), "-", -1)[1]
|
||||
logYYYY, logMM, logDD = logTime[:4], logTime[4:6], logTime[6:8]
|
||||
chgLogTime, perr := time.Parse("2006-01-02", fmt.Sprintf("%s-%s-%s", logYYYY, logMM, logDD))
|
||||
if perr != nil {
|
||||
s.Printf(LOG_LEVEL_ERROR, -1, " Log Time Parse error - %s \n", perr)
|
||||
fmt.Printf("Log Time Parse error - %s", perr)
|
||||
} else {
|
||||
diff := delTime.Sub(chgLogTime)
|
||||
|
||||
// diff > 0 => delete log
|
||||
if diff > 0 {
|
||||
delResult := icsutil.DeleteFile(s.Path, file.Name())
|
||||
if delResult != "" {
|
||||
s.Printf(LOG_LEVEL_ERROR, -1, " Delete File error - %s \n", delResult)
|
||||
} else {
|
||||
s.Printf(LOG_LEVEL_INFO, -1, " Delete %s!!!!\n", file.Name())
|
||||
fmt.Printf("Delete %s!!!!\n", file.Name())
|
||||
delLogCount += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
s.Printf(LOG_LEVEL_INFO, -1, " Delete File Count - %d \n", delLogCount)
|
||||
fmt.Printf("Log Delete Count : %d", delLogCount)
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package icslog
|
||||
|
||||
import "sync"
|
||||
|
||||
type LogLevel struct {
|
||||
currentLevel interface{}
|
||||
m sync.Mutex
|
||||
}
|
||||
|
||||
func (l *LogLevel) SetLogLevel(level interface{}) {
|
||||
l.m.Lock()
|
||||
defer l.m.Unlock()
|
||||
|
||||
l.currentLevel = level
|
||||
}
|
||||
|
||||
func (l *LogLevel) GetLogLevel() (level interface{}) {
|
||||
l.m.Lock()
|
||||
defer l.m.Unlock()
|
||||
|
||||
return l.currentLevel
|
||||
}
|
@ -0,0 +1,199 @@
|
||||
package icslog
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsutil"
|
||||
)
|
||||
|
||||
const (
|
||||
ONEMB = 1048576
|
||||
)
|
||||
|
||||
func (l *IcsLog) Printf(level int, sessionID int, format string, a ...interface{}) {
|
||||
msg := fmt.Sprintf(format, a...)
|
||||
|
||||
if level >= l.Level {
|
||||
//check disk full
|
||||
aSpace := icsutil.GetDiskAvailableSpace(filepath.Dir(l.LogFileName))
|
||||
if aSpace < uint64(l.conf.Disklimit*ONEMB) {
|
||||
//if aSpace < uint64(l.conf.LogConfig.Disklimit*ONEMB) {
|
||||
if !l.IsDiskFull {
|
||||
msg = fmt.Sprintf("Disk Full! Available Disk Space: %dMB", aSpace/ONEMB)
|
||||
l.logger.Output(2, msg)
|
||||
if l.LogFile != nil {
|
||||
l.LogFile.WriteString(l.buf.String())
|
||||
}
|
||||
l.buf.Reset()
|
||||
l.IsDiskFull = true
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
l.M.Lock()
|
||||
|
||||
if l.checkLogRotate() {
|
||||
//check log size
|
||||
stat, err := os.Stat(l.LogFileName)
|
||||
if err != nil {
|
||||
msg = fmt.Sprintf("Could not get log file(%s) size", l.LogFileName)
|
||||
l.logger.Output(2, msg)
|
||||
if l.LogFile != nil {
|
||||
l.LogFile.WriteString(l.buf.String())
|
||||
}
|
||||
l.buf.Reset()
|
||||
|
||||
l.M.Unlock()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if stat.Size()/ONEMB >= int64(l.logSize) {
|
||||
//shift log files
|
||||
rotateNum := gIcsLog.getTodayLogFileNum()
|
||||
if rotateNum > 0 && rotateNum < gIcsLog.rotateNum {
|
||||
gIcsLog.shiftLogFiles(rotateNum)
|
||||
|
||||
l.LogFile.Sync()
|
||||
l.LogFile.Close()
|
||||
|
||||
//open new log file
|
||||
var oerr error
|
||||
//fmt.Println("LOG rotate new log file", l.LogFileName)
|
||||
l.LogFile, oerr = os.OpenFile(l.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if oerr != nil {
|
||||
icserror.ICSERRFileOpen.SetError(oerr)
|
||||
icserror.ICSERRFileOpen.PrintWithCaller(1)
|
||||
|
||||
l.M.Unlock()
|
||||
return
|
||||
}
|
||||
} else {
|
||||
l.M.Unlock()
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//write log
|
||||
if level < LOG_LEVEL_DEBUG2 || level > LOG_LEVEL_FATAL {
|
||||
level = LOG_LEVEL_INFO
|
||||
}
|
||||
var logmsg string
|
||||
if sessionID >= 0 {
|
||||
logmsg = fmt.Sprintf("[%s][%03d]> %s", IcsLogLevelStr[level], sessionID, msg)
|
||||
} else {
|
||||
logmsg = fmt.Sprintf("[%s][-1]> %s", IcsLogLevelStr[level], msg)
|
||||
}
|
||||
|
||||
l.logger.Output(2, logmsg)
|
||||
if l.LogFile != nil {
|
||||
l.LogFile.WriteString(l.buf.String())
|
||||
}
|
||||
l.buf.Reset()
|
||||
|
||||
l.M.Unlock()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (l *IcsLog) Print(level int, sessionID int, msg string) {
|
||||
if level >= l.Level {
|
||||
//check disk full
|
||||
aSpace := icsutil.GetDiskAvailableSpace(filepath.Dir(l.LogFileName))
|
||||
if aSpace < uint64(l.conf.Disklimit*ONEMB) {
|
||||
//if aSpace < uint64(l.conf.LogConfig.Disklimit*ONEMB) {
|
||||
if !l.IsDiskFull {
|
||||
msg = fmt.Sprintf("Disk Full! Available Disk Space: %dMB", aSpace/ONEMB)
|
||||
l.logger.Output(2, msg)
|
||||
if l.LogFile != nil {
|
||||
l.LogFile.WriteString(l.buf.String())
|
||||
}
|
||||
l.buf.Reset()
|
||||
l.IsDiskFull = true
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
l.M.Lock()
|
||||
|
||||
if l.checkLogRotate() {
|
||||
//check log size
|
||||
stat, err := os.Stat(l.LogFileName)
|
||||
if err != nil {
|
||||
msg = fmt.Sprintf("Could not get log file(%s) size", l.LogFileName)
|
||||
l.logger.Output(2, msg)
|
||||
if l.LogFile != nil {
|
||||
l.LogFile.WriteString(l.buf.String())
|
||||
}
|
||||
l.buf.Reset()
|
||||
|
||||
l.M.Unlock()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if stat.Size()/ONEMB >= int64(l.logSize) {
|
||||
//shift log files
|
||||
rotateNum := gIcsLog.getTodayLogFileNum()
|
||||
//fmt.Println("rotate num:", rotateNum, "log size:", stat.Size()/ONEMB, l.logSize)
|
||||
if rotateNum > 0 && rotateNum < gIcsLog.rotateNum {
|
||||
gIcsLog.shiftLogFiles(rotateNum)
|
||||
|
||||
l.LogFile.Sync()
|
||||
l.LogFile.Close()
|
||||
|
||||
//open new log file
|
||||
var oerr error
|
||||
l.LogFile, oerr = os.OpenFile(l.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if oerr != nil {
|
||||
icserror.ICSERRFileOpen.SetError(oerr)
|
||||
icserror.ICSERRFileOpen.PrintWithCaller(1)
|
||||
|
||||
l.M.Unlock()
|
||||
return
|
||||
}
|
||||
} else {
|
||||
l.M.Unlock()
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//write log
|
||||
if level < LOG_LEVEL_DEBUG2 || level > LOG_LEVEL_FATAL {
|
||||
level = LOG_LEVEL_INFO
|
||||
}
|
||||
var logmsg string
|
||||
if sessionID >= 0 {
|
||||
logmsg = fmt.Sprintf("[%s][%03d]> %s", IcsLogLevelStr[level], sessionID, msg)
|
||||
} else {
|
||||
logmsg = fmt.Sprintf("[%s][-1]> %s", IcsLogLevelStr[level], msg)
|
||||
}
|
||||
l.logger.Output(2, logmsg)
|
||||
if l.LogFile != nil {
|
||||
l.LogFile.WriteString(l.buf.String())
|
||||
}
|
||||
l.buf.Reset()
|
||||
|
||||
l.M.Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
func goid() int {
|
||||
var buf [64]byte
|
||||
n := runtime.Stack(buf[:], false)
|
||||
idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0]
|
||||
id, err := strconv.Atoi(idField)
|
||||
if err != nil {
|
||||
return -1
|
||||
}
|
||||
return id
|
||||
}
|
@ -0,0 +1,71 @@
|
||||
package icslog
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
//returns created log file numnber in today
|
||||
func (l *IcsLog) getTodayLogFileNum() int {
|
||||
dir := filepath.Dir(l.LogFileName)
|
||||
files, rerr := os.ReadDir(dir)
|
||||
if rerr != nil {
|
||||
return 0
|
||||
}
|
||||
iter := 0
|
||||
for _, file := range files {
|
||||
if !file.IsDir() {
|
||||
if strings.Contains(file.Name(), filepath.Base(l.LogFileName)) {
|
||||
iter++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if iter > MAX_LOG_ROTATE_NUM {
|
||||
return 0
|
||||
}
|
||||
|
||||
return iter
|
||||
}
|
||||
|
||||
func (l *IcsLog) shiftLogFiles(filenum int) {
|
||||
dir := filepath.Dir(l.LogFileName)
|
||||
files, rerr := os.ReadDir(dir)
|
||||
if rerr != nil {
|
||||
return
|
||||
}
|
||||
|
||||
//l.M.Lock()
|
||||
remFileNum := filenum
|
||||
filesLen := len(files) - 1
|
||||
for file := files[filesLen]; ; file = files[filesLen] {
|
||||
if !file.IsDir() {
|
||||
//fmt.Println(">>333", file.Name(), filepath.Base(l.LogFileName))
|
||||
if strings.Contains(file.Name(), filepath.Base(l.LogFileName)) {
|
||||
//fmt.Println(filesLen, file.Name())
|
||||
old := fmt.Sprintf("%s/%s", dir, file.Name())
|
||||
//fmt.Println(old)
|
||||
new := fmt.Sprintf("%s.%02d", l.LogFileName, remFileNum)
|
||||
//fmt.Println(new)
|
||||
os.Rename(old, new)
|
||||
remFileNum--
|
||||
if remFileNum < 0 {
|
||||
//fmt.Println(">666")
|
||||
break
|
||||
}
|
||||
//fmt.Println(">444")
|
||||
}
|
||||
}
|
||||
filesLen--
|
||||
if filesLen < 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
//l.M.Unlock()
|
||||
}
|
||||
|
||||
func (l *IcsLog) checkLogRotate() bool {
|
||||
return l.isRotate
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
package icsnet
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
)
|
||||
|
||||
var MAX_MTU int = 1500
|
||||
|
||||
type IcsNeter interface {
|
||||
Listen() *icserror.IcsError
|
||||
|
||||
Connect(localAddr, remoteAddr *IcsNetAddr) *icserror.IcsError
|
||||
Close() *icserror.IcsError
|
||||
|
||||
Write(b []byte) (int, *icserror.IcsError)
|
||||
WriteSIP(b []byte) (int, *icserror.IcsError)
|
||||
WriteRTP(b []byte) (int, *icserror.IcsError)
|
||||
|
||||
Read(size int) ([]byte, int, *icserror.IcsError)
|
||||
ReadSIP() ([]byte, *net.UDPAddr, int, *icserror.IcsError)
|
||||
ReadRTP() ([]byte, *net.UDPAddr, int, *icserror.IcsError)
|
||||
|
||||
LocalAddr() net.Addr
|
||||
RemoteAddr() net.Addr
|
||||
SetRemoteAddr(raddr *IcsNetAddr)
|
||||
}
|
||||
|
||||
type IcsConn struct {
|
||||
ICSUDPConn *net.UDPConn
|
||||
ICSTCPConn *net.TCPConn
|
||||
}
|
||||
|
||||
func GetMyIP() ([]string, *icserror.IcsError) {
|
||||
var retIP []string
|
||||
ifaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
icserror.ICSERRNETNotFoundIF.SetError(err)
|
||||
return nil, icserror.ICSERRNETNotFoundIF
|
||||
}
|
||||
|
||||
for iter, i := range ifaces {
|
||||
addrs, err := i.Addrs()
|
||||
// handle err
|
||||
if err != nil {
|
||||
icserror.ICSERRNETGetAddr.SetError(err)
|
||||
return nil, icserror.ICSERRNETGetAddr
|
||||
}
|
||||
for _, addr := range addrs {
|
||||
var ip net.IP
|
||||
switch v := addr.(type) {
|
||||
case *net.IPNet:
|
||||
ip = v.IP
|
||||
case *net.IPAddr:
|
||||
ip = v.IP
|
||||
}
|
||||
retIP[iter] = fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
|
||||
}
|
||||
}
|
||||
|
||||
return retIP, nil
|
||||
}
|
@ -0,0 +1,122 @@
|
||||
package icsnet
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
)
|
||||
|
||||
type IcsNetAddr struct {
|
||||
IPv4 []byte
|
||||
IPv4String string
|
||||
Port int
|
||||
}
|
||||
|
||||
func NewNetAddr() IcsNetAddr {
|
||||
addr := IcsNetAddr{}
|
||||
addr.IPv4 = make([]byte, 4)
|
||||
|
||||
return addr
|
||||
}
|
||||
|
||||
//format 123.123.123.123:9999
|
||||
func NewNetAddrWithIPAddr(ipaddr string) IcsNetAddr {
|
||||
addr := IcsNetAddr{}
|
||||
addr.IPv4 = make([]byte, 4)
|
||||
|
||||
spl := strings.Split(ipaddr, ":")
|
||||
addr.SetIPv4String(spl[0])
|
||||
var err error
|
||||
addr.Port, err = strconv.Atoi(spl[1])
|
||||
if err != nil {
|
||||
addr.Port = 0
|
||||
}
|
||||
|
||||
return addr
|
||||
}
|
||||
|
||||
func NewNetAddrWithIPPort(ip string, port int) IcsNetAddr {
|
||||
addr := IcsNetAddr{}
|
||||
addr.IPv4 = make([]byte, 4)
|
||||
|
||||
addr.SetIPv4String(ip)
|
||||
addr.SetPort(port)
|
||||
|
||||
return addr
|
||||
}
|
||||
|
||||
func NewIcsNetAddrWithUDPAddr(addr *net.UDPAddr) *IcsNetAddr {
|
||||
icsaddr := &IcsNetAddr{}
|
||||
icsaddr.IPv4 = make([]byte, 4)
|
||||
|
||||
icsaddr.SetIPv4String(addr.IP.String())
|
||||
icsaddr.SetPort(addr.Port)
|
||||
|
||||
//fmt.Println(">>>>", icsaddr)
|
||||
return icsaddr
|
||||
}
|
||||
|
||||
func NewIcsNetAddrWithTCPAddr(addr *net.TCPAddr) *IcsNetAddr {
|
||||
icsaddr := &IcsNetAddr{}
|
||||
icsaddr.IPv4 = make([]byte, 4)
|
||||
|
||||
ip, sport, _ := net.SplitHostPort(addr.IP.String())
|
||||
port, _ := strconv.Atoi(sport)
|
||||
icsaddr.SetIPv4String(ip)
|
||||
icsaddr.SetPort(port)
|
||||
|
||||
return icsaddr
|
||||
}
|
||||
|
||||
func (a *IcsNetAddr) SetIPv4(ip []byte) {
|
||||
copy(a.IPv4, ip)
|
||||
a.IPv4String = fmt.Sprintf("%d.%d.%d.%d", a.IPv4[0], a.IPv4[1], a.IPv4[2], a.IPv4[3])
|
||||
}
|
||||
|
||||
func (a *IcsNetAddr) SetIPv4String(ip string) {
|
||||
a.IPv4String = ip
|
||||
|
||||
no := strings.Split(ip, ".")
|
||||
for iter, b := range no {
|
||||
i, err := strconv.Atoi(b)
|
||||
if err != nil {
|
||||
i = 0
|
||||
}
|
||||
|
||||
a.IPv4[iter] = byte(i)
|
||||
}
|
||||
}
|
||||
|
||||
func (a *IcsNetAddr) SetPort(port int) {
|
||||
a.Port = port
|
||||
}
|
||||
|
||||
func (a IcsNetAddr) String() string {
|
||||
strAddr := fmt.Sprintf("%d.%d.%d.%d:%d", a.IPv4[0], a.IPv4[1], a.IPv4[2], a.IPv4[3], a.Port)
|
||||
return strAddr
|
||||
}
|
||||
|
||||
func (a IcsNetAddr) ResolveIcsNetAddr(network string) (interface{}, *icserror.IcsError) {
|
||||
ip := fmt.Sprintf("%d.%d.%d.%d:%d", a.IPv4[0], a.IPv4[1], a.IPv4[2], a.IPv4[3], a.Port)
|
||||
|
||||
if strings.Compare("tcp", network) == 0 {
|
||||
addr, err := net.ResolveTCPAddr("tcp", ip)
|
||||
if err != nil {
|
||||
icserror.ICSERRNETResolveAddrError.SetError(err)
|
||||
return nil, icserror.ICSERRNETResolveAddrError
|
||||
}
|
||||
return interface{}(*addr), nil
|
||||
} else if strings.Compare("udp", network) == 0 {
|
||||
addr, err := net.ResolveUDPAddr("udp", ip)
|
||||
if err != nil {
|
||||
icserror.ICSERRNETResolveAddrError.SetError(err)
|
||||
return nil, icserror.ICSERRNETResolveAddrError
|
||||
}
|
||||
return interface{}(*addr), nil
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
@ -0,0 +1,283 @@
|
||||
package icsnet
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
)
|
||||
|
||||
const (
|
||||
NET_BUFFER_LENGTH = 4096
|
||||
)
|
||||
|
||||
type IcsTCPNet struct {
|
||||
laddr *IcsNetAddr
|
||||
raddr *IcsNetAddr
|
||||
conn *IcsConn
|
||||
listener *net.TCPListener
|
||||
}
|
||||
|
||||
func NewTCP(laddr, raddr *IcsNetAddr) (tcpnet *IcsTCPNet) {
|
||||
tcpnet = &IcsTCPNet{
|
||||
laddr: laddr,
|
||||
raddr: raddr,
|
||||
conn: &IcsConn{},
|
||||
}
|
||||
|
||||
return tcpnet
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) Listen() *icserror.IcsError {
|
||||
addr, err := t.laddr.ResolveIcsNetAddr("tcp")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var aerr error
|
||||
switch v := addr.(type) {
|
||||
case net.TCPAddr:
|
||||
t.listener, aerr = net.ListenTCP("tcp", &v)
|
||||
if aerr != nil {
|
||||
icserror.ICSERRNETListenError.SetError(aerr)
|
||||
return icserror.ICSERRNETListenError
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) Accept() (conn *net.TCPConn, ierr *icserror.IcsError) {
|
||||
var err error
|
||||
if t.listener != nil {
|
||||
conn, err = t.listener.AcceptTCP()
|
||||
//t.conn.ICSTCPConn, err = t.listener.AcceptTCP()
|
||||
if err != nil {
|
||||
icserror.ICSERRNETAcceptError.SetError(err)
|
||||
return nil, icserror.ICSERRNETAcceptError
|
||||
}
|
||||
} else {
|
||||
return nil, icserror.ICSERRNETAcceptError
|
||||
}
|
||||
|
||||
return conn, nil
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) Connect(localAddr, remoteAddr *IcsNetAddr) *icserror.IcsError {
|
||||
if remoteAddr != nil {
|
||||
t.raddr = remoteAddr
|
||||
}
|
||||
raddr, rerr := t.raddr.ResolveIcsNetAddr("tcp")
|
||||
if rerr != nil {
|
||||
return rerr
|
||||
}
|
||||
|
||||
var aerr error
|
||||
switch v := raddr.(type) {
|
||||
case net.TCPAddr:
|
||||
t.conn.ICSTCPConn, aerr = net.DialTCP("tcp", nil, &v)
|
||||
if aerr != nil {
|
||||
icserror.ICSERRNETConnectError.SetError(aerr)
|
||||
return icserror.ICSERRNETConnectError
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) Close() *icserror.IcsError {
|
||||
if t.conn.ICSTCPConn == nil {
|
||||
return icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
aerr := t.conn.ICSTCPConn.Close()
|
||||
if aerr != nil {
|
||||
icserror.ICSERRNETNotConnectError.SetError(aerr)
|
||||
return icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) Write(b []byte) (int, *icserror.IcsError) {
|
||||
if t.conn.ICSTCPConn == nil {
|
||||
return 0, icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
wsize, err := t.conn.ICSTCPConn.Write(b)
|
||||
if err != nil {
|
||||
icserror.ICSERRNETWriteError.SetError(err)
|
||||
return -1, icserror.ICSERRNETWriteError
|
||||
}
|
||||
|
||||
return wsize, nil
|
||||
}
|
||||
|
||||
func (u *IcsTCPNet) WriteSIP(b []byte) (int, *icserror.IcsError) {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (u *IcsTCPNet) WriteRTP(b []byte) (int, *icserror.IcsError) {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) Read(size int) ([]byte, int, *icserror.IcsError) {
|
||||
var rlen int = 0
|
||||
buf := make([]byte, size)
|
||||
|
||||
for rlen = 0; ; {
|
||||
len, err := t.conn.ICSTCPConn.Read(buf[rlen:])
|
||||
//len, err := t.conn.ICSTCPConn.Read(buf)
|
||||
if err == nil {
|
||||
rlen += len
|
||||
if rlen >= size {
|
||||
return buf, rlen, nil
|
||||
}
|
||||
} else {
|
||||
icserror.ICSERRNETReadError.SetError(err)
|
||||
return nil, -1, icserror.ICSERRNETReadError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) ReadS(length int, lineEnd string) ([]byte, int, *icserror.IcsError) {
|
||||
var rlen int = 0
|
||||
size := NET_BUFFER_LENGTH
|
||||
if length > 0 {
|
||||
size = length
|
||||
}
|
||||
buf := make([]byte, size)
|
||||
//fmt.Println("Reads make size:", size, "buf size:", len(buf))
|
||||
|
||||
for rlen = 0; ; {
|
||||
rbuf := make([]byte, size)
|
||||
len, err := t.conn.ICSTCPConn.Read(rbuf)
|
||||
if err == nil {
|
||||
rlen += len
|
||||
copy(buf[:rlen], rbuf)
|
||||
if rlen >= size {
|
||||
return buf, rlen, nil
|
||||
} else if strings.Contains(string(buf), lineEnd) {
|
||||
return buf, rlen, nil
|
||||
}
|
||||
} else {
|
||||
icserror.ICSERRNETReadError.SetError(err)
|
||||
return nil, -1, icserror.ICSERRNETReadError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (u *IcsTCPNet) ReadSIP() ([]byte, *net.UDPAddr, int, *icserror.IcsError) {
|
||||
return nil, nil, 0, nil
|
||||
}
|
||||
|
||||
func (u *IcsTCPNet) ReadRTP() ([]byte, *net.UDPAddr, int, *icserror.IcsError) {
|
||||
return nil, nil, 0, nil
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) LocalAddr() net.Addr {
|
||||
return t.conn.ICSTCPConn.LocalAddr()
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) RemoteAddr() net.Addr {
|
||||
return t.conn.ICSTCPConn.RemoteAddr()
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) SetRemoteAddr(raddr *IcsNetAddr) {
|
||||
t.raddr = raddr
|
||||
}
|
||||
|
||||
// func (t *IcsTCPNet) SetLinger(sec int) {
|
||||
// t.conn.ICSTCPConn.SetLinger(sec)
|
||||
// }
|
||||
|
||||
func (t *IcsTCPNet) SetLinger() {
|
||||
conf := icsconf.GetIcsConfig()
|
||||
t.conn.ICSTCPConn.SetLinger(conf.Linger)
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) SetDeadline(sec int64) {
|
||||
t.conn.ICSTCPConn.SetDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) SetWriteDeadline(sec int64) {
|
||||
t.conn.ICSTCPConn.SetWriteDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) SetReadDeadline(sec int64) {
|
||||
t.conn.ICSTCPConn.SetReadDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||||
}
|
||||
|
||||
func SendCallSignal(laddr, raddr *IcsNetAddr, buf []byte) (t *IcsTCPNet, sendlen int, err *icserror.IcsError) {
|
||||
t = NewTCP(laddr, raddr)
|
||||
//connect to VoiceAgent
|
||||
err = t.Connect(laddr, raddr)
|
||||
if err != nil {
|
||||
return nil, -1, err
|
||||
}
|
||||
//defer t.Close()
|
||||
|
||||
// t.SetLinger(1)
|
||||
t.SetLinger()
|
||||
t.SetDeadline(180)
|
||||
|
||||
//send call signal
|
||||
sendlen, err = t.Write(buf)
|
||||
if err != nil {
|
||||
return nil, -1, err
|
||||
}
|
||||
|
||||
return t, sendlen, err
|
||||
}
|
||||
|
||||
//func ListenAndServeTCP(laddr, raddr *IcsNetAddr, bufend string, f func(*net.TCPConn, string)) (t *IcsTCPNet, err *icserror.IcsError) {
|
||||
func ListenAndServeTCP(laddr, raddr *IcsNetAddr, bufend string, f func(*IcsTCPNet, string)) (t *IcsTCPNet, err *icserror.IcsError) {
|
||||
t = NewTCP(laddr, raddr)
|
||||
err = t.Listen()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
//defer t.listener.Close()
|
||||
|
||||
l := icslog.GetIcsLog()
|
||||
go func() {
|
||||
//fmt.Printf("Started TCP Listen - %s\n", laddr.String())
|
||||
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Started TCP Listen - %s", laddr.String())
|
||||
|
||||
for {
|
||||
var conn *net.TCPConn
|
||||
var accepterr *icserror.IcsError
|
||||
if conn, accepterr = t.Accept(); accepterr != nil {
|
||||
//if accepterr := t.Accept(); accepterr != nil {
|
||||
continue
|
||||
}
|
||||
newT := NewTCP(nil, nil)
|
||||
newT.conn.ICSTCPConn = conn
|
||||
// newT.SetLinger(1)
|
||||
newT.SetLinger()
|
||||
newT.SetDeadline(180)
|
||||
l.Printf(icslog.LOG_LEVEL_DEBUG, -1, "Connected - [%s][%s]", conn.LocalAddr(), conn.RemoteAddr())
|
||||
//go f(conn, bufend)
|
||||
go f(newT, bufend)
|
||||
}
|
||||
}()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (t *IcsTCPNet) CloseListener() *icserror.IcsError {
|
||||
if t.listener == nil {
|
||||
return icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
aerr := t.listener.Close()
|
||||
if aerr != nil {
|
||||
icserror.ICSERRNETNotConnectError.SetError(aerr)
|
||||
return icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
@ -0,0 +1,267 @@
|
||||
package icsnet
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
)
|
||||
|
||||
type IcsUDPNet struct {
|
||||
laddr *IcsNetAddr
|
||||
raddr *IcsNetAddr
|
||||
conn *IcsConn
|
||||
}
|
||||
|
||||
func NewUDP(laddr, raddr *IcsNetAddr) (udpnet *IcsUDPNet) {
|
||||
udpnet = &IcsUDPNet{
|
||||
laddr: laddr,
|
||||
raddr: raddr,
|
||||
conn: &IcsConn{},
|
||||
}
|
||||
|
||||
return udpnet
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) GetRemoteAddr() *IcsNetAddr {
|
||||
addr := u.conn.ICSUDPConn.RemoteAddr()
|
||||
if addr == nil {
|
||||
return nil
|
||||
}
|
||||
ip, sport, _ := net.SplitHostPort(addr.String())
|
||||
port, _ := strconv.Atoi(sport)
|
||||
|
||||
ret := NewNetAddrWithIPPort(ip, port)
|
||||
return &ret
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) SetRemoteAddr(raddr *IcsNetAddr) {
|
||||
u.raddr = raddr
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) Listen() *icserror.IcsError {
|
||||
addr, err := u.laddr.ResolveIcsNetAddr("udp")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var aerr error
|
||||
switch v := addr.(type) {
|
||||
case net.UDPAddr:
|
||||
u.conn.ICSUDPConn, aerr = net.ListenUDP("udp4", &v)
|
||||
if aerr != nil {
|
||||
icserror.ICSERRNETListenError.SetError(aerr)
|
||||
return icserror.ICSERRNETListenError
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) Connect(localAddr, remoteAddr *IcsNetAddr) *icserror.IcsError {
|
||||
//var ra *net.UDPAddr
|
||||
var la, ra *net.UDPAddr
|
||||
|
||||
if localAddr != nil {
|
||||
u.laddr = localAddr
|
||||
}
|
||||
if remoteAddr != nil {
|
||||
u.raddr = remoteAddr
|
||||
}
|
||||
|
||||
if u.laddr != nil {
|
||||
laddr, err := u.laddr.ResolveIcsNetAddr("udp")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch v := laddr.(type) {
|
||||
case net.UDPAddr:
|
||||
la = &v
|
||||
}
|
||||
} else {
|
||||
la = nil
|
||||
}
|
||||
|
||||
if u.raddr != nil {
|
||||
raddr, err := u.raddr.ResolveIcsNetAddr("udp")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch v := raddr.(type) {
|
||||
case net.UDPAddr:
|
||||
ra = &v
|
||||
}
|
||||
} else {
|
||||
return icserror.ICSERRInvalidParam
|
||||
}
|
||||
|
||||
var derr error
|
||||
u.conn.ICSUDPConn, derr = net.DialUDP("udp", la, ra)
|
||||
if derr != nil {
|
||||
icserror.ICSERRNETConnectError.SetError(derr)
|
||||
return icserror.ICSERRNETConnectError
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) Close() *icserror.IcsError {
|
||||
//fmt.Println("UDP close!!")
|
||||
|
||||
if u.conn.ICSUDPConn == nil {
|
||||
return icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
err := u.conn.ICSUDPConn.Close()
|
||||
if err != nil {
|
||||
icserror.ICSERRNETCloseError.SetError(err)
|
||||
return icserror.ICSERRNETCloseError
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) Write(b []byte) (int, *icserror.IcsError) {
|
||||
if u.conn.ICSUDPConn == nil {
|
||||
return 0, icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
/*
|
||||
raddr := &net.UDPAddr{
|
||||
IP: u.raddr.IPv4,
|
||||
Port: u.raddr.Port,
|
||||
}
|
||||
//fmt.Println("Write addr ", raddr)
|
||||
wsize, err := u.conn.ICSUDPConn.WriteTo(b, raddr)
|
||||
*/
|
||||
//wsize, err := u.conn.ICSUDPConn.WriteToUDP(b, raddr)
|
||||
wsize, err := u.conn.ICSUDPConn.Write(b)
|
||||
if err != nil {
|
||||
icserror.ICSERRNETWriteError.SetError(err)
|
||||
//fmt.Println("UDP WRITE ERROR -", err)
|
||||
return -1, icserror.ICSERRNETWriteError
|
||||
}
|
||||
return wsize, nil
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) WriteSIP(b []byte) (int, *icserror.IcsError) {
|
||||
if u.conn.ICSUDPConn == nil {
|
||||
return 0, icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
raddr := &net.UDPAddr{
|
||||
IP: u.raddr.IPv4,
|
||||
Port: u.raddr.Port,
|
||||
}
|
||||
//fmt.Println("Write addr ", raddr)
|
||||
//wsize, err := u.conn.ICSUDPConn.WriteTo(b, raddr)
|
||||
wsize, err := u.conn.ICSUDPConn.WriteToUDP(b, raddr)
|
||||
//wsize, err := u.conn.ICSUDPConn.Write(b)
|
||||
if err != nil {
|
||||
icserror.ICSERRNETWriteError.SetError(err)
|
||||
//fmt.Println("UDP WRITE ERROR -", err)
|
||||
return -1, icserror.ICSERRNETWriteError
|
||||
}
|
||||
return wsize, nil
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) WriteRTP(b []byte) (int, *icserror.IcsError) {
|
||||
if u.conn.ICSUDPConn == nil {
|
||||
return 0, icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
raddr := &net.UDPAddr{
|
||||
IP: u.raddr.IPv4,
|
||||
Port: u.raddr.Port,
|
||||
}
|
||||
//fmt.Println("Write addr ", raddr)
|
||||
//wsize, err := u.conn.ICSUDPConn.WriteTo(b, raddr)
|
||||
wsize, err := u.conn.ICSUDPConn.WriteToUDP(b, raddr)
|
||||
//wsize, err := u.conn.ICSUDPConn.Write(b)
|
||||
if err != nil {
|
||||
icserror.ICSERRNETWriteError.SetError(err)
|
||||
//fmt.Println("UDP WRITE ERROR -", err)
|
||||
return -1, icserror.ICSERRNETWriteError
|
||||
}
|
||||
return wsize, nil
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) Read(size int) ([]byte, int, *icserror.IcsError) {
|
||||
if u.conn.ICSUDPConn == nil {
|
||||
return nil, -1, icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
buf := make([]byte, size)
|
||||
|
||||
for rlen := 0; ; {
|
||||
len, err := u.conn.ICSUDPConn.Read(buf)
|
||||
if err == nil {
|
||||
//fmt.Println(len, string(buf))
|
||||
rlen += len
|
||||
if rlen >= size {
|
||||
//fmt.Println(">>>", rlen, string(buf))
|
||||
return buf, rlen, nil
|
||||
}
|
||||
} else {
|
||||
icserror.ICSERRNETReadError.SetError(err)
|
||||
return nil, -1, icserror.ICSERRNETReadError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) ReadSIP() ([]byte, *net.UDPAddr, int, *icserror.IcsError) {
|
||||
if u.conn.ICSUDPConn == nil {
|
||||
return nil, nil, -1, icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
buf := make([]byte, 10240)
|
||||
|
||||
len, addr, err := u.conn.ICSUDPConn.ReadFromUDP(buf[:])
|
||||
//len, err := u.conn.ICSUDPConn.Read(buf[:])
|
||||
if err == nil {
|
||||
//fmt.Println("remote addr", u.conn.ICSUDPConn.RemoteAddr(), u.conn.ICSUDPConn.LocalAddr())
|
||||
return buf, addr, len, nil
|
||||
} else {
|
||||
icserror.ICSERRNETReadError.SetError(err)
|
||||
return nil, nil, -1, icserror.ICSERRNETReadError
|
||||
}
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) ReadRTP() ([]byte, *net.UDPAddr, int, *icserror.IcsError) {
|
||||
if u.conn.ICSUDPConn == nil {
|
||||
return nil, nil, -1, icserror.ICSERRNETNotConnectError
|
||||
}
|
||||
|
||||
buf := make([]byte, 10240)
|
||||
|
||||
len, addr, err := u.conn.ICSUDPConn.ReadFromUDP(buf[:])
|
||||
if err == nil {
|
||||
//fmt.Println("remote addr", u.conn.ICSUDPConn.RemoteAddr(), u.conn.ICSUDPConn.LocalAddr())
|
||||
return buf, addr, len, nil
|
||||
} else {
|
||||
icserror.ICSERRNETReadError.SetError(err)
|
||||
return nil, nil, -1, icserror.ICSERRNETReadError
|
||||
}
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) LocalAddr() net.Addr {
|
||||
return u.conn.ICSUDPConn.LocalAddr()
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) RemoteAddr() net.Addr {
|
||||
raddr := &net.UDPAddr{
|
||||
IP: u.raddr.IPv4,
|
||||
Port: u.raddr.Port,
|
||||
}
|
||||
return raddr
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) SetDeadLine(sec int64) {
|
||||
u.conn.ICSUDPConn.SetDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) SetWriteDeadLine(sec int64) {
|
||||
u.conn.ICSUDPConn.SetWriteDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||||
}
|
||||
|
||||
func (u *IcsUDPNet) SetReadDeadLine(sec int64) {
|
||||
u.conn.ICSUDPConn.SetReadDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||||
}
|
@ -0,0 +1,256 @@
|
||||
package icsstat
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsnet"
|
||||
)
|
||||
|
||||
type StatInfos struct {
|
||||
//necessary value
|
||||
SeqId string // 25
|
||||
LogTime string // 14
|
||||
LogType string // 3
|
||||
Sid string // 50
|
||||
ResultCode string // 8
|
||||
ReqTime string // 17
|
||||
RspTime string // 17
|
||||
ClientIp string // 40
|
||||
DevInfo string // 5
|
||||
OsInfo string // 50
|
||||
NwInfo string // 5
|
||||
SvcName string // 32
|
||||
DevModel string // 50
|
||||
CarrierType string // 1
|
||||
HostName string // 32
|
||||
ScnName string // 32
|
||||
|
||||
//not necessary
|
||||
CallId string // 60
|
||||
TrId string // 100
|
||||
ConcCall string // 5
|
||||
SvcType string // 20
|
||||
SvcReqTime string // 17
|
||||
SvcRspTime string // 17
|
||||
ResultMsg string // 256
|
||||
SttText string // 8192
|
||||
TtsText string // 1024
|
||||
}
|
||||
|
||||
const (
|
||||
//necessary value
|
||||
|
||||
STAT_INFO = 0
|
||||
SEQ_ID = STAT_INFO + 25
|
||||
LOG_TIME = SEQ_ID + 14
|
||||
LOG_TYPE = LOG_TIME + 3
|
||||
SID = LOG_TYPE + 50
|
||||
RESULT_CODE = SID + 8
|
||||
REQ_TIME = RESULT_CODE + 17
|
||||
RES_TIME = REQ_TIME + 17
|
||||
CLIENT_IP = RES_TIME + 40
|
||||
DEV_INFO = CLIENT_IP + 5
|
||||
OS_INFO = DEV_INFO + 50
|
||||
NW_INFO = OS_INFO + 5
|
||||
SVC_NAME = NW_INFO + 32
|
||||
DEV_MODEL = SVC_NAME + 50
|
||||
CARRIER_TYPE = DEV_MODEL + 1
|
||||
HOST_NAME = CARRIER_TYPE + 32
|
||||
SCN_NAME = HOST_NAME + 32
|
||||
|
||||
//not necessary
|
||||
CALL_ID = SCN_NAME + 60
|
||||
TR_ID = CALL_ID + 100
|
||||
CONC_CALL = TR_ID + 5
|
||||
SVC_TYPE = CONC_CALL + 20
|
||||
SVC_REQ_TIME = SVC_TYPE + 17
|
||||
SVC_RSP_TIME = SVC_REQ_TIME + 17
|
||||
RESULT_MSG = SVC_RSP_TIME + 17
|
||||
STT_TEXT = RESULT_MSG + 256
|
||||
TTS_TEXT = STT_TEXT + 8192 //slice 86..?
|
||||
)
|
||||
|
||||
func ListenStatMNG() (icserr *icserror.IcsError) {
|
||||
l := icslog.GetIcsLog()
|
||||
conf := icsconf.GetIcsConfig()
|
||||
|
||||
//start bot-command listen
|
||||
statPort := conf.Target.TargetPort
|
||||
statTransport := conf.Target.Transport
|
||||
statLocalAddrStr := fmt.Sprintf("0.0.0.0:%d", statPort)
|
||||
statLocalAddr := icsnet.NewNetAddrWithIPAddr(statLocalAddrStr)
|
||||
|
||||
var cmdErr *icserror.IcsError
|
||||
statTCP, cmdErr := icsnet.ListenAndServeTCP(&statLocalAddr, nil, "\r\n\r\n", BotCommand)
|
||||
if cmdErr != nil {
|
||||
l.Printf(icslog.LOG_LEVEL_FATAL, -1, "%s", cmdErr.GetError())
|
||||
return nil
|
||||
}
|
||||
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Listening Stat TCP Command %s port[%d]", statTransport, statPort)
|
||||
fmt.Println(statTCP)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func BotCommand(t *icsnet.IcsTCPNet, bufend string) {
|
||||
l := icslog.GetIcsLog()
|
||||
statInfos := new(StatInfos)
|
||||
|
||||
defer t.Close()
|
||||
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Connected from - %s", t.RemoteAddr())
|
||||
|
||||
for {
|
||||
statReads, rlen, rerr := t.ReadS(10018, bufend) // 여기서 전체 몇 byte씩 읽어서 로그를 찍을건지 알아야함
|
||||
if rerr != nil {
|
||||
if rerr.GetError() != io.EOF {
|
||||
l.Printf(icslog.LOG_LEVEL_ERROR, -1, "[Stat Command] ReadS Error! - %s[%d:%d]",
|
||||
rerr.GetError(), rlen, len(statReads))
|
||||
}
|
||||
break
|
||||
} else {
|
||||
fmt.Printf("Recved Stat Command(%s) %d \n", statReads, rlen)
|
||||
statInfos.ChangeByteToString(statReads)
|
||||
|
||||
insLog := ""
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.CallId)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.SeqId)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.LogTime)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.LogType)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.Sid)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.ResultCode)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.ReqTime)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.RspTime)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.ClientIp)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.DevInfo)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.OsInfo)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.NwInfo)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.SvcName)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.DevModel)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.CarrierType)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.HostName)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.ScnName)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.CallId)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.TrId)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.ConcCall)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.SvcType)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.SvcReqTime)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.SvcRspTime)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.ResultMsg)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.SttText)
|
||||
insLog += fmt.Sprintf("%s\n", statInfos.TtsText)
|
||||
|
||||
l.Printf(icslog.LOG_LEVEL_INFO, -1, "%s", insLog)
|
||||
fmt.Printf("stats- %s \n", statInfos.SeqId)
|
||||
fmt.Printf("stats- %s \n", statInfos.LogTime)
|
||||
fmt.Printf("stats- %s \n", statInfos.LogType)
|
||||
fmt.Printf("stats- %s \n", statInfos.Sid)
|
||||
fmt.Printf("stats- %s \n", statInfos.ResultCode)
|
||||
fmt.Printf("stats- %s \n", statInfos.ReqTime)
|
||||
fmt.Printf("stats- %s \n", statInfos.RspTime)
|
||||
fmt.Printf("stats- %s \n", statInfos.ClientIp)
|
||||
fmt.Printf("stats- %s \n", statInfos.DevInfo)
|
||||
fmt.Printf("stats- %s \n", statInfos.OsInfo)
|
||||
fmt.Printf("stats- %s \n", statInfos.NwInfo)
|
||||
fmt.Printf("stats- %s \n", statInfos.SvcName)
|
||||
fmt.Printf("stats- %s \n", statInfos.DevModel)
|
||||
fmt.Printf("stats- %s \n", statInfos.CarrierType)
|
||||
fmt.Printf("stats- %s \n", statInfos.HostName)
|
||||
fmt.Printf("stats- %s \n", statInfos.ScnName)
|
||||
fmt.Printf("stats- %s \n", statInfos.CallId)
|
||||
fmt.Printf("stats- %s \n", statInfos.TrId)
|
||||
fmt.Printf("stats- %s \n", statInfos.ConcCall)
|
||||
fmt.Printf("stats- %s \n", statInfos.SvcType)
|
||||
fmt.Printf("stats- %s \n", statInfos.SvcReqTime)
|
||||
fmt.Printf("stats- %s \n", statInfos.SvcRspTime)
|
||||
fmt.Printf("stats- %s \n", statInfos.ResultMsg)
|
||||
fmt.Printf("stats- %s \n", statInfos.SttText)
|
||||
fmt.Printf("stats- %s \n", statInfos.TtsText)
|
||||
// l.Printf(icslog.LOG_LEVEL_INFO, -1, "Recved Stat Command(%s) %d", ttsHeader, rlen)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (statInfos *StatInfos) ChangeByteToString(statInfo []byte) {
|
||||
// n := bytes.Index(statInfo[STAT_INFO:SEQ_ID], []byte{0})
|
||||
statInfos.SeqId = string(statInfo[STAT_INFO:SEQ_ID])
|
||||
// fmt.Println("seqid ", statInfo[STAT_INFO : SEQ_ID])
|
||||
|
||||
// n := bytes.Index(statInfo[SEQ_ID:LOG_TIME], []byte{0})
|
||||
statInfos.LogTime = string(statInfo[SEQ_ID:LOG_TIME])
|
||||
// fmt.Println("seqid ", statInfo[SEQ_ID : SEQ_ID+n])
|
||||
|
||||
// n = bytes.Index(statInfo[LOG_TIME:LOG_TYPE], []byte{0})
|
||||
statInfos.LogType = string(statInfo[LOG_TIME:LOG_TYPE])
|
||||
// fmt.Println("seqid ", statInfo[SEQ_ID : SEQ_ID+n])
|
||||
|
||||
// n = bytes.Index(statInfo[LOG_TYPE:SID], []byte{0})
|
||||
statInfos.Sid = string(statInfo[LOG_TYPE:SID])
|
||||
|
||||
// n = bytes.Index(statInfo[SID:RESULT_CODE], []byte{0})
|
||||
statInfos.ResultCode = string(statInfo[SID:RESULT_CODE])
|
||||
|
||||
// n = bytes.Index(statInfo[RESULT_CODE:REQ_TIME], []byte{0})
|
||||
statInfos.ReqTime = string(statInfo[RESULT_CODE:REQ_TIME])
|
||||
|
||||
// n = bytes.Index(statInfo[REQ_TIME:RES_TIME], []byte{0})
|
||||
statInfos.RspTime = string(statInfo[REQ_TIME:RES_TIME])
|
||||
|
||||
// n = bytes.Index(statInfo[RES_TIME:CLIENT_IP], []byte{0})
|
||||
statInfos.ClientIp = string(statInfo[RES_TIME:CLIENT_IP])
|
||||
|
||||
// n = bytes.Index(statInfo[CLIENT_IP:DEV_INFO], []byte{0})
|
||||
statInfos.DevInfo = string(statInfo[CLIENT_IP:DEV_INFO])
|
||||
|
||||
// n = bytes.Index(statInfo[DEV_INFO:OS_INFO], []byte{0})
|
||||
statInfos.OsInfo = string(statInfo[DEV_INFO:OS_INFO])
|
||||
|
||||
// n = bytes.Index(statInfo[OS_INFO:NW_INFO], []byte{0})
|
||||
statInfos.NwInfo = string(statInfo[OS_INFO:NW_INFO])
|
||||
|
||||
// n = bytes.Index(statInfo[NW_INFO:SVC_NAME], []byte{0})
|
||||
statInfos.SvcName = string(statInfo[NW_INFO:SVC_NAME])
|
||||
|
||||
// n = bytes.Index(statInfo[SVC_NAME:DEV_MODEL], []byte{0})
|
||||
statInfos.DevModel = string(statInfo[SVC_NAME:DEV_MODEL])
|
||||
|
||||
// n = bytes.Index(statInfo[DEV_MODEL:CARRIER_TYPE], []byte{0})
|
||||
statInfos.CarrierType = string(statInfo[DEV_MODEL:CARRIER_TYPE])
|
||||
|
||||
// n = bytes.Index(statInfo[CARRIER_TYPE:HOST_NAME], []byte{0})
|
||||
statInfos.HostName = string(statInfo[CARRIER_TYPE:HOST_NAME])
|
||||
|
||||
// n = bytes.Index(statInfo[HOST_NAME:SCN_NAME], []byte{0})
|
||||
statInfos.ScnName = string(statInfo[HOST_NAME:SCN_NAME])
|
||||
|
||||
// n = bytes.Index(statInfo[SCN_NAME:CALL_ID], []byte{0})
|
||||
statInfos.CallId = string(statInfo[SCN_NAME:CALL_ID])
|
||||
|
||||
// n = bytes.Index(statInfo[CALL_ID:TR_ID], []byte{0})
|
||||
statInfos.TrId = string(statInfo[CALL_ID:TR_ID])
|
||||
|
||||
// n = bytes.Index(statInfo[TR_ID:CONC_CALL], []byte{0})
|
||||
statInfos.ConcCall = string(statInfo[TR_ID:CONC_CALL])
|
||||
|
||||
// n = bytes.Index(statInfo[CONC_CALL:SVC_TYPE], []byte{0})
|
||||
statInfos.SvcType = string(statInfo[CONC_CALL:SVC_TYPE])
|
||||
|
||||
// n = bytes.Index(statInfo[SVC_TYPE:SVC_REQ_TIME], []byte{0})
|
||||
statInfos.SvcReqTime = string(statInfo[SVC_TYPE:SVC_REQ_TIME])
|
||||
|
||||
// n = bytes.Index(statInfo[SVC_REQ_TIME:SVC_RSP_TIME], []byte{0})
|
||||
statInfos.SvcRspTime = string(statInfo[SVC_REQ_TIME:SVC_RSP_TIME])
|
||||
|
||||
// n = bytes.Index(statInfo[SVC_RSP_TIME:RESULT_MSG], []byte{0})
|
||||
statInfos.ResultMsg = string(statInfo[SVC_RSP_TIME:RESULT_MSG])
|
||||
|
||||
// n = bytes.Index(statInfo[RESULT_MSG:STT_TEXT], []byte{0})
|
||||
statInfos.SttText = string(statInfo[RESULT_MSG:STT_TEXT])
|
||||
|
||||
// n = bytes.Index(statInfo[STT_TEXT:TTS_TEXT], []byte{0})
|
||||
statInfos.TtsText = string(statInfo[STT_TEXT:])
|
||||
|
||||
}
|
@ -0,0 +1,222 @@
|
||||
package icssvc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsutil"
|
||||
)
|
||||
|
||||
const (
|
||||
COMPANY_NAME = "iComsys"
|
||||
VERSION = "1.0.0"
|
||||
BUILD_DATE = ""
|
||||
)
|
||||
|
||||
const (
|
||||
ONEMB = 1048576
|
||||
)
|
||||
|
||||
type IcsService struct {
|
||||
isExit bool //exit service
|
||||
isStop bool //pause service
|
||||
|
||||
log *icslog.IcsLog
|
||||
config *icsconf.IcsConfig
|
||||
//homeDir string
|
||||
}
|
||||
|
||||
var ServiceStatus *IcsService
|
||||
var once sync.Once
|
||||
|
||||
func GetServiceStatus() *IcsService {
|
||||
once.Do(func() {
|
||||
ServiceStatus = &IcsService{isExit: false, isStop: false}
|
||||
})
|
||||
return ServiceStatus
|
||||
}
|
||||
|
||||
func NewService() *IcsService {
|
||||
return GetServiceStatus()
|
||||
}
|
||||
|
||||
func (s *IcsService) Exit(start bool) {
|
||||
i := GetServiceStatus()
|
||||
i.isExit = start
|
||||
}
|
||||
|
||||
func (s IcsService) GetExit() bool {
|
||||
return s.isExit
|
||||
}
|
||||
|
||||
func (s *IcsService) Stop(stop bool) {
|
||||
i := GetServiceStatus()
|
||||
i.isStop = stop
|
||||
}
|
||||
|
||||
func (s IcsService) GetStop() bool {
|
||||
return s.isStop
|
||||
}
|
||||
|
||||
func (s *IcsService) SetIcsConfig(conf *icsconf.IcsConfig) *icserror.IcsError {
|
||||
if conf == nil {
|
||||
return icserror.ICSERRInvalidParam
|
||||
}
|
||||
s.config = conf
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s IcsService) GetIcsConfig() *icsconf.IcsConfig {
|
||||
//fmt.Println(s.config)
|
||||
return s.config
|
||||
}
|
||||
|
||||
func (s *IcsService) SetIcsLog(log *icslog.IcsLog) {
|
||||
s.log = log
|
||||
}
|
||||
|
||||
func (s IcsService) GetIcsLog() (log *icslog.IcsLog) {
|
||||
return s.log
|
||||
}
|
||||
|
||||
func (s IcsService) ShowServiceInfo() (info string) {
|
||||
info = fmt.Sprintf("%s Voice Gateway version %s\nCopyright (C) 2022 %s\n\n", COMPANY_NAME, VERSION, COMPANY_NAME)
|
||||
fmt.Printf("%s Voice Gateway version %s\nCopyright (C) 2022 %s\n\n", COMPANY_NAME, VERSION, COMPANY_NAME)
|
||||
|
||||
return info
|
||||
}
|
||||
|
||||
func (s IcsService) getMonth2Int(mon time.Month) int {
|
||||
switch mon {
|
||||
case time.January:
|
||||
return 1
|
||||
case time.February:
|
||||
return 2
|
||||
case time.March:
|
||||
return 3
|
||||
case time.April:
|
||||
return 4
|
||||
case time.May:
|
||||
return 5
|
||||
case time.June:
|
||||
return 6
|
||||
case time.July:
|
||||
return 7
|
||||
case time.August:
|
||||
return 8
|
||||
case time.September:
|
||||
return 9
|
||||
case time.October:
|
||||
return 10
|
||||
case time.November:
|
||||
return 11
|
||||
case time.December:
|
||||
return 12
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
// func (s IcsService) GetRemainExpire() (int, *icserror.IcsError) {
|
||||
// if s.config == nil {
|
||||
// return -1, icserror.ICSERRInvalidParam
|
||||
// }
|
||||
|
||||
// var rem int
|
||||
|
||||
// currentTime := time.Now()
|
||||
|
||||
// yy := currentTime.Year()
|
||||
// mm := currentTime.Month()
|
||||
// intmm := s.getMonth2Int(mm)
|
||||
// if intmm != -1 {
|
||||
// expire := s.config.GetExpire()
|
||||
// //since 2018.01
|
||||
// rem = expire - (((yy - 2018) * 12) + intmm)
|
||||
// } else {
|
||||
// return -1, icserror.ICSERRSVCTime
|
||||
// }
|
||||
|
||||
// return rem, nil
|
||||
// }
|
||||
|
||||
/////////////////////////////
|
||||
func (s IcsService) LogWatcher() *icserror.IcsError {
|
||||
l := icslog.GetIcsLog()
|
||||
l.Print(icslog.LOG_LEVEL_INFO, -1, "Log Watcher Start")
|
||||
|
||||
for !s.GetExit() {
|
||||
for s.GetStop() {
|
||||
time.Sleep(time.Millisecond)
|
||||
}
|
||||
|
||||
//check log file date
|
||||
// y1, m1, d1 := s.log.CurrentDate.Date()
|
||||
// h1, mi1 := s.log.CurrentDate.Hour(), s.log.CurrentDate.Minute()
|
||||
mi1 := s.log.CurrentDate.Minute()
|
||||
y2, m2, d2 := time.Now().Date()
|
||||
h2, mi2, ss2 := time.Now().Hour(), time.Now().Minute(), time.Now().Second()
|
||||
|
||||
if h2 == l.DelHour && mi2 == 0 && ss2 == 0 {
|
||||
go l.DelLog()
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
|
||||
//uplus
|
||||
times := mi2 - mi1
|
||||
rotateTime := math.Abs(float64(times))
|
||||
|
||||
if rotateTime > 4 { // only 5 minute
|
||||
s.config = icsconf.GetIcsConfig()
|
||||
logpath := fmt.Sprintf("%s", s.config.LogConfig.Path)
|
||||
aSpace := icsutil.GetDiskAvailableSpace(logpath)
|
||||
if aSpace < uint64(s.config.LogConfig.Disklimit*ONEMB) {
|
||||
return icserror.ICSERRUTILDiskFull
|
||||
}
|
||||
|
||||
s.log.M.Lock()
|
||||
|
||||
//save and close old log file
|
||||
s.log.LogFile.Sync()
|
||||
s.log.LogFile.Close()
|
||||
|
||||
//create new log file
|
||||
s.log.CurrentDate = time.Now()
|
||||
/*
|
||||
fmt.Println(s.log)
|
||||
fmt.Println(s.log.LogFileName)
|
||||
fmt.Println(s.config)
|
||||
fmt.Println(s.config.GetHomeDir())
|
||||
fmt.Println(s.log.Path)
|
||||
fmt.Println(y2)
|
||||
fmt.Println(m2)
|
||||
fmt.Println(d2)
|
||||
*/
|
||||
s.log.LogFileName = fmt.Sprintf("%s/icsvs.log-%d%02d%02d.%02d.%02d", s.log.Path, y2, m2, d2, h2, mi2)
|
||||
var oerr error
|
||||
s.log.LogFile, oerr = os.OpenFile(s.log.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if oerr != nil {
|
||||
icserror.ICSERRFileOpen.SetError(oerr)
|
||||
//icserror.ICSERRFileOpen.PrintWithCaller(1)
|
||||
|
||||
s.log.M.Unlock()
|
||||
return icserror.ICSERRFileOpen
|
||||
}
|
||||
|
||||
s.log.M.Unlock()
|
||||
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Log Watcher: Updated Log File - %s", s.log.LogFileName)
|
||||
}
|
||||
|
||||
//l.Printf(icslog.LOG_LEVEL_INFO, -1, "Log Watcher")
|
||||
time.Sleep(time.Millisecond)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
#!/usr/bin/sh
|
||||
HOME=$ICSVS_ROOT
|
||||
`cat $HOME/voicegateway.pid | xargs kill`
|
||||
echo "VoiceGateway Stoped..."
|
@ -0,0 +1,273 @@
|
||||
package icsutil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
)
|
||||
|
||||
func Deamonize() (int, error) {
|
||||
pid, _, sysErr := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
|
||||
if sysErr != 0 {
|
||||
//fmt.Println("fail to call fork")
|
||||
return -1, fmt.Errorf("fail to call fork - %d", sysErr)
|
||||
}
|
||||
if pid > 0 { //parent
|
||||
//return int(pid), nil
|
||||
//fmt.Printf("Parent PID %d\n", int(pid))
|
||||
os.Exit(0)
|
||||
} else if int(pid) < 0 {
|
||||
//fmt.Println("child id is incorrect")
|
||||
return int(pid), fmt.Errorf("child id is incorrect")
|
||||
} /* else if int(pid) == 0 { //child
|
||||
p := os.Getpid()
|
||||
fmt.Printf("Child Process PID %d\n", p)
|
||||
}*/
|
||||
|
||||
//p1 := os.Getpid()
|
||||
//fmt.Printf("Child Process PID %d\n", p1)
|
||||
|
||||
ret, err := syscall.Setsid()
|
||||
if err != nil || ret < 0 {
|
||||
//fmt.Println("fail to call setsid", pid, err)
|
||||
return int(pid), fmt.Errorf("fail to call setsid")
|
||||
}
|
||||
|
||||
signal.Ignore(syscall.SIGHUP)
|
||||
syscall.Umask(0)
|
||||
|
||||
conf := icsconf.GetIcsConfig()
|
||||
homeDir := conf.GetHomeDir()
|
||||
cmdline := fmt.Sprintf("%s/bin/voicegateway", homeDir)
|
||||
attr := &os.ProcAttr{Env: os.Environ()}
|
||||
p, perr := os.StartProcess(cmdline, []string{""}, attr)
|
||||
if perr != nil {
|
||||
return -1, perr
|
||||
}
|
||||
|
||||
if werr := WritePID(p.Pid); werr != nil {
|
||||
fmt.Println("Error Write PID :", werr)
|
||||
}
|
||||
|
||||
return p.Pid, nil
|
||||
}
|
||||
|
||||
func CloseSTDIO() {
|
||||
for iter := 0; iter < 3; iter++ {
|
||||
syscall.Close(iter)
|
||||
}
|
||||
}
|
||||
|
||||
func WritePID(pid int) *icserror.IcsError {
|
||||
isStop := false
|
||||
var homeDir string
|
||||
for _, e := range os.Environ() {
|
||||
s := strings.SplitN(e, "=", 2)
|
||||
if strings.Compare(s[0], "ICSVS_ROOT") == 0 {
|
||||
homeDir = s[1]
|
||||
//service.SetHomeDir(s[1])
|
||||
isStop = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if isStop {
|
||||
pidFilename := fmt.Sprintf("%s/voiceStastics.pid", homeDir)
|
||||
spid := fmt.Sprintf("%d", pid)
|
||||
ioutil.WriteFile(pidFilename, []byte(spid), 0666)
|
||||
} else {
|
||||
return icserror.ICSERRNotFoundHome
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func CheckPID() bool {
|
||||
isStop := false
|
||||
var homeDir string
|
||||
for _, e := range os.Environ() {
|
||||
s := strings.SplitN(e, "=", 2)
|
||||
if strings.Compare(s[0], "ICSVS_ROOT") == 0 {
|
||||
homeDir = s[1]
|
||||
//service.SetHomeDir(s[1])
|
||||
isStop = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if isStop {
|
||||
pidFilename := fmt.Sprintf("%s/voicegateway.pid", homeDir)
|
||||
fd, err := os.Open(pidFilename)
|
||||
if err != nil {
|
||||
fd.Close()
|
||||
return false
|
||||
}
|
||||
pid := make([]byte, 12)
|
||||
rlen, rerr := fd.Read(pid)
|
||||
if rerr != nil {
|
||||
return false
|
||||
}
|
||||
fd.Close()
|
||||
|
||||
cmdline := fmt.Sprintf("/proc/%s/exe", string(pid[:rlen]))
|
||||
//cmdline := fmt.Sprintf("/proc/%s/cmdline", string(pid[:rlen]))
|
||||
/*
|
||||
cfd, cerr := os.Open(cmdline)
|
||||
if cerr != nil {
|
||||
cfd.Close()
|
||||
return false
|
||||
}
|
||||
pname := make([]byte, 128)
|
||||
rlen, rerr = cfd.Read(pname)
|
||||
if rerr != nil {
|
||||
return false
|
||||
}
|
||||
cfd.Close()
|
||||
*/
|
||||
pname, rlerr := os.Readlink(cmdline)
|
||||
if rlerr != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
//fmt.Println(pname)
|
||||
|
||||
if strings.Contains(pname, "voicegateway") {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Process Check
|
||||
const PNAMEC = "voicegatewayCheck"
|
||||
|
||||
func DeamonizeProcessCheck() (int, error) {
|
||||
pid, _, sysErr := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
|
||||
if sysErr != 0 {
|
||||
//fmt.Println("fail to call fork")
|
||||
return -1, fmt.Errorf("fail to call fork - %d", sysErr)
|
||||
}
|
||||
if pid > 0 { //parent
|
||||
//return int(pid), nil
|
||||
//fmt.Printf("Child Process Created %d\n", int(pid))
|
||||
os.Exit(0)
|
||||
} else if int(pid) < 0 {
|
||||
//fmt.Println("child id is incorrect")
|
||||
return int(pid), fmt.Errorf("child id is incorrect")
|
||||
} /* else if int(pid) == 0 { //child
|
||||
p := os.Getpid()
|
||||
fmt.Printf("Child Process PID %d\n", p)
|
||||
}*/
|
||||
|
||||
ret, err := syscall.Setsid()
|
||||
if err != nil || ret < 0 {
|
||||
//fmt.Println("fail to call setsid", pid, err)
|
||||
return int(pid), fmt.Errorf("Fail to call setsid")
|
||||
}
|
||||
|
||||
signal.Ignore(syscall.SIGHUP)
|
||||
syscall.Umask(0)
|
||||
|
||||
conf := icsconf.GetIcsConfig()
|
||||
homeDir := conf.GetHomeDir()
|
||||
cmdline := fmt.Sprintf("%s/bin/%s", homeDir, PNAMEC)
|
||||
attr := &os.ProcAttr{Env: os.Environ()}
|
||||
p, perr := os.StartProcess(cmdline, []string{""}, attr)
|
||||
if perr != nil {
|
||||
return -1, perr
|
||||
}
|
||||
|
||||
if werr := PWritePID(p.Pid); werr != nil {
|
||||
fmt.Println("Error PWrite PID :", werr)
|
||||
}
|
||||
|
||||
return p.Pid, nil
|
||||
}
|
||||
|
||||
func PWritePID(pid int) *icserror.IcsError {
|
||||
isStop := false
|
||||
var homeDir string
|
||||
for _, e := range os.Environ() {
|
||||
s := strings.SplitN(e, "=", 2)
|
||||
if strings.Compare(s[0], "ICSVS_ROOT") == 0 {
|
||||
homeDir = s[1]
|
||||
//service.SetHomeDir(s[1])
|
||||
isStop = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if isStop {
|
||||
pidFilename := fmt.Sprintf("%s/voicegatewayCheck.pid", homeDir)
|
||||
spid := fmt.Sprintf("%d", pid)
|
||||
ioutil.WriteFile(pidFilename, []byte(spid), 0666)
|
||||
} else {
|
||||
return icserror.ICSERRNotFoundHome
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func PCheckPID() bool {
|
||||
isStop := false
|
||||
var homeDir string
|
||||
for _, e := range os.Environ() {
|
||||
s := strings.SplitN(e, "=", 2)
|
||||
if strings.Compare(s[0], "ICSVS_ROOT") == 0 {
|
||||
homeDir = s[1]
|
||||
//service.SetHomeDir(s[1])
|
||||
isStop = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if isStop {
|
||||
pidFilename := fmt.Sprintf("%s/voicegatewayP.pid", homeDir)
|
||||
fd, err := os.Open(pidFilename)
|
||||
if err != nil {
|
||||
fd.Close()
|
||||
return false
|
||||
}
|
||||
pid := make([]byte, 12)
|
||||
rlen, rerr := fd.Read(pid)
|
||||
if rerr != nil {
|
||||
return false
|
||||
}
|
||||
fd.Close()
|
||||
|
||||
cmdline := fmt.Sprintf("/proc/%s/exe", string(pid[:rlen]))
|
||||
//cmdline := fmt.Sprintf("/proc/%s/cmdline", string(pid[:rlen]))
|
||||
/*
|
||||
cfd, cerr := os.Open(cmdline)
|
||||
if cerr != nil {
|
||||
cfd.Close()
|
||||
return false
|
||||
}
|
||||
pname := make([]byte, 128)
|
||||
rlen, rerr = cfd.Read(pname)
|
||||
if rerr != nil {
|
||||
return false
|
||||
}
|
||||
cfd.Close()
|
||||
*/
|
||||
pname, rlerr := os.Readlink(cmdline)
|
||||
if rlerr != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
fmt.Println(pname)
|
||||
|
||||
if strings.Contains(pname, PNAMEC) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package icsutil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"strings"
|
||||
"os"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func PrintCallTrace(depth int, v interface{}) {
|
||||
funcname, file, line, ok := runtime.Caller(depth)
|
||||
if ok {
|
||||
files := strings.Split(file, "/")
|
||||
fileslen := len(files)
|
||||
func1 := runtime.FuncForPC(funcname).Name()
|
||||
funcs := strings.Split(func1, "/")
|
||||
funcslen := len(funcs)
|
||||
|
||||
fmt.Printf("[%s:%d %s] %v\n", files[fileslen-1], line, funcs[funcslen-1], v)
|
||||
}
|
||||
}
|
||||
|
||||
func GetDiskAvailableSpace(path string) uint64 {
|
||||
var stat unix.Statfs_t
|
||||
unix.Statfs(path, &stat)
|
||||
return stat.Bavail * uint64(stat.Bsize)
|
||||
}
|
||||
|
||||
func DeleteFile(path string, filename string) string {
|
||||
var err string
|
||||
rmerr := os.Remove(fmt.Sprintf("%s/%s", path, filename))
|
||||
if rmerr != nil {
|
||||
fmt.Printf("Delete File error - %s\n", rmerr)
|
||||
}
|
||||
return err
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
<?xml version="1.0"?>
|
||||
<ICSVS version="1.0.0.0">
|
||||
<INFO>
|
||||
<PRODUCT>iCOMSYS_CALLAGENT</PRODUCT>
|
||||
<TENENTID>icsvs001</TENENTID>
|
||||
<CHANNELID>00001</CHANNELID>
|
||||
<SERVERID>00</SERVERID>
|
||||
<SERVERIP>192.168.0.21</SERVERIP>
|
||||
</INFO>
|
||||
<LICENSE>
|
||||
<KEY>2CF05DD7C692</KEY>
|
||||
<CHANNELS>8</CHANNELS>
|
||||
<EXPIRE>9999</EXPIRE>
|
||||
</LICENSE>
|
||||
<LOG>
|
||||
<PATH>/home/leejj9612/dev/logs/icsvs</PATH>
|
||||
<DISKLIMIT>100</DISKLIMIT>
|
||||
<LEVEL>DEBUG2</LEVEL>
|
||||
<OUTPUT>file</OUTPUT>
|
||||
<ROTATE size="100" num="10" yesno="yes"/>
|
||||
<DELPERIOD day="90" hour="2"/> <!-- day, hour -->
|
||||
</LOG>
|
||||
|
||||
<COMMAND value="true" transport="tcp" port="57000"/>
|
||||
<CALLEVENT value="false" production="ICOMSYS_CTI" version="1.0.0.1"/>
|
||||
<SIP value="true" transport="udp" port="5090" proxy="192.168.0.222:5090"/>
|
||||
|
||||
<AGENT name="9012" value="true">
|
||||
<!-- if register value is false, it works to TRUNK mode-->
|
||||
<REGISTER value="true" transport="udp" expire="3600" username="9012"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21000" format="PCMA PCMU"/>
|
||||
</AGENT>
|
||||
<AGENT name="9013" value="true">
|
||||
<REGISTER value="true" transport="udp" expire="3600" username="9013"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21002" format="PCMA PCMU G729"/>
|
||||
</AGENT>
|
||||
<AGENT name="9014" value="true">
|
||||
<REGISTER value="true" transport="udp" expire="3600" username="9014"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21004" format="PCMA PCMU"/>
|
||||
</AGENT>
|
||||
<AGENT name="9015" value="false">
|
||||
<REGISTER value="false" transport="udp" expire="3600" username="9015"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21006" format="PCMU PCMA"/>
|
||||
</AGENT>
|
||||
<AGENT name="9016" value="false">
|
||||
<REGISTER value="false" transport="udp" expire="3600" username="9016"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21008" format="PCMU PCMA"/>
|
||||
</AGENT>
|
||||
<AGENT name="9017" value="false">
|
||||
<REGISTER value="false" transport="udp" expire="3600" username="9017"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21010" format="PCMU PCMA"/>
|
||||
</AGENT>
|
||||
<AGENT name="9018" value="false">
|
||||
<REGISTER value="false" transport="udp" expire="3600" username="9018"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21012" format="PCMU PCMA"/>
|
||||
</AGENT>
|
||||
<AGENT name="9019" value="false">
|
||||
<REGISTER value="false" transport="udp" expire="3600" username="9019"/>
|
||||
<OPTIONS value="true" interval="30"/>
|
||||
<MEDIA m="aud" port="21014" format="PCMU PCMA"/>
|
||||
</AGENT>
|
||||
|
||||
<VOICEAGENT>
|
||||
<AGENT name="9012" action="out" port="55553" voiceport="56002" ip="192.168.0.21"/>
|
||||
<AGENT name="9013" action="in" port="55553" voiceport="56003" ip="192.168.0.21"/>
|
||||
<AGENT name="9014" action="out" port="55553" voiceport="56004" ip="192.168.0.21"/>
|
||||
<SERVER port="7777" baseport="7778" range="128">192.168.0.21</SERVER>
|
||||
</VOICEAGENT>
|
||||
</ICSVS>
|
Binary file not shown.
@ -0,0 +1,68 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsutil"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if icsutil.CheckPID() {
|
||||
fmt.Println("VoiceGateway Already Running. Terminating...")
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
//get Voice Gateway home dir
|
||||
isStop := false
|
||||
var homeDir string
|
||||
for _, e := range os.Environ() {
|
||||
s := strings.SplitN(e, "=", 2)
|
||||
if strings.Compare(s[0], "ICSVS_ROOT") == 0 {
|
||||
homeDir = s[1]
|
||||
//service.SetHomeDir(s[1])
|
||||
isStop = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isStop {
|
||||
icserror.ICSERRNotFoundHome.PrintWithCaller(1)
|
||||
return
|
||||
}
|
||||
|
||||
//configuration
|
||||
configFile := fmt.Sprintf("%s/config/icsvs.xml", homeDir)
|
||||
conf, confErr := icsconf.OpenConfig(configFile, homeDir)
|
||||
if confErr != nil {
|
||||
confErr.PrintWithCaller(0)
|
||||
fmt.Println(confErr.GetError())
|
||||
return
|
||||
}
|
||||
|
||||
icsLog, lerr := icslog.NewIcsLog(
|
||||
&conf.LogConfig,
|
||||
icslog.GetLogLevelID(conf.LogConfig.Level),
|
||||
icslog.GetLogOutputID(conf.LogConfig.Output),
|
||||
conf.LogConfig.Path,
|
||||
conf.LogConfig.Disklimit,
|
||||
)
|
||||
if lerr != nil {
|
||||
lerr.PrintWithCaller(0)
|
||||
}
|
||||
|
||||
icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "Started VoiceGateway Loader")
|
||||
|
||||
//deamonize
|
||||
pid, derr := icsutil.DeamonizeProcessCheck()
|
||||
if derr != nil {
|
||||
icserror.ICSERRDeamonize.SetError(derr)
|
||||
icsLog.Printf(icslog.LOG_LEVEL_ERROR, -1, "VoiceGateway : %s", icserror.ICSERRDeamonize.GetError())
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
icsLog.Printf(icslog.LOG_LEVEL_INFO, -1, "Loaded VoiceGateway[%d]", pid)
|
||||
}
|
Binary file not shown.
@ -0,0 +1,120 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsutil"
|
||||
)
|
||||
|
||||
var wg sync.WaitGroup
|
||||
|
||||
func main() {
|
||||
var homeDir string
|
||||
|
||||
//get Voice Agent home dir
|
||||
isStop := false
|
||||
|
||||
for _, e := range os.Environ() {
|
||||
s := strings.SplitN(e, "=", 2)
|
||||
if strings.Compare(s[0], "ICSVS_ROOT") == 0 {
|
||||
homeDir = s[1]
|
||||
//service.SetHomeDir(s[1])
|
||||
isStop = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isStop {
|
||||
icserror.ICSERRNotFoundHome.PrintWithCaller(1)
|
||||
return
|
||||
}
|
||||
|
||||
//configuration
|
||||
configFile := fmt.Sprintf("%s/config/icsvs.xml", homeDir)
|
||||
//configFile := fmt.Sprintf("%s/config/icsvc.xml", service.GetHomeDir())
|
||||
//fmt.Println("Config file:", configFile)
|
||||
conf, confErr := icsconf.OpenConfig(configFile, homeDir)
|
||||
if confErr != nil {
|
||||
confErr.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
|
||||
icsLog, lerr := icslog.NewIcsLog(
|
||||
&conf.LogConfig,
|
||||
icslog.GetLogLevelID(conf.LogConfig.Level),
|
||||
icslog.GetLogOutputID(conf.LogConfig.Output),
|
||||
conf.LogConfig.Path,
|
||||
conf.LogConfig.Disklimit,
|
||||
)
|
||||
if lerr != nil {
|
||||
lerr.PrintWithCaller(0)
|
||||
}
|
||||
|
||||
for {
|
||||
// log file name change
|
||||
y1, m1, d1 := icsLog.CurrentDate.Date()
|
||||
y2, m2, d2 := time.Now().Date()
|
||||
|
||||
if d1 != d2 || y1 != y2 || m1 != m2 {
|
||||
icsLog.M.Lock()
|
||||
icsLog.LogFileName = fmt.Sprintf("%s/icsvs.log-%d%02d%02d", icsLog.Path, y2, m2, d2) // file name change
|
||||
var oerr error
|
||||
icsLog.LogFile, oerr = os.OpenFile(icsLog.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if oerr != nil {
|
||||
icserror.ICSERRFileOpen.SetError(oerr)
|
||||
icsLog.M.Unlock()
|
||||
}
|
||||
icsLog.M.Unlock()
|
||||
}
|
||||
|
||||
if icsutil.CheckPID() {
|
||||
// icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "Voice Agent HealthCheck")
|
||||
} else {
|
||||
ProcessLoad(icsLog)
|
||||
ListenDieSignal()
|
||||
|
||||
// icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "Voice Gateway Death - reloading...")
|
||||
|
||||
// icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "Started Voice Gateway Loader")
|
||||
|
||||
// //deamonize
|
||||
// pid, derr := icsutil.Deamonize()
|
||||
// if derr != nil {
|
||||
// icserror.ICSERRDeamonize.SetError(derr)
|
||||
// icsLog.Printf(icslog.LOG_LEVEL_ERROR, -1, "voicegateway: %s", icserror.ICSERRDeamonize.GetError())
|
||||
// os.Exit(0)
|
||||
// }
|
||||
|
||||
// icsLog.Printf(icslog.LOG_LEVEL_INFO, -1, "Loaded Voice Gateway[%d]", pid)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func ListenDieSignal() {
|
||||
stop := make(chan os.Signal)
|
||||
signal.Notify(stop, os.Interrupt)
|
||||
fmt.Println("Listen Dying signal started")
|
||||
|
||||
<-stop
|
||||
fmt.Println("stopped")
|
||||
wg.Done()
|
||||
}
|
||||
|
||||
func ProcessLoad(l *icslog.IcsLog) (int, error) {
|
||||
pid, derr := icsutil.Deamonize()
|
||||
if derr != nil {
|
||||
icserror.ICSERRDeamonize.SetError(derr)
|
||||
l.Printf(icslog.LOG_LEVEL_ERROR, -1, "voicegateway: %s", icserror.ICSERRDeamonize.GetError())
|
||||
return 0, derr
|
||||
}
|
||||
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Loaded Voice Gateway[%d]", pid)
|
||||
return pid, nil
|
||||
}
|
@ -0,0 +1,140 @@
|
||||
package main
|
||||
|
||||
// #cgo LDFLAGS: -L/usr/local/lib /usr/local/lib/libavcodec.a /usr/local/lib/libavformat.a /usr/local/lib/llibavutil.a /usr/local/lib/llibswscale.a -llibswresample.a -llibavdevice -llibavfilter
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsapp"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icssvc"
|
||||
"gitlab.com/ics_cinnamon/voiceStatistics/icsutil"
|
||||
)
|
||||
|
||||
func main() {
|
||||
service := icssvc.NewService()
|
||||
|
||||
///////////////////////////////////
|
||||
//Demonize service
|
||||
//check Voice Gateway pid file - ICSVS_ROOT/voicegateway.pid
|
||||
//if already running, terminate self.
|
||||
/*
|
||||
if icsutil.CheckPID() {
|
||||
service.ShowServiceInfo()
|
||||
fmt.Println("Voice Gateway Already Running. Terminating...")
|
||||
os.Exit(0)
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
//deamonize
|
||||
pid, derr := icsutil.Deamonize()
|
||||
if derr != nil {
|
||||
service.ShowServiceInfo()
|
||||
icserror.ICSERRDeamonize.SetError(derr)
|
||||
fmt.Println("voice Gateway:", icserror.ICSERRDeamonize)
|
||||
os.Exit(0)
|
||||
return
|
||||
}
|
||||
fmt.Println("PID", pid)
|
||||
*/ ////////////////////////
|
||||
|
||||
//get Voice Gateway home dir
|
||||
isStop := false
|
||||
var homeDir string
|
||||
for _, e := range os.Environ() {
|
||||
s := strings.SplitN(e, "=", 2)
|
||||
if strings.Compare(s[0], "ICSVS_ROOT") == 0 {
|
||||
homeDir = s[1]
|
||||
//service.SetHomeDir(s[1])
|
||||
isStop = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isStop {
|
||||
icserror.ICSERRNotFoundHome.PrintWithCaller(1)
|
||||
return
|
||||
}
|
||||
|
||||
//configuration
|
||||
configFile := fmt.Sprintf("%s/config/icsvs.xml", homeDir)
|
||||
conf, confErr := icsconf.OpenConfig(configFile, homeDir)
|
||||
if confErr != nil {
|
||||
confErr.PrintWithCaller(0)
|
||||
return
|
||||
}
|
||||
if confErr := service.SetIcsConfig(conf); confErr != nil {
|
||||
confErr.PrintWithCaller(0)
|
||||
}
|
||||
|
||||
icsLog, lerr := icslog.NewIcsLog(
|
||||
&conf.LogConfig,
|
||||
icslog.GetLogLevelID(conf.LogConfig.Level),
|
||||
icslog.GetLogOutputID(conf.LogConfig.Output),
|
||||
conf.LogConfig.Path,
|
||||
conf.LogConfig.Disklimit,
|
||||
)
|
||||
if lerr != nil {
|
||||
lerr.PrintWithCaller(0)
|
||||
}
|
||||
|
||||
service.SetIcsLog(icsLog)
|
||||
//create log watcher
|
||||
go service.LogWatcher()
|
||||
|
||||
info := service.ShowServiceInfo()
|
||||
info += fmt.Sprintf("iComsys Voice Statistics Home: %s\n", homeDir)
|
||||
fmt.Printf("iComsys Voice Statistics Home: %s\n", homeDir)
|
||||
//wd, err := os.Getwd()
|
||||
logpath := conf.LogConfig.Path
|
||||
info += fmt.Sprintf("Available Disk Space [%s]: %d MB\n", logpath, icsutil.GetDiskAvailableSpace(logpath)/1024/1024)
|
||||
fmt.Printf("Available Disk Space [%s]: %d MB\n", logpath, icsutil.GetDiskAvailableSpace(logpath)/1024/1024)
|
||||
info += conf.ShowConfig()
|
||||
|
||||
//check license expiration
|
||||
//fmt.Println("Remain Expiration Months:", conf.GetRemainExpire())
|
||||
|
||||
app := icsapp.Init(conf)
|
||||
//fmt.Printf("Service Started - %d\n================================\n", pid)
|
||||
|
||||
info = "\n" + info
|
||||
icsLog.Print(icslog.LOG_LEVEL_INFO, -1, info)
|
||||
icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "Service Started")
|
||||
icsLog.Print(icslog.LOG_LEVEL_INFO, -1, "================================")
|
||||
|
||||
/////////////////////////////////
|
||||
//icsutil.CloseSTDIO()
|
||||
/////////////////////////////////
|
||||
|
||||
execerr := app.Execute()
|
||||
if execerr != nil {
|
||||
execerr.PrintWithCaller(1)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
/*
|
||||
deviceName := conf.GetDeviceName()
|
||||
pcap := icspcap.New()
|
||||
//pcap.SetFilter("")
|
||||
packetSource, pcapErr := pcap.Init(deviceName)
|
||||
//packetSource, icserr := pcap.Init("wlp1s0")
|
||||
if pcapErr != nil {
|
||||
if pcapErr.Equal(icserror.ICSERRPCAPOpenLive) {
|
||||
fmt.Printf("Device Name: %s\n", deviceName)
|
||||
}
|
||||
pcapErr.Print()
|
||||
return
|
||||
}
|
||||
fmt.Println("Filter:", pcap.GetFilter())
|
||||
|
||||
if err := pcap.Run(packetSource); err != nil {
|
||||
err.Print()
|
||||
}
|
||||
defer pcap.Close()
|
||||
*/
|
||||
|
||||
}
|
Loading…
Reference in New Issue