better register/unregister

This commit is contained in:
Radu Ioan Fericean
2012-07-21 17:55:08 +03:00
parent 4fbe9f1eef
commit 3c47bcfbe7
10 changed files with 45 additions and 243 deletions

View File

@@ -48,9 +48,8 @@ var (
balancer_web_status_server = "127.0.0.1:8000" // Web server address
balancer_json = false // use JSON for RPC encoding
scheduler_enabled = false
scheduler_standalone = false // run standalone (no other service)
scheduler_json = false
scheduler_enabled = false
scheduler_json = false
sm_enabled = false
sm_standalone = false // run standalone
@@ -96,7 +95,6 @@ func readConfig(configFn string) {
balancer_json, _ = c.GetBool("balancer", "json")
scheduler_enabled, _ = c.GetBool("scheduler", "enabled")
scheduler_standalone, _ = c.GetBool("scheduler", "standalone")
scheduler_json, _ = c.GetBool("scheduler", "json")
sm_enabled, _ = c.GetBool("session_manager", "enabled")
@@ -117,27 +115,6 @@ func readConfig(configFn string) {
mediator_password, _ = c.GetString("mediator", "password")
}
func resolveStandaloneConfilcts() {
if balancer_standalone {
rater_standalone = false
}
if scheduler_standalone {
rater_standalone = false
balancer_standalone = false
}
if sm_standalone {
rater_standalone = false
balancer_standalone = false
scheduler_standalone = false
}
if mediator_standalone {
rater_standalone = false
balancer_standalone = false
scheduler_standalone = false
sm_standalone = false
}
}
func listenToRPCRequests(responder interface{}, rpcAddress string, json bool) {
l, err := net.Listen("tcp", rpcAddress)
defer l.Close()
@@ -179,7 +156,9 @@ func main() {
flag.Parse()
runtime.GOMAXPROCS(runtime.NumCPU())
readConfig(*config)
resolveStandaloneConfilcts()
if balancer_standalone {
rater_standalone = false
}
getter, err := timespans.NewRedisStorage(redis_server, redis_db)
if err != nil {
timespans.Logger.Crit("Could not connect to redis, exiting!")
@@ -189,8 +168,8 @@ func main() {
timespans.SetStorageGetter(getter)
if !rater_standalone && !balancer_enabled {
go registerToBalancer(rater_balancer_server, rater_listen)
go stopRaterSingnalHandler(rater_balancer_server, rater_listen, getter)
go registerToBalancer()
go stopRaterSingnalHandler()
}
if !balancer_enabled {
go listenToRPCRequests(&Responder{new(DirectResponder)}, rater_listen, rater_json)
@@ -202,5 +181,13 @@ func main() {
go listenToHttpRequests()
}
if scheduler_enabled {
go func() {
loadActionTimings()
go reloadSchedulerSingnalHandler()
s.loop()
}()
}
<-exitChan
}

View File

@@ -41,18 +41,15 @@ func TestConfig(t *testing.T) {
balancer_json != true ||
scheduler_enabled != true ||
scheduler_standalone != true ||
scheduler_json != true ||
sm_enabled != true ||
sm_standalone != true ||
sm_api_server != "test" ||
sm_freeswitch_server != "test" ||
sm_freeswitch_pass != "test" ||
sm_json != true ||
mediator_enabled != true ||
mediator_standalone != true ||
mediator_cdr_file != "test" ||
mediator_result_file != "test" ||
mediator_host != "test" ||
@@ -71,16 +68,13 @@ func TestConfig(t *testing.T) {
t.Log(balancer_listen_api)
t.Log(balancer_json)
t.Log(scheduler_enabled)
t.Log(scheduler_standalone)
t.Log(scheduler_json)
t.Log(sm_enabled)
t.Log(sm_standalone)
t.Log(sm_api_server)
t.Log(sm_freeswitch_server)
t.Log(sm_freeswitch_pass)
t.Log(sm_json)
t.Log(mediator_enabled)
t.Log(mediator_standalone)
t.Log(mediator_cdr_file)
t.Log(mediator_result_file)
t.Log(mediator_host)

View File

@@ -80,30 +80,30 @@ func stopBalancerSingnalHandler() {
/*
Listens for the SIGTERM, SIGINT, SIGQUIT system signals and gracefuly unregister from balancer and closes the storage before exiting.
*/
func stopRaterSingnalHandler(server, listen string, sg timespans.StorageGetter) {
func stopRaterSingnalHandler() {
log.Print("Handling stop signals...")
c := make(chan os.Signal)
signal.Notify(c, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
sig := <-c
log.Printf("Caught signal %v, unregistering from balancer\n", sig)
unregisterFromBalancer(server, listen)
sg.Close()
unregisterFromBalancer()
exitChan <- true
}
/*
Connects to the balancer and calls unregister RPC method.
*/
func unregisterFromBalancer(server, listen string) {
client, err := rpc.DialHTTP("tcp", server)
func unregisterFromBalancer() {
client, err := rpc.Dial("tcp", rater_balancer_server)
if err != nil {
log.Print("Cannot contact the balancer!")
exitChan <- true
return
}
var reply int
log.Print("Unregistering from balancer ", server)
client.Call("RaterServer.UnRegisterRater", listen, &reply)
log.Print("Unregistering from balancer ", rater_balancer_server)
client.Call("RaterServer.UnRegisterRater", rater_listen, &reply)
if err := client.Close(); err != nil {
log.Print("Could not close balancer unregistration!")
exitChan <- true
@@ -113,18 +113,35 @@ func unregisterFromBalancer(server, listen string) {
/*
Connects to the balancer and rehisters the rater to the server.
*/
func registerToBalancer(server, listen string) {
client, err := rpc.DialHTTP("tcp", server)
func registerToBalancer() {
client, err := rpc.Dial("tcp", rater_balancer_server)
if err != nil {
log.Print("Cannot contact the balancer!")
exitChan <- true
return
}
var reply int
log.Print("Registering to balancer ", server)
client.Call("RaterServer.RegisterRater", listen, &reply)
log.Print("Registering to balancer ", rater_balancer_server)
client.Call("RaterServer.RegisterRater", rater_listen, &reply)
if err := client.Close(); err != nil {
log.Print("Could not close balancer registration!")
exitChan <- true
}
log.Print("Registration finished!")
}
// Listens for the HUP system signal and gracefuly reloads the timers from database.
func reloadSchedulerSingnalHandler() {
timespans.Logger.Info("Handling HUP signal...")
for {
c := make(chan os.Signal)
signal.Notify(c, syscall.SIGHUP)
sig := <-c
timespans.Logger.Info(fmt.Sprintf("Caught signal %v, reloading action timings.\n", sig))
loadActionTimings()
// check the tip of the queue for new actions
restartLoop <- 1
timer.Stop()
}
}

View File

@@ -31,11 +31,7 @@ listen_rater = 127.0.0.1:2000 # Rater server address
listen_api = 127.0.0.1:2001 # Json RPC server address
web_status_server = 127.0.0.1:8000 # Web server address (for status)
json = false # use JSON for RPC encoding
[scheduler]
enabled = false
standalone = false # run standalone (no other service)
json = false # use JSON for RPC encoding
ON for RPC encoding
[session_manager]
enabled = false

View File

@@ -24,30 +24,8 @@ balancer_server = 127.0.0.1:2000 # balancer address host:port
listen_api = 127.0.0.1:1234 # listening address host:port
json = false # use JSON for RPC encoding
[balancer]
enabled = false
standalone = false # run standalone
listen_rater = 127.0.0.1:2000 # Rater server address
listen_api = 127.0.0.1:2001 # Json RPC server address
web_status_server = 127.0.0.1:8000 # Web server address (for status)
json = false # use JSON for RPC encoding
[scheduler]
enabled = false
standalone = false # run standalone (no other service)
json = false # use JSON for RPC encoding
[session_manager]
enabled = false
standalone = false # run standalone
api_server = 127.0.0.1:2000 # balancer address host:port
freeswitch_server = localhost:8021 # freeswitch address host:port
freeswitch_pass = ClueCon # freeswitch address host:port
json = false # use JSON for RPC encoding
[mediator]
enabled = false
standalone = false # run standalone
cdr_file = Master.csv # Freeswitch Master CSV CDR file.
result_file = out.csv # Generated file containing CDR and price info.
host = localhost # The host to connect to. Values that start with / are for UNIX domain sockets.

View File

@@ -20,38 +20,9 @@ redis_db = 10 # redis database number
[rater]
standalone = true # start standalone server (no balancer)
balancer_server = 127.0.0.1:2000 # balancer address host:port
listen_api = 127.0.0.1:1234 # listening address host:port
json = false # use JSON for RPC encoding
[balancer]
enabled = false
standalone = false # run standalone
listen_rater = 127.0.0.1:2000 # Rater server address
listen_api = 127.0.0.1:2001 # Json RPC server address
web_status_server = 127.0.0.1:8000 # Web server address (for status)
json = false # use JSON for RPC encoding
[scheduler]
enabled = false
standalone = false # run standalone (no other service)
enabled = true
json = false # use JSON for RPC encoding
[session_manager]
enabled = false
standalone = false # run standalone
api_server = 127.0.0.1:2000 # balancer address host:port
freeswitch_server = localhost:8021 # freeswitch address host:port
freeswitch_pass = ClueCon # freeswitch address host:port
json = false # use JSON for RPC encoding
[mediator]
enabled = false
standalone = false # run standalone
cdr_file = Master.csv # Freeswitch Master CSV CDR file.
result_file = out.csv # Generated file containing CDR and price info.
host = localhost # The host to connect to. Values that start with / are for UNIX domain sockets.
port = 5432 # The port to bind to.
db = cgrates # The name of the database to connect to.
user = # The user to sign in as.
password = # The user's password.

View File

@@ -1,57 +0,0 @@
# 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/>
[global]
redis_server = 127.0.0.1:6379 #redis address host:port
redis_db = 10 # redis database number
[rater]
standalone = true # start standalone server (no balancer)
balancer_server = 127.0.0.1:2000 # balancer address host:port
listen_api = 127.0.0.1:1234 # listening address host:port
json = false # use JSON for RPC encoding
[balancer]
enabled = false
standalone = false # run standalone
listen_rater = 127.0.0.1:2000 # Rater server address
listen_api = 127.0.0.1:2001 # Json RPC server address
web_status_server = 127.0.0.1:8000 # Web server address (for status)
json = false # use JSON for RPC encoding
[scheduler]
enabled = false
standalone = false # run standalone (no other service)
json = false # use JSON for RPC encoding
[session_manager]
enabled = false
standalone = false # run standalone
api_server = 127.0.0.1:2000 # balancer address host:port
freeswitch_server = localhost:8021 # freeswitch address host:port
freeswitch_pass = ClueCon # freeswitch address host:port
json = false # use JSON for RPC encoding
[mediator]
enabled = false
standalone = false # run standalone
cdr_file = Master.csv # Freeswitch Master CSV CDR file.
result_file = out.csv # Generated file containing CDR and price info.
host = localhost # The host to connect to. Values that start with / are for UNIX domain sockets.
port = 5432 # The port to bind to.
db = cgrates # The name of the database to connect to.
user = # The user to sign in as.
password = # The user's password.

View File

@@ -24,34 +24,10 @@ balancer_server = 127.0.0.1:2000 # balancer address host:port
listen_api = 127.0.0.1:1234 # listening address host:port
json = false # use JSON for RPC encoding
[balancer]
enabled = false
standalone = false # run standalone
listen_rater = 127.0.0.1:2000 # Rater server address
listen_api = 127.0.0.1:2001 # Json RPC server address
web_status_server = 127.0.0.1:8000 # Web server address (for status)
json = false # use JSON for RPC encoding
[scheduler]
enabled = false
standalone = false # run standalone (no other service)
json = false # use JSON for RPC encoding
[session_manager]
enabled = false
standalone = false # run standalone
api_server = 127.0.0.1:2000 # balancer address host:port
freeswitch_server = localhost:8021 # freeswitch address host:port
freeswitch_pass = ClueCon # freeswitch address host:port
json = false # use JSON for RPC encoding
[mediator]
enabled = false
standalone = false # run standalone
cdr_file = Master.csv # Freeswitch Master CSV CDR file.
result_file = out.csv # Generated file containing CDR and price info.
host = localhost # The host to connect to. Values that start with / are for UNIX domain sockets.
port = 5432 # The port to bind to.
db = cgrates # The name of the database to connect to.
user = # The user to sign in as.
password = # The user's password.

View File

@@ -1,57 +0,0 @@
# 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/>
[global]
redis_server = 127.0.0.1:6379 #redis address host:port
redis_db = 10 # redis database number
[rater]
standalone = true # start standalone server (no balancer)
balancer_server = 127.0.0.1:2000 # balancer address host:port
listen_api = 127.0.0.1:1234 # listening address host:port
json = false # use JSON for RPC encoding
[balancer]
enabled = false
standalone = false # run standalone
listen_rater = 127.0.0.1:2000 # Rater server address
listen_api = 127.0.0.1:2001 # Json RPC server address
web_status_server = 127.0.0.1:8000 # Web server address (for status)
json = false # use JSON for RPC encoding
[scheduler]
enabled = false
standalone = false # run standalone (no other service)
json = false # use JSON for RPC encoding
[session_manager]
enabled = false
standalone = false # run standalone
api_server = 127.0.0.1:2000 # balancer address host:port
freeswitch_server = localhost:8021 # freeswitch address host:port
freeswitch_pass = ClueCon # freeswitch address host:port
json = false # use JSON for RPC encoding
[mediator]
enabled = false
standalone = false # run standalone
cdr_file = Master.csv # Freeswitch Master CSV CDR file.
result_file = out.csv # Generated file containing CDR and price info.
host = localhost # The host to connect to. Values that start with / are for UNIX domain sockets.
port = 5432 # The port to bind to.
db = cgrates # The name of the database to connect to.
user = # The user to sign in as.
password = # The user's password.

View File

@@ -34,12 +34,10 @@ json = true # use JSON for RPC encoding
[scheduler]
enabled = true
standalone = true # run standalone (no other service)
json = true # use JSON for RPC encoding
[session_manager]
enabled = true
standalone = true # run standalone
api_server = test # balancer address host:port
freeswitch_server = test # freeswitch address host:port
freeswitch_pass = test # freeswitch address host:port
@@ -47,7 +45,6 @@ json = true # use JSON for RPC encoding
[mediator]
enabled = true
standalone = true # run standalone
cdr_file = test # Freeswitch Master CSV CDR file.
result_file = test # Generated file containing CDR and price info.
host = test # The host to connect to. Values that start with / are for UNIX domain sockets.