freeswitch heartbeat monitoring

This commit is contained in:
Radu Ioan Fericean
2012-04-30 19:43:45 +03:00
parent b770d44218
commit 265fc1039d
2 changed files with 92 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
package sessionmanager
import (
"bufio"
"fmt"
"log"
"net"
"regexp"
)
type Event struct {
body string
}
func (ev *Event) GetField(field string) (result string, err error) {
if re, err := regexp.Compile(fmt.Sprintf(`"%s":\s+"(.*?)"`, field)); err == nil {
results := re.FindStringSubmatch(ev.body)
if len(results) > 1 {
result = results[1]
}
}
return
}
type SessionManager struct {
conn net.Conn
}
func (sm *SessionManager) Connect(address string) {
conn, err := net.Dial("tcp", address)
if err != nil {
log.Fatal("Could not connect to freeswitch server!")
}
sm.conn = conn
fmt.Fprint(sm.conn, "auth ClueCon\n\n")
fmt.Fprint(sm.conn, "event json all\n\n")
}
func (sm *SessionManager) Close() {
sm.conn.Close()
}
func (sm *SessionManager) ReadNextEvent() (ev *Event) {
body, err := bufio.NewReader(sm.conn).ReadString('}')
if err != nil {
log.Print("Could not read from freeswitch connection!")
}
ev = &Event{}
ev.body = body
return
}
func (ssm *SessionManager) onHeartBeat(event string) {
log.Printf("hear beat event: %s", event)
}

View File

@@ -0,0 +1,37 @@
/*
Rating system designed to be used in VoIP Carriers World
Copyright (C) 2012 Radu Ioan Fericean
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package sessionmanager
import (
"log"
"testing"
)
func TestConnect(t *testing.T) {
sm := &SessionManager{}
sm.Connect("localhost:8021")
for {
ev := sm.ReadNextEvent()
if name, err := ev.GetField("Event-Name"); err == nil {
log.Println(name)
} else {
log.Print("cannot get requested field!", err)
}
}
}