diff --git a/apier/v1/accounts.go b/apier/v1/accounts.go
index 40bd8e346..49efdb106 100644
--- a/apier/v1/accounts.go
+++ b/apier/v1/accounts.go
@@ -34,12 +34,12 @@ type AttrAcntAction struct {
type AccountActionTiming struct {
Id string // The id to reference this particular ActionTiming
- ActionTimingsId string // The id of the ActionTimings profile attached to the account
+ ActionPlanId string // The id of the ActionPlanId profile attached to the account
ActionsId string // The id of actions which will be executed
NextExecTime time.Time // Next execution time
}
-func (self *ApierV1) GetAccountActionTimings(attrs AttrAcntAction, reply *[]*AccountActionTiming) error {
+func (self *ApierV1) GetAccountActionPlan(attrs AttrAcntAction, reply *[]*AccountActionTiming) error {
if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Account", "Direction"}); len(missing) != 0 {
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
@@ -51,7 +51,7 @@ func (self *ApierV1) GetAccountActionTimings(attrs AttrAcntAction, reply *[]*Acc
for _, ats := range allATs {
for _, at := range ats {
if utils.IsSliceMember(at.UserBalanceIds, utils.BalanceKey(attrs.Tenant, attrs.Account, attrs.Direction)) {
- accountATs = append(accountATs, &AccountActionTiming{Id: at.Id, ActionTimingsId: at.Tag, ActionsId: at.ActionsId, NextExecTime: at.GetNextStartTime()})
+ accountATs = append(accountATs, &AccountActionTiming{Id: at.Id, ActionPlanId: at.Tag, ActionsId: at.ActionsId, NextExecTime: at.GetNextStartTime()})
}
}
}
@@ -60,7 +60,7 @@ func (self *ApierV1) GetAccountActionTimings(attrs AttrAcntAction, reply *[]*Acc
}
type AttrRemActionTiming struct {
- ActionTimingsId string // Id identifying the ActionTimings profile
+ ActionPlanId string // Id identifying the ActionTimings profile
ActionTimingId string // Internal CGR id identifying particular ActionTiming, *all for all user related ActionTimings to be canceled
Tenant string // Tenant he account belongs to
Account string // Account name
@@ -70,7 +70,7 @@ type AttrRemActionTiming struct {
// Removes an ActionTimings or parts of it depending on filters being set
func (self *ApierV1) RemActionTiming(attrs AttrRemActionTiming, reply *string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"ActionTimingsId"}); len(missing) != 0 { // Only mandatory ActionTimingsId
+ if missing := utils.MissingStructFields(&attrs, []string{"ActionPlanId"}); len(missing) != 0 { // Only mandatory ActionPlanId
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
if len(attrs.Account) != 0 { // Presence of Account requires complete account details to be provided
@@ -79,14 +79,14 @@ func (self *ApierV1) RemActionTiming(attrs AttrRemActionTiming, reply *string) e
}
}
_, err := engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) {
- ats, err := self.AccountDb.GetActionTimings(attrs.ActionTimingsId)
+ ats, err := self.AccountDb.GetActionTimings(attrs.ActionPlanId)
if err != nil {
return 0, err
} else if len(ats) == 0 {
return 0, errors.New(utils.ERR_NOT_FOUND)
}
ats = engine.RemActionTiming(ats, attrs.ActionTimingId, utils.BalanceKey(attrs.Tenant, attrs.Account, attrs.Direction))
- if err := self.AccountDb.SetActionTimings(attrs.ActionTimingsId, ats); err != nil {
+ if err := self.AccountDb.SetActionTimings(attrs.ActionPlanId, ats); err != nil {
return 0, err
}
return 0, nil
@@ -161,7 +161,7 @@ type AttrSetAccount struct {
Direction string
Account string
Type string // <*prepaid|*postpaid>
- ActionTimingsId string
+ ActionPlanId string
}
// Ads a new account into dataDb. If already defined, returns success.
@@ -171,7 +171,7 @@ func (self *ApierV1) SetAccount(attr AttrSetAccount, reply *string) error {
}
balanceId := utils.BalanceKey(attr.Tenant, attr.Account, attr.Direction)
var ub *engine.UserBalance
- var ats engine.ActionTimings
+ var ats engine.ActionPlan
_, err := engine.AccLock.Guard(balanceId, func() (float64, error) {
if bal, _ := self.AccountDb.GetUserBalance(balanceId); bal != nil {
ub = bal
@@ -187,9 +187,9 @@ func (self *ApierV1) SetAccount(attr AttrSetAccount, reply *string) error {
}
}
- if len(attr.ActionTimingsId) != 0 {
+ if len(attr.ActionPlanId) != 0 {
var err error
- ats, err = self.AccountDb.GetActionTimings(attr.ActionTimingsId)
+ ats, err = self.AccountDb.GetActionTimings(attr.ActionPlanId)
if err != nil {
return 0, err
}
@@ -208,7 +208,7 @@ func (self *ApierV1) SetAccount(attr AttrSetAccount, reply *string) error {
}
if len(ats) != 0 {
_, err := engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) { // ToDo: Try locking it above on read somehow
- if err := self.AccountDb.SetActionTimings(attr.ActionTimingsId, ats); err != nil {
+ if err := self.AccountDb.SetActionTimings(attr.ActionPlanId, ats); err != nil {
return 0, err
}
return 0, nil
diff --git a/apier/v1/apier.go b/apier/v1/apier.go
index 2552097a1..f948dc7da 100644
--- a/apier/v1/apier.go
+++ b/apier/v1/apier.go
@@ -121,7 +121,7 @@ func (self *ApierV1) AddBalance(attr *AttrAddBalance, reply *string) error {
if attr.Overwrite {
aType = engine.TOPUP_RESET
}
- at.SetActions(engine.Actions{&engine.Action{ActionType: aType, BalanceId: attr.BalanceId, Direction: attr.Direction,
+ at.SetActions(engine.Actions{&engine.Action{ActionType: aType, BalanceId: attr.BalanceId, Direction: attr.Direction,
Balance: &engine.Balance{Value: attr.Value, Weight: attr.Weight}}})
if err := at.Execute(); err != nil {
*reply = err.Error()
@@ -288,10 +288,10 @@ func (self *ApierV1) SetActions(attrs AttrSetActions, reply *string) error {
return nil
}
-type AttrSetActionTimings struct {
- ActionTimingsId string // Profile id
+type AttrSetActionPlan struct {
+ Id string // Profile id
+ ActionPlan []*ApiActionTiming // Set of actions this Actions profile will perform
Overwrite bool // If previously defined, will be overwritten
- ActionTimings []*ApiActionTiming // Set of actions this Actions profile will perform
ReloadScheduler bool // Enables automatic reload of the scheduler (eg: useful when adding a single action timing)
}
@@ -305,25 +305,25 @@ type ApiActionTiming struct {
Weight float64 // Binding's weight
}
-func (self *ApierV1) SetActionTimings(attrs AttrSetActionTimings, reply *string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"ActionTimingsId", "ActionTimings"}); len(missing) != 0 {
+func (self *ApierV1) SetActionPlan(attrs AttrSetActionPlan, reply *string) error {
+ if missing := utils.MissingStructFields(&attrs, []string{"Id", "ActionPlan"}); len(missing) != 0 {
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
- for _, at := range attrs.ActionTimings {
+ for _, at := range attrs.ActionPlan {
requiredFields := []string{"ActionsId", "Time", "Weight"}
if missing := utils.MissingStructFields(at, requiredFields); len(missing) != 0 {
return fmt.Errorf("%s:Action:%s:%v", utils.ERR_MANDATORY_IE_MISSING, at.ActionsId, missing)
}
}
if !attrs.Overwrite {
- if exists, err := self.AccountDb.DataExists(engine.ACTION_TIMING_PREFIX, attrs.ActionTimingsId); err != nil {
+ if exists, err := self.AccountDb.DataExists(engine.ACTION_TIMING_PREFIX, attrs.Id); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
} else if exists {
return errors.New(utils.ERR_EXISTS)
}
}
- storeAtms := make(engine.ActionTimings, len(attrs.ActionTimings))
- for idx, apiAtm := range attrs.ActionTimings {
+ storeAtms := make(engine.ActionPlan, len(attrs.ActionPlan))
+ for idx, apiAtm := range attrs.ActionPlan {
if exists, err := self.AccountDb.DataExists(engine.ACTION_PREFIX, apiAtm.ActionsId); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
} else if !exists {
@@ -337,17 +337,20 @@ func (self *ApierV1) SetActionTimings(attrs AttrSetActionTimings, reply *string)
timing.StartTime = apiAtm.Time
at := &engine.ActionTiming{
Id: utils.GenUUID(),
- Tag: attrs.ActionTimingsId,
+ Tag: attrs.Id,
Weight: apiAtm.Weight,
Timing: &engine.RateInterval{Timing: timing},
ActionsId: apiAtm.ActionsId,
}
storeAtms[idx] = at
}
- if err := self.AccountDb.SetActionTimings(attrs.ActionTimingsId, storeAtms); err != nil {
+ if err := self.AccountDb.SetActionTimings(attrs.Id, storeAtms); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
}
- if attrs.ReloadScheduler && self.Sched != nil {
+ if attrs.ReloadScheduler {
+ if self.Sched == nil {
+ return errors.New("SCHEDULER_NOT_ENABLED")
+ }
self.Sched.LoadActionTimings(self.AccountDb)
self.Sched.Restart()
}
@@ -421,6 +424,11 @@ func (self *ApierV1) LoadAccountActions(attrs utils.TPAccountActions, reply *str
}); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
}
+ // ToDo: Get the action keys loaded by dbReader so we reload only these in cache
+ // Need to do it before scheduler otherwise actions to run will be unknown
+ if err := self.AccountDb.CacheAccounting(nil); err != nil {
+ return err
+ }
if self.Sched != nil {
self.Sched.LoadActionTimings(self.AccountDb)
self.Sched.Restart()
@@ -437,7 +445,7 @@ func (self *ApierV1) ReloadScheduler(input string, reply *string) error {
self.Sched.Restart()
*reply = OK
return nil
-
+
}
func (self *ApierV1) ReloadCache(attrs utils.ApiReloadCache, reply *string) error {
@@ -536,7 +544,7 @@ func (self *ApierV1) LoadTariffPlanFromFolder(attrs AttrLoadTPFromFolder, reply
path.Join(attrs.FolderPath, utils.RATING_PLANS_CSV),
path.Join(attrs.FolderPath, utils.RATING_PROFILES_CSV),
path.Join(attrs.FolderPath, utils.ACTIONS_CSV),
- path.Join(attrs.FolderPath, utils.ACTION_TIMINGS_CSV),
+ path.Join(attrs.FolderPath, utils.ACTION_PLANS_CSV),
path.Join(attrs.FolderPath, utils.ACTION_TRIGGERS_CSV),
path.Join(attrs.FolderPath, utils.ACCOUNT_ACTIONS_CSV))
if err := loader.LoadAll(); err != nil {
@@ -549,6 +557,37 @@ func (self *ApierV1) LoadTariffPlanFromFolder(attrs AttrLoadTPFromFolder, reply
if err := loader.WriteToDatabase(attrs.FlushDb, false); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
}
+ // Make sure the items are in the cache
+ dstIds, _ := loader.GetLoadedIds(engine.DESTINATION_PREFIX)
+ dstKeys := make([]string, len(dstIds))
+ for idx, dId := range dstIds {
+ dstKeys[idx] = engine.DESTINATION_PREFIX + dId // Cache expects them as redis keys
+ }
+ rplIds, _ := loader.GetLoadedIds(engine.RATING_PLAN_PREFIX)
+ rpKeys := make([]string, len(rplIds))
+ for idx, rpId := range rplIds {
+ rpKeys[idx] = engine.RATING_PLAN_PREFIX + rpId
+ }
+ rpfIds, _ := loader.GetLoadedIds(engine.RATING_PROFILE_PREFIX)
+ rpfKeys := make([]string, len(rpfIds))
+ for idx, rpfId := range rpfIds {
+ rpfKeys[idx] = engine.RATING_PROFILE_PREFIX + rpfId
+ }
+ actIds, _ := loader.GetLoadedIds(engine.ACTION_PREFIX)
+ actKeys := make([]string, len(actIds))
+ for idx, actId := range actIds {
+ actKeys[idx] = engine.ACTION_PREFIX + actId
+ }
+ if err := self.RatingDb.CacheRating(dstKeys, rpKeys, rpfKeys); err != nil {
+ return err
+ }
+ if err := self.AccountDb.CacheAccounting(actKeys); err != nil {
+ return err
+ }
+ if self.Sched != nil {
+ self.Sched.LoadActionTimings(self.AccountDb)
+ self.Sched.Restart()
+ }
*reply = "OK"
return nil
}
diff --git a/apier/v1/apier_local_test.go b/apier/v1/apier_local_test.go
index c083e6e82..8aff9e17f 100644
--- a/apier/v1/apier_local_test.go
+++ b/apier/v1/apier_local_test.go
@@ -549,51 +549,51 @@ func TestApierTPActionTimings(t *testing.T) {
return
}
reply := ""
- at := &utils.TPActionTimings{TPid: engine.TEST_SQL, ActionTimingsId: "PREPAID_10", ActionTimings: []*utils.TPActionTiming{
+ at := &utils.TPActionPlan{TPid: engine.TEST_SQL, Id: "PREPAID_10", ActionPlan: []*utils.TPActionTiming{
&utils.TPActionTiming{ActionsId: "PREPAID_10", TimingId: "ASAP", Weight: 10},
}}
- atTst := new(utils.TPActionTimings)
+ atTst := new(utils.TPActionPlan)
*atTst = *at
- atTst.ActionTimingsId = engine.TEST_SQL
- for _, act := range []*utils.TPActionTimings{at, atTst} {
- if err := rater.Call("ApierV1.SetTPActionTimings", act, &reply); err != nil {
- t.Error("Got error on ApierV1.SetTPActionTimings: ", err.Error())
+ atTst.Id = engine.TEST_SQL
+ for _, act := range []*utils.TPActionPlan{at, atTst} {
+ if err := rater.Call("ApierV1.SetTPActionPlan", act, &reply); err != nil {
+ t.Error("Got error on ApierV1.SetTPActionPlan: ", err.Error())
} else if reply != "OK" {
- t.Error("Unexpected reply received when calling ApierV1.SetTPActionTimings: ", reply)
+ t.Error("Unexpected reply received when calling ApierV1.SetTPActionPlan: ", reply)
}
}
// Check second set
- if err := rater.Call("ApierV1.SetTPActionTimings", atTst, &reply); err != nil {
- t.Error("Got error on second ApierV1.SetTPActionTimings: ", err.Error())
+ if err := rater.Call("ApierV1.SetTPActionPlan", atTst, &reply); err != nil {
+ t.Error("Got error on second ApierV1.SetTPActionPlan: ", err.Error())
} else if reply != "OK" {
- t.Error("Calling ApierV1.SetTPActionTimings got reply: ", reply)
+ t.Error("Calling ApierV1.SetTPActionPlan got reply: ", reply)
}
// Check missing params
- if err := rater.Call("ApierV1.SetTPActionTimings", new(utils.TPActionTimings), &reply); err == nil {
- t.Error("Calling ApierV1.SetTPActionTimings, expected error, received: ", reply)
- } else if err.Error() != "MANDATORY_IE_MISSING:[TPid ActionTimingsId ActionTimings]" {
- t.Error("Calling ApierV1.SetTPActionTimings got unexpected error: ", err.Error())
+ if err := rater.Call("ApierV1.SetTPActionPlan", new(utils.TPActionPlan), &reply); err == nil {
+ t.Error("Calling ApierV1.SetTPActionPlan, expected error, received: ", reply)
+ } else if err.Error() != "MANDATORY_IE_MISSING:[TPid Id ActionPlan]" {
+ t.Error("Calling ApierV1.SetTPActionPlan got unexpected error: ", err.Error())
}
// Test get
- var rplyActs *utils.TPActionTimings
- if err := rater.Call("ApierV1.GetTPActionTimings", AttrGetTPActionTimings{TPid: atTst.TPid, ActionTimingsId: atTst.ActionTimingsId}, &rplyActs); err != nil {
- t.Error("Calling ApierV1.GetTPActionTimings, got error: ", err.Error())
+ var rplyActs *utils.TPActionPlan
+ if err := rater.Call("ApierV1.GetTPActionPlan", AttrGetTPActionPlan{TPid: atTst.TPid, Id: atTst.Id}, &rplyActs); err != nil {
+ t.Error("Calling ApierV1.GetTPActionPlan, got error: ", err.Error())
} else if !reflect.DeepEqual(atTst, rplyActs) {
- t.Errorf("Calling ApierV1.GetTPActionTimings expected: %v, received: %v", atTst, rplyActs)
+ t.Errorf("Calling ApierV1.GetTPActionPlan expected: %v, received: %v", atTst, rplyActs)
}
// Test remove
- if err := rater.Call("ApierV1.RemTPActionTimings", AttrGetTPActionTimings{TPid: atTst.TPid, ActionTimingsId: atTst.ActionTimingsId}, &reply); err != nil {
- t.Error("Calling ApierV1.RemTPActionTimings, got error: ", err.Error())
+ if err := rater.Call("ApierV1.RemTPActionPlan", AttrGetTPActionPlan{TPid: atTst.TPid, Id: atTst.Id}, &reply); err != nil {
+ t.Error("Calling ApierV1.RemTPActionPlan, got error: ", err.Error())
} else if reply != "OK" {
- t.Error("Calling ApierV1.RemTPActionTimings received: ", reply)
+ t.Error("Calling ApierV1.RemTPActionPlan received: ", reply)
}
// Test getIds
var rplyIds []string
expectedIds := []string{"PREPAID_10"}
- if err := rater.Call("ApierV1.GetTPActionTimingIds", AttrGetTPActionTimingIds{TPid: atTst.TPid}, &rplyIds); err != nil {
- t.Error("Calling ApierV1.GetTPActionTimingIds, got error: ", err.Error())
+ if err := rater.Call("ApierV1.GetTPActionPlanIds", AttrGetTPActionPlanIds{TPid: atTst.TPid}, &rplyIds); err != nil {
+ t.Error("Calling ApierV1.GetTPActionPlanIds, got error: ", err.Error())
} else if !reflect.DeepEqual(expectedIds, rplyIds) {
- t.Errorf("Calling ApierV1.GetTPActionTimingIds expected: %v, received: %v", expectedIds, rplyIds)
+ t.Errorf("Calling ApierV1.GetTPActionPlanIds expected: %v, received: %v", expectedIds, rplyIds)
}
}
@@ -657,15 +657,15 @@ func TestApierTPAccountActions(t *testing.T) {
}
reply := ""
aa1 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org",
- Account: "1001", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
+ Account: "1001", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
aa2 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org",
- Account: "1002", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
+ Account: "1002", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
aa3 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org",
- Account: "1003", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
+ Account: "1003", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
aa4 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org",
- Account: "1004", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
+ Account: "1004", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
aa5 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org",
- Account: "1005", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
+ Account: "1005", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
aaTst := new(utils.TPAccountActions)
*aaTst = *aa1
aaTst.Account = engine.TEST_SQL
@@ -685,7 +685,7 @@ func TestApierTPAccountActions(t *testing.T) {
// Check missing params
if err := rater.Call("ApierV1.SetTPAccountActions", new(utils.TPAccountActions), &reply); err == nil {
t.Error("Calling ApierV1.SetTPAccountActions, expected error, received: ", reply)
- } else if err.Error() != "MANDATORY_IE_MISSING:[TPid LoadId Tenant Account Direction ActionTimingsId ActionTriggersId]" {
+ } else if err.Error() != "MANDATORY_IE_MISSING:[TPid LoadId Tenant Account Direction ActionPlanId ActionTriggersId]" {
t.Error("Calling ApierV1.SetTPAccountActions got unexpected error: ", err.Error())
}
// Test get
@@ -976,20 +976,20 @@ func TestApierSetActions(t *testing.T) {
}
}
-func TestApierSetActionTimings(t *testing.T) {
+func TestApierSetActionPlan(t *testing.T) {
if !*testLocal {
return
}
atm1 := &ApiActionTiming{ActionsId: "ACTS_1", MonthDays: "1", Time: "00:00:00", Weight: 20.0}
- atms1 := &AttrSetActionTimings{ActionTimingsId: "ATMS_1", ActionTimings: []*ApiActionTiming{atm1}}
+ atms1 := &AttrSetActionPlan{Id: "ATMS_1", ActionPlan: []*ApiActionTiming{atm1}}
reply1 := ""
- if err := rater.Call("ApierV1.SetActionTimings", atms1, &reply1); err != nil {
- t.Error("Got error on ApierV1.SetActionTimings: ", err.Error())
+ if err := rater.Call("ApierV1.SetActionPlan", atms1, &reply1); err != nil {
+ t.Error("Got error on ApierV1.SetActionPlan: ", err.Error())
} else if reply1 != "OK" {
- t.Errorf("Calling ApierV1.SetActionTimings received: %s", reply1)
+ t.Errorf("Calling ApierV1.SetActionPlan received: %s", reply1)
}
// Calling the second time should raise EXISTS
- if err := rater.Call("ApierV1.SetActionTimings", atms1, &reply1); err == nil || err.Error() != "EXISTS" {
+ if err := rater.Call("ApierV1.SetActionPlan", atms1, &reply1); err == nil || err.Error() != "EXISTS" {
t.Error("Unexpected result on duplication: ", err.Error())
}
}
@@ -1020,7 +1020,7 @@ func TestApierAddTriggeredAction(t *testing.T) {
-// Test here AddTriggeredAction
+// Test here GetAccountActionTriggers
func TestApierGetAccountActionTriggers(t *testing.T) {
if !*testLocal {
return
@@ -1034,6 +1034,7 @@ func TestApierGetAccountActionTriggers(t *testing.T) {
}
}
+
// Test here RemAccountActionTriggers
func TestApierRemAccountActionTriggers(t *testing.T) {
if !*testLocal {
@@ -1068,7 +1069,7 @@ func TestApierSetAccount(t *testing.T) {
return
}
reply := ""
- attrs := &AttrSetAccount{Tenant: "cgrates.org", Direction: "*out", Account: "dan7", Type: "*prepaid", ActionTimingsId: "ATMS_1"}
+ attrs := &AttrSetAccount{Tenant: "cgrates.org", Direction: "*out", Account: "dan7", Type: "*prepaid", ActionPlanId: "ATMS_1"}
if err := rater.Call("ApierV1.SetAccount", attrs, &reply); err != nil {
t.Error("Got error on ApierV1.SetAccount: ", err.Error())
} else if reply != "OK" {
@@ -1077,7 +1078,7 @@ func TestApierSetAccount(t *testing.T) {
reply2 := ""
attrs2 := new(AttrSetAccount)
*attrs2 = *attrs
- attrs2.ActionTimingsId = "DUMMY_DATA" // Does not exist so it should error when adding triggers on it
+ attrs2.ActionPlanId = "DUMMY_DATA" // Does not exist so it should error when adding triggers on it
// Add account with actions timing which does not exist
if err := rater.Call("ApierV1.SetAccount", attrs2, &reply2); err == nil || reply2 == "OK" { // OK is not welcomed
t.Error("Expecting error on ApierV1.SetAccount.", err, reply2)
@@ -1086,30 +1087,31 @@ func TestApierSetAccount(t *testing.T) {
// Test here GetAccountActionTimings
-func TestApierGetAccountActionTimings(t *testing.T) {
+func TestApierGetAccountActionPlan(t *testing.T) {
if !*testLocal {
return
}
var reply []*AccountActionTiming
req := AttrAcntAction{Tenant: "cgrates.org", Account:"dan7", Direction: "*out"}
- if err := rater.Call("ApierV1.GetAccountActionTimings", req, &reply); err != nil {
- t.Error("Got error on ApierV1.GetAccountActionTimings: ", err.Error())
+ if err := rater.Call("ApierV1.GetAccountActionPlan", req, &reply); err != nil {
+ t.Error("Got error on ApierV1.GetAccountActionPlan: ", err.Error())
} else if len(reply) != 1 {
- t.Error("Unexpected action timings received")
+ t.Error("Unexpected action plan received")
} else {
- if reply[0].ActionTimingsId != "ATMS_1" {
- t.Errorf("Unexpected ActionTImingsId received")
+ if reply[0].ActionPlanId != "ATMS_1" {
+ t.Errorf("Unexpected ActionPlanId received")
}
}
}
+
// Test here RemActionTiming
func TestApierRemActionTiming(t *testing.T) {
if !*testLocal {
return
}
var rmReply string
- rmReq := AttrRemActionTiming{ActionTimingsId: "ATMS_1", Tenant: "cgrates.org", Account:"dan4", Direction: "*out"}
+ rmReq := AttrRemActionTiming{ActionPlanId: "ATMS_1", Tenant: "cgrates.org", Account:"dan4", Direction: "*out"}
if err := rater.Call("ApierV1.RemActionTiming", rmReq, &rmReply); err != nil {
t.Error("Got error on ApierV1.RemActionTiming: ", err.Error())
} else if rmReply != OK {
@@ -1117,8 +1119,8 @@ func TestApierRemActionTiming(t *testing.T) {
}
var reply []*AccountActionTiming
req := AttrAcntAction{Tenant: "cgrates.org", Account:"dan4", Direction: "*out"}
- if err := rater.Call("ApierV1.GetAccountActionTimings", req, &reply); err != nil {
- t.Error("Got error on ApierV1.GetAccountActionTimings: ", err.Error())
+ if err := rater.Call("ApierV1.GetAccountActionPlan", req, &reply); err != nil {
+ t.Error("Got error on ApierV1.GetAccountActionPlan: ", err.Error())
} else if len(reply) != 0 {
t.Error("Action timings was not removed")
}
@@ -1163,6 +1165,26 @@ func TestApierGetBalance(t *testing.T) {
}
}
+// Start with initial balance, top-up to test max_balance
+func TestTriggersExecute(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ reply := ""
+ attrs := &AttrSetAccount{Tenant: "cgrates.org", Direction: "*out", Account: "dan8", Type: "*prepaid"}
+ if err := rater.Call("ApierV1.SetAccount", attrs, &reply); err != nil {
+ t.Error("Got error on ApierV1.SetAccount: ", err.Error())
+ } else if reply != "OK" {
+ t.Errorf("Calling ApierV1.SetAccount received: %s", reply)
+ }
+ attrAddBlnc := &AttrAddBalance{Tenant: "cgrates.org", Account: "1008", BalanceId: "*monetary", Direction: "*out", Value: 2}
+ if err := rater.Call("ApierV1.AddBalance", attrAddBlnc, &reply); err != nil {
+ t.Error("Got error on ApierV1.AddBalance: ", err.Error())
+ } else if reply != "OK" {
+ t.Errorf("Calling ApierV1.AddBalance received: %s", reply)
+ }
+}
+
// Test here LoadTariffPlanFromFolder
func TestApierLoadTariffPlanFromFolder(t *testing.T) {
if !*testLocal {
diff --git a/apier/v1/tpaccountactions.go b/apier/v1/tpaccountactions.go
index 4ffa7caee..989ed05f1 100644
--- a/apier/v1/tpaccountactions.go
+++ b/apier/v1/tpaccountactions.go
@@ -27,7 +27,7 @@ import (
// Creates a new AccountActions profile within a tariff plan
func (self *ApierV1) SetTPAccountActions(attrs utils.TPAccountActions, reply *string) error {
if missing := utils.MissingStructFields(&attrs,
- []string{"TPid", "LoadId", "Tenant", "Account", "Direction", "ActionTimingsId", "ActionTriggersId"}); len(missing) != 0 {
+ []string{"TPid", "LoadId", "Tenant", "Account", "Direction", "ActionPlanId", "ActionTriggersId"}); len(missing) != 0 {
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
if err := self.StorDb.SetTPAccountActions(attrs.TPid, map[string]*utils.TPAccountActions{attrs.KeyId(): &attrs}); err != nil {
diff --git a/apier/v1/tpactiontimings.go b/apier/v1/tpactiontimings.go
index 308c914d9..ec9210fb9 100644
--- a/apier/v1/tpactiontimings.go
+++ b/apier/v1/tpactiontimings.go
@@ -25,50 +25,50 @@ import (
)
// Creates a new ActionTimings profile within a tariff plan
-func (self *ApierV1) SetTPActionTimings(attrs utils.TPActionTimings, reply *string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId", "ActionTimings"}); len(missing) != 0 {
+func (self *ApierV1) SetTPActionPlan(attrs utils.TPActionPlan, reply *string) error {
+ if missing := utils.MissingStructFields(&attrs, []string{"TPid", "Id", "ActionPlan"}); len(missing) != 0 {
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
- for _, at := range attrs.ActionTimings {
+ for _, at := range attrs.ActionPlan {
requiredFields := []string{"ActionsId", "TimingId", "Weight"}
if missing := utils.MissingStructFields(at, requiredFields); len(missing) != 0 {
return fmt.Errorf("%s:Action:%s:%v", utils.ERR_MANDATORY_IE_MISSING, at.ActionsId, missing)
}
}
- if err := self.StorDb.SetTPActionTimings(attrs.TPid, map[string][]*utils.TPActionTiming{attrs.ActionTimingsId: attrs.ActionTimings}); err != nil {
+ if err := self.StorDb.SetTPActionTimings(attrs.TPid, map[string][]*utils.TPActionTiming{attrs.Id: attrs.ActionPlan}); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
}
*reply = "OK"
return nil
}
-type AttrGetTPActionTimings struct {
+type AttrGetTPActionPlan struct {
TPid string // Tariff plan id
- ActionTimingsId string // ActionTimings id
+ Id string // ActionTimings id
}
-// Queries specific ActionTimings profile on tariff plan
-func (self *ApierV1) GetTPActionTimings(attrs AttrGetTPActionTimings, reply *utils.TPActionTimings) error {
- if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId"}); len(missing) != 0 { //Params missing
+// Queries specific ActionPlan profile on tariff plan
+func (self *ApierV1) GetTPActionPlan(attrs AttrGetTPActionPlan, reply *utils.TPActionPlan) error {
+ if missing := utils.MissingStructFields(&attrs, []string{"TPid", "Id"}); len(missing) != 0 { //Params missing
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
- if ats, err := self.StorDb.GetTPActionTimings(attrs.TPid, attrs.ActionTimingsId); err != nil {
+ if ats, err := self.StorDb.GetTPActionTimings(attrs.TPid, attrs.Id); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
} else if len(ats) == 0 {
return errors.New(utils.ERR_NOT_FOUND)
} else { // Got the data we need, convert it
- atRply := &utils.TPActionTimings{attrs.TPid, attrs.ActionTimingsId, ats[attrs.ActionTimingsId]}
+ atRply := &utils.TPActionPlan{attrs.TPid, attrs.Id, ats[attrs.Id]}
*reply = *atRply
}
return nil
}
-type AttrGetTPActionTimingIds struct {
+type AttrGetTPActionPlanIds struct {
TPid string // Tariff plan id
}
-// Queries ActionTimings identities on specific tariff plan.
-func (self *ApierV1) GetTPActionTimingIds(attrs AttrGetTPActionTimingIds, reply *[]string) error {
+// Queries ActionPlan identities on specific tariff plan.
+func (self *ApierV1) GetTPActionPlanIds(attrs AttrGetTPActionPlanIds, reply *[]string) error {
if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
@@ -82,12 +82,12 @@ func (self *ApierV1) GetTPActionTimingIds(attrs AttrGetTPActionTimingIds, reply
return nil
}
-// Removes specific ActionTimings on Tariff plan
-func (self *ApierV1) RemTPActionTimings(attrs AttrGetTPActionTimings, reply *string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId"}); len(missing) != 0 { //Params missing
+// Removes specific ActionPlan on Tariff plan
+func (self *ApierV1) RemTPActionPlan(attrs AttrGetTPActionPlan, reply *string) error {
+ if missing := utils.MissingStructFields(&attrs, []string{"TPid", "Id"}); len(missing) != 0 { //Params missing
return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing)
}
- if err := self.StorDb.RemTPData(utils.TBL_TP_ACTION_TIMINGS, attrs.TPid, attrs.ActionTimingsId); err != nil {
+ if err := self.StorDb.RemTPData(utils.TBL_TP_ACTION_PLANS, attrs.TPid, attrs.Id); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
} else {
*reply = "OK"
diff --git a/apier/v1/tutfscsv_local_test.go b/apier/v1/tutfscsv_local_test.go
new file mode 100644
index 000000000..6b5f8ef15
--- /dev/null
+++ b/apier/v1/tutfscsv_local_test.go
@@ -0,0 +1,194 @@
+/*
+Rating system designed to be used in VoIP Carriers World
+Copyright (C) 2013 ITsysCOM
+
+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
+*/
+
+package apier
+
+import (
+ "testing"
+ "fmt"
+ "github.com/cgrates/cgrates/engine"
+ "github.com/cgrates/cgrates/utils"
+ "net/rpc"
+ "net/rpc/jsonrpc"
+ "os/exec"
+ "path"
+ "time"
+ "reflect"
+)
+
+
+// Empty tables before using them
+func TestFsCsvCreateTables(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ if *storDbType != utils.MYSQL {
+ t.Fatal("Unsupported storDbType")
+ }
+ var mysql *engine.MySQLStorage
+ if d, err := engine.NewMySQLStorage(cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass); err != nil {
+ t.Fatal("Error on opening database connection: ", err)
+ } else {
+ mysql = d.(*engine.MySQLStorage)
+ }
+ for _, scriptName := range []string{engine.CREATE_CDRS_TABLES_SQL, engine.CREATE_COSTDETAILS_TABLES_SQL, engine.CREATE_MEDIATOR_TABLES_SQL, engine.CREATE_TARIFFPLAN_TABLES_SQL} {
+ if err := mysql.CreateTablesFromScript(path.Join(*dataDir, "storage", *storDbType, scriptName)); err != nil {
+ t.Fatal("Error on mysql creation: ", err.Error())
+ return // No point in going further
+ }
+ }
+ for _, tbl := range []string{utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_EXTRA} {
+ if _, err := mysql.Db.Query(fmt.Sprintf("SELECT 1 from %s", tbl)); err != nil {
+ t.Fatal(err.Error())
+ }
+ }
+}
+
+func TestFsCsvInitDataDb(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ ratingDb, err := engine.ConfigureRatingStorage(cfg.RatingDBType, cfg.RatingDBHost, cfg.RatingDBPort, cfg.RatingDBName, cfg.RatingDBUser, cfg.RatingDBPass, cfg.DBDataEncoding)
+ if err != nil {
+ t.Fatal("Cannot connect to dataDb", err)
+ }
+ accountDb, err := engine.ConfigureAccountingStorage(cfg.AccountDBType, cfg.AccountDBHost, cfg.AccountDBPort, cfg.AccountDBName,
+ cfg.AccountDBUser, cfg.AccountDBPass, cfg.DBDataEncoding)
+ if err != nil {
+ t.Fatal("Cannot connect to dataDb", err)
+ }
+ for _, db := range []engine.Storage{ratingDb, accountDb} {
+ if err := db.Flush(); err != nil {
+ t.Fatal("Cannot reset dataDb", err)
+ }
+ }
+}
+
+// Finds cgr-engine executable and starts it with default configuration
+func TestFsCsvStartEngine(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ enginePath, err := exec.LookPath("cgr-engine")
+ if err != nil {
+ t.Fatal("Cannot find cgr-engine executable")
+ }
+ exec.Command("pkill", "cgr-engine").Run() // Just to make sure another one is not running, bit brutal maybe we can fine tune it
+ engine := exec.Command(enginePath, "-rater", "-scheduler", "-cdrs", "-mediator", "-config", path.Join(*dataDir, "conf", "cgrates.cfg"))
+ if err := engine.Start(); err != nil {
+ t.Fatal("Cannot start cgr-engine: ", err.Error())
+ }
+ time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time to rater to fire up
+}
+
+// Connect rpc client to rater
+func TestFsCsvRpcConn(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ var err error
+ if cfg.RPCEncoding == utils.JSON {
+ rater, err = jsonrpc.Dial("tcp", cfg.MediatorRater)
+ } else {
+ rater, err = rpc.Dial("tcp", cfg.MediatorRater)
+ }
+ if err != nil {
+ t.Fatal("Could not connect to rater: ", err.Error())
+ }
+}
+
+
+// Make sure we start with fresh data
+func TestFsCsvEmptyCache(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ reply := ""
+ arc := new(utils.ApiReloadCache)
+ // Simple test that command is executed without errors
+ if err := rater.Call("ApierV1.ReloadCache", arc, &reply); err != nil {
+ t.Error("Got error on ApierV1.ReloadCache: ", err.Error())
+ } else if reply != "OK" {
+ t.Error("Calling ApierV1.ReloadCache got reply: ", reply)
+ }
+ var rcvStats *utils.CacheStats
+ expectedStats := &utils.CacheStats{Destinations: 0, RatingPlans: 0, RatingProfiles: 0, Actions: 0}
+ var args utils.AttrCacheStats
+ if err := rater.Call("ApierV1.GetCacheStats", args, &rcvStats); err != nil {
+ t.Error("Got error on ApierV1.GetCacheStats: ", err.Error())
+ } else if !reflect.DeepEqual(expectedStats, rcvStats) {
+ t.Errorf("Calling ApierV1.GetCacheStats expected: %v, received: %v", expectedStats, rcvStats)
+ }
+}
+
+func TestFsCsvLoadTariffPlans(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ reply := ""
+ // Simple test that command is executed without errors
+ attrs := &AttrLoadTPFromFolder{FolderPath: path.Join(*dataDir, "tutorials", "fs_csv", "cgrates", "tariffplans")}
+ if err := rater.Call("ApierV1.LoadTariffPlanFromFolder", attrs, &reply); err != nil {
+ t.Error("Got error on ApierV1.LoadTariffPlanFromFolder: ", err.Error())
+ } else if reply != "OK" {
+ t.Error("Calling ApierV1.LoadTariffPlanFromFolder got reply: ", reply)
+ }
+ var rcvStats *utils.CacheStats
+ expectedStats := &utils.CacheStats{Destinations: 3, RatingPlans: 1, RatingProfiles: 1, Actions: 2}
+ var args utils.AttrCacheStats
+ if err := rater.Call("ApierV1.GetCacheStats", args, &rcvStats); err != nil {
+ t.Error("Got error on ApierV1.GetCacheStats: ", err.Error())
+ } else if !reflect.DeepEqual(expectedStats, rcvStats) {
+ t.Errorf("Calling ApierV1.GetCacheStats expected: %v, received: %v", expectedStats, rcvStats)
+ }
+}
+
+func TestFsCsvCall1(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ tStart := time.Date(2014, 01, 15, 6, 0, 0, 0, time.UTC)
+ tEnd := time.Date(2014, 01, 15, 6, 0, 35, 0, time.UTC)
+ cd := engine.CallDescriptor {
+ Direction: "*out",
+ TOR: "call",
+ Tenant: "cgrates.org",
+ Subject: "1001",
+ Account: "1001",
+ Destination: "1002",
+ TimeStart: tStart,
+ TimeEnd: tEnd,
+ CallDuration: 35,
+ }
+ var cc engine.CallCost
+ // Simple test that command is executed without errors
+ if err := rater.Call("Responder.GetCost", cd, &cc); err != nil {
+ t.Error("Got error on Responder.GetCost: ", err.Error())
+ } else if cc.ConnectFee != 0.4 && cc.Cost != 0.2 {
+ t.Errorf("Calling Responder.GetCost got callcost: %v", cc)
+ }
+}
+
+
+// Simply kill the engine after we are done with tests within this file
+func TestFsCsvStopEngine(t *testing.T) {
+ if !*testLocal {
+ return
+ }
+ exec.Command("pkill", "cgr-engine").Run()
+}
diff --git a/cdrc/cdrc.go b/cdrc/cdrc.go
index 7393b95e8..3df8587e6 100644
--- a/cdrc/cdrc.go
+++ b/cdrc/cdrc.go
@@ -23,10 +23,6 @@ import (
"encoding/csv"
"errors"
"fmt"
- "github.com/cgrates/cgrates/config"
- "github.com/cgrates/cgrates/engine"
- "github.com/cgrates/cgrates/utils"
- "github.com/howeyc/fsnotify"
"io"
"io/ioutil"
"net/http"
@@ -36,6 +32,11 @@ import (
"strconv"
"strings"
"time"
+
+ "github.com/cgrates/cgrates/config"
+ "github.com/cgrates/cgrates/engine"
+ "github.com/cgrates/cgrates/utils"
+ "github.com/howeyc/fsnotify"
)
const (
@@ -59,9 +60,9 @@ func NewCdrc(config *config.CGRConfig) (*Cdrc, error) {
}
type Cdrc struct {
- cgrCfg *config.CGRConfig
+ cgrCfg *config.CGRConfig
cfgCdrFields map[string]string // Key is the name of the field
- httpClient *http.Client
+ httpClient *http.Client
}
// When called fires up folder monitoring, either automated via inotify or manual by sleeping between processing
@@ -80,17 +81,17 @@ func (self *Cdrc) Run() error {
func (self *Cdrc) parseFieldsConfig() error {
var err error
self.cfgCdrFields = map[string]string{
- utils.ACCID: self.cgrCfg.CdrcAccIdField,
- utils.REQTYPE: self.cgrCfg.CdrcReqTypeField,
- utils.DIRECTION: self.cgrCfg.CdrcDirectionField,
- utils.TENANT: self.cgrCfg.CdrcTenantField,
- utils.TOR: self.cgrCfg.CdrcTorField,
- utils.ACCOUNT: self.cgrCfg.CdrcAccountField,
- utils.SUBJECT: self.cgrCfg.CdrcSubjectField,
- utils.DESTINATION: self.cgrCfg.CdrcDestinationField,
- utils.ANSWER_TIME: self.cgrCfg.CdrcAnswerTimeField,
- utils.DURATION: self.cgrCfg.CdrcDurationField,
- }
+ utils.ACCID: self.cgrCfg.CdrcAccIdField,
+ utils.REQTYPE: self.cgrCfg.CdrcReqTypeField,
+ utils.DIRECTION: self.cgrCfg.CdrcDirectionField,
+ utils.TENANT: self.cgrCfg.CdrcTenantField,
+ utils.TOR: self.cgrCfg.CdrcTorField,
+ utils.ACCOUNT: self.cgrCfg.CdrcAccountField,
+ utils.SUBJECT: self.cgrCfg.CdrcSubjectField,
+ utils.DESTINATION: self.cgrCfg.CdrcDestinationField,
+ utils.ANSWER_TIME: self.cgrCfg.CdrcAnswerTimeField,
+ utils.DURATION: self.cgrCfg.CdrcDurationField,
+ }
// Add extra fields here, config extra fields in the form of []string{"fieldName1:indxInCsv1","fieldName2: indexInCsv2"}
for _, fieldWithIdx := range self.cgrCfg.CdrcExtraFields {
@@ -203,7 +204,7 @@ func (self *Cdrc) processFile(filePath string) error {
engine.Logger.Err(fmt.Sprintf(" Error in csv file: %s", err.Error()))
continue
}
- if _, err := self.httpClient.PostForm(fmt.Sprintf("http://%s/cgr", self.cgrCfg.CdrcCdrs), cdrAsForm); err != nil {
+ if _, err := self.httpClient.PostForm(fmt.Sprintf("http://%s/cgr", self.cgrCfg.HTTPListen), cdrAsForm); err != nil {
engine.Logger.Err(fmt.Sprintf(" Failed posting CDR, error: %s", err.Error()))
continue
}
diff --git a/cdrs/cdrs.go b/cdrs/cdrs.go
index d02cedf8c..e9d0118a2 100644
--- a/cdrs/cdrs.go
+++ b/cdrs/cdrs.go
@@ -20,12 +20,13 @@ package cdrs
import (
"fmt"
+ "io/ioutil"
+ "net/http"
+
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/mediator"
"github.com/cgrates/cgrates/utils"
- "io/ioutil"
- "net/http"
)
var (
@@ -75,8 +76,7 @@ func New(s engine.CdrStorage, m *mediator.Mediator, c *config.CGRConfig) *CDRS {
return &CDRS{}
}
-func (cdrs *CDRS) StartCapturingCDRs() {
- http.HandleFunc("/cgr", cgrCdrHandler) // Attach CGR CDR Handler
- http.HandleFunc("/freeswitch_json", fsCdrHandler) // Attach FreeSWITCH JSON CDR Handler
- http.ListenAndServe(cfg.CDRSListen, nil)
+func (cdrs *CDRS) RegisterHanlersToServer(server *engine.Server) {
+ server.RegisterHttpFunc("/cgr", cgrCdrHandler)
+ server.RegisterHttpFunc("/freeswitch_json", fsCdrHandler)
}
diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go
index 904619e59..a09a4650d 100644
--- a/cmd/cgr-engine/cgr-engine.go
+++ b/cmd/cgr-engine/cgr-engine.go
@@ -22,11 +22,8 @@ import (
"errors"
"flag"
"fmt"
- "io"
"log"
- "net"
"net/rpc"
- "net/rpc/jsonrpc"
"os"
"runtime"
"strconv"
@@ -46,7 +43,6 @@ import (
)
const (
- DISABLED = "disabled"
INTERNAL = "internal"
JSON = "json"
GOB = "gob"
@@ -69,42 +65,14 @@ var (
pidFile = flag.String("pid", "", "Write pid file")
bal = balancer2go.NewBalancer()
exitChan = make(chan bool)
- sm sessionmanager.SessionManager
- medi *mediator.Mediator
- cfg *config.CGRConfig
- err error
+ server = &engine.Server{}
+
+ sm sessionmanager.SessionManager
+ medi *mediator.Mediator
+ cfg *config.CGRConfig
+ err error
)
-func listenToRPCRequests(rpcResponder interface{}, apier *apier.ApierV1, rpcAddress string, rpc_encoding string) {
- l, err := net.Listen("tcp", rpcAddress)
- if err != nil {
- engine.Logger.Crit(fmt.Sprintf(" Could not listen to %v: %v", rpcAddress, err))
- exitChan <- true
- return
- }
- defer l.Close()
-
- engine.Logger.Info(fmt.Sprintf(" Listening for incomming RPC requests on %v", l.Addr()))
- rpc.Register(rpcResponder)
- rpc.Register(apier)
- var serveFunc func(io.ReadWriteCloser)
- if rpc_encoding == JSON {
- serveFunc = jsonrpc.ServeConn
- } else {
- serveFunc = rpc.ServeConn
- }
- for {
- conn, err := l.Accept()
- if err != nil {
- engine.Logger.Err(fmt.Sprintf(" Accept error: %v", conn))
- continue
- }
-
- engine.Logger.Info(fmt.Sprintf(" New incoming connection: %v", conn.RemoteAddr()))
- go serveFunc(conn)
- }
-}
-
func startMediator(responder *engine.Responder, loggerDb engine.LogStorage, cdrDb engine.CdrStorage) {
var connector engine.Connector
if cfg.MediatorRater == INTERNAL {
@@ -112,22 +80,13 @@ func startMediator(responder *engine.Responder, loggerDb engine.LogStorage, cdrD
} else {
var client *rpc.Client
var err error
- if cfg.RPCEncoding == JSON {
- for i := 0; i < cfg.MediatorRaterReconnects; i++ {
- client, err = jsonrpc.Dial("tcp", cfg.MediatorRater)
- if err == nil { //Connected so no need to reiterate
- break
- }
- time.Sleep(time.Duration(i/2) * time.Second)
- }
- } else {
- for i := 0; i < cfg.MediatorRaterReconnects; i++ {
- client, err = rpc.Dial("tcp", cfg.MediatorRater)
- if err == nil { //Connected so no need to reiterate
- break
- }
- time.Sleep(time.Duration(i/2) * time.Second)
+
+ for i := 0; i < cfg.MediatorRaterReconnects; i++ {
+ client, err = rpc.Dial("tcp", cfg.MediatorRater)
+ if err == nil { //Connected so no need to reiterate
+ break
}
+ time.Sleep(time.Duration(i/2) * time.Second)
}
if err != nil {
engine.Logger.Crit(fmt.Sprintf("Could not connect to engine: %v", err))
@@ -163,24 +122,13 @@ func startSessionManager(responder *engine.Responder, loggerDb engine.LogStorage
} else {
var client *rpc.Client
var err error
- if cfg.RPCEncoding == JSON {
- // We attempt to reconnect more times
- for i := 0; i < cfg.SMRaterReconnects; i++ {
- client, err = jsonrpc.Dial("tcp", cfg.SMRater)
- if err == nil { //Connected so no need to reiterate
- break
- }
- time.Sleep(time.Duration(i/2) * time.Second)
- }
- } else {
- for i := 0; i < cfg.SMRaterReconnects; i++ {
- client, err = rpc.Dial("tcp", cfg.SMRater)
- if err == nil { //Connected so no need to reiterate
- break
- }
- time.Sleep(time.Duration(i/2) * time.Second)
- }
+ for i := 0; i < cfg.SMRaterReconnects; i++ {
+ client, err = rpc.Dial("tcp", cfg.SMRater)
+ if err == nil { //Connected so no need to reiterate
+ break
+ }
+ time.Sleep(time.Duration(i/2) * time.Second)
}
if err != nil {
engine.Logger.Crit(fmt.Sprintf("Could not connect to engine: %v", err))
@@ -217,7 +165,7 @@ func startCDRS(responder *engine.Responder, cdrDb engine.CdrStorage) {
}
}
cs := cdrs.New(cdrDb, medi, cfg)
- cs.StartCapturingCDRs()
+ cs.RegisterHanlersToServer(server)
exitChan <- true
}
@@ -230,35 +178,7 @@ func startHistoryScribe() {
exitChan <- true
return
}
- }
-
- if cfg.HistoryServerEnabled {
- if cfg.HistoryListen != INTERNAL {
- rpc.RegisterName("Scribe", scribeServer)
- var serveFunc func(io.ReadWriteCloser)
- if cfg.RPCEncoding == JSON {
- serveFunc = jsonrpc.ServeConn
- } else {
- serveFunc = rpc.ServeConn
- }
- l, err := net.Listen("tcp", cfg.HistoryListen)
- if err != nil {
- engine.Logger.Crit(fmt.Sprintf(" Could not listen to %v: %v", cfg.HistoryListen, err))
- exitChan <- true
- return
- }
- defer l.Close()
- for {
- conn, err := l.Accept()
- if err != nil {
- engine.Logger.Err(fmt.Sprintf(" Accept error: %v", conn))
- continue
- }
-
- engine.Logger.Info(fmt.Sprintf(" New incoming connection: %v", conn.RemoteAddr()))
- go serveFunc(conn)
- }
- }
+ server.RpcRegisterName("Scribe", scribeServer)
}
var scribeAgent history.Scribe
@@ -266,7 +186,7 @@ func startHistoryScribe() {
if cfg.HistoryAgentEnabled {
if cfg.HistoryServer != INTERNAL { // Connect in iteration since there are chances of concurrency here
for i := 0; i < 3; i++ { //ToDo: Make it globally configurable
- if scribeAgent, err = history.NewProxyScribe(cfg.HistoryServer, cfg.RPCEncoding); err == nil {
+ if scribeAgent, err = history.NewProxyScribe(cfg.HistoryServer); err == nil {
break //Connected so no need to reiterate
} else if i == 2 && err != nil {
engine.Logger.Crit(err.Error())
@@ -289,11 +209,11 @@ func startHistoryScribe() {
}
func checkConfigSanity() error {
- if cfg.SMEnabled && cfg.RaterEnabled && cfg.RaterBalancer != DISABLED {
+ if cfg.SMEnabled && cfg.RaterEnabled && cfg.RaterBalancer != "" {
engine.Logger.Crit("The session manager must not be enabled on a worker engine (change [engine]/balancer to disabled)!")
return errors.New("SessionManager on Worker")
}
- if cfg.BalancerEnabled && cfg.RaterEnabled && cfg.RaterBalancer != DISABLED {
+ if cfg.BalancerEnabled && cfg.RaterEnabled && cfg.RaterBalancer != "" {
engine.Logger.Crit("The balancer is enabled so it cannot connect to another balancer (change rater/balancer to disabled)!")
return errors.New("Improperly configured balancer")
}
@@ -410,23 +330,26 @@ func main() {
}
stopHandled := false
// Async starts here
- if cfg.RaterEnabled && cfg.RaterBalancer != DISABLED && !cfg.BalancerEnabled {
- go registerToBalancer()
- go stopRaterSignalHandler()
+ if cfg.RaterEnabled && cfg.RaterBalancer != "" && !cfg.BalancerEnabled {
+ registerToBalancer()
+ stopRaterSignalHandler()
stopHandled = true
}
responder := &engine.Responder{ExitChan: exitChan}
apier := &apier.ApierV1{StorDb: loadDb, RatingDb: ratingDb, AccountDb: accountDb, CdrDb: cdrDb, Config: cfg}
- if cfg.RaterEnabled && !cfg.BalancerEnabled && cfg.RaterListen != INTERNAL {
- engine.Logger.Info(fmt.Sprintf("Starting CGRateS Rater on %s.", cfg.RaterListen))
- go listenToRPCRequests(responder, apier, cfg.RaterListen, cfg.RPCEncoding)
+
+ if cfg.RaterEnabled && !cfg.BalancerEnabled && cfg.RaterBalancer != INTERNAL {
+ engine.Logger.Info("Starting CGRateS Rater")
+ server.RpcRegister(responder)
+ server.RpcRegister(apier)
}
if cfg.BalancerEnabled {
- engine.Logger.Info(fmt.Sprintf("Starting CGRateS Balancer on %s.", cfg.BalancerListen))
+ engine.Logger.Info("Starting CGRateS Balancer")
go stopBalancerSignalHandler()
stopHandled = true
responder.Bal = bal
- go listenToRPCRequests(responder, apier, cfg.BalancerListen, cfg.RPCEncoding)
+ server.RpcRegister(responder)
+ server.RpcRegister(apier)
if cfg.RaterEnabled {
engine.Logger.Info("Starting internal engine.")
bal.AddClient("local", new(engine.ResponderWorker))
@@ -435,12 +358,11 @@ func main() {
if !stopHandled {
go generalSignalHandler()
}
-
if cfg.SchedulerEnabled {
engine.Logger.Info("Starting CGRateS Scheduler.")
go func() {
sched := scheduler.NewScheduler()
- go reloadSchedulerSingnalHandler(sched, accountDb)
+ reloadSchedulerSingnalHandler(sched, accountDb)
apier.Sched = sched
sched.LoadActionTimings(accountDb)
sched.Loop()
@@ -449,29 +371,32 @@ func main() {
if cfg.SMEnabled {
engine.Logger.Info("Starting CGRateS SessionManager.")
- go startSessionManager(responder, logDb)
+ startSessionManager(responder, logDb)
// close all sessions on shutdown
- go shutdownSessionmanagerSingnalHandler()
+ shutdownSessionmanagerSingnalHandler()
}
if cfg.MediatorEnabled {
engine.Logger.Info("Starting CGRateS Mediator.")
- go startMediator(responder, logDb, cdrDb)
+ startMediator(responder, logDb, cdrDb)
}
if cfg.CDRSEnabled {
engine.Logger.Info("Starting CGRateS CDR Server.")
- go startCDRS(responder, cdrDb)
+ startCDRS(responder, cdrDb)
}
if cfg.HistoryServerEnabled || cfg.HistoryAgentEnabled {
engine.Logger.Info("Starting History Service.")
- go startHistoryScribe()
+ startHistoryScribe()
}
if cfg.CdrcEnabled {
engine.Logger.Info("Starting CGRateS CDR Client.")
- go startCdrc()
+ startCdrc()
}
+ go server.ServeGOB(cfg.RPCGOBListen)
+ go server.ServeJSON(cfg.RPCJSONListen)
+ go server.ServeHTTP(cfg.HTTPListen)
<-exitChan
if *pidFile != "" {
if err := os.Remove(*pidFile); err != nil {
diff --git a/cmd/cgr-engine/registration.go b/cmd/cgr-engine/registration.go
index b7b4ce941..d684214da 100644
--- a/cmd/cgr-engine/registration.go
+++ b/cmd/cgr-engine/registration.go
@@ -76,7 +76,7 @@ func unregisterFromBalancer() {
}
var reply int
engine.Logger.Info(fmt.Sprintf("Unregistering from balancer %s", cfg.RaterBalancer))
- client.Call("Responder.UnRegisterRater", cfg.RaterListen, &reply)
+ client.Call("Responder.UnRegisterRater", cfg.RPCGOBListen, &reply)
if err := client.Close(); err != nil {
engine.Logger.Crit("Could not close balancer unregistration!")
exitChan <- true
@@ -95,7 +95,7 @@ func registerToBalancer() {
}
var reply int
engine.Logger.Info(fmt.Sprintf("Registering to balancer %s", cfg.RaterBalancer))
- client.Call("Responder.RegisterRater", cfg.RaterListen, &reply)
+ client.Call("Responder.RegisterRater", cfg.RPCGOBListen, &reply)
if err := client.Close(); err != nil {
engine.Logger.Crit("Could not close balancer registration!")
exitChan <- true
diff --git a/cmd/cgr-loader/cgr-loader.go b/cmd/cgr-loader/cgr-loader.go
index 5b86626cb..179c0a339 100644
--- a/cmd/cgr-loader/cgr-loader.go
+++ b/cmd/cgr-loader/cgr-loader.go
@@ -24,7 +24,6 @@ import (
"fmt"
"log"
"net/rpc"
- "net/rpc/jsonrpc"
"path"
"github.com/cgrates/cgrates/config"
@@ -70,7 +69,6 @@ var (
toStorDb = flag.Bool("to_stordb", false, "Import the tariff plan from files to storDb")
historyServer = flag.String("history_server", cgrConfig.HistoryServer, "The history server address:port, empty to disable automaticautomatic history archiving")
raterAddress = flag.String("rater_address", cgrConfig.MediatorRater, "Rater service to contact for cache reloads, empty to disable automatic cache reloads")
- rpcEncoding = flag.String("rpc_encoding", cgrConfig.RPCEncoding, "The history server rpc encoding json|gob")
runId = flag.String("runid", "", "Uniquely identify an import/load, postpended to some automatic fields")
)
@@ -132,18 +130,18 @@ func main() {
log.Fatal(err, "\n\t", v.Message)
}
}
- loader = engine.NewFileCSVReader(ratingDb, accountDb, ',',
- path.Join(*dataPath, utils.DESTINATIONS_CSV),
- path.Join(*dataPath, utils.TIMINGS_CSV),
- path.Join(*dataPath, utils.RATES_CSV),
- path.Join(*dataPath, utils.DESTINATION_RATES_CSV),
- path.Join(*dataPath, utils.RATING_PLANS_CSV),
- path.Join(*dataPath, utils.RATING_PROFILES_CSV),
- path.Join(*dataPath, utils.ACTIONS_CSV),
- path.Join(*dataPath, utils.ACTION_TIMINGS_CSV),
- path.Join(*dataPath, utils.ACTION_TRIGGERS_CSV),
- path.Join(*dataPath, utils.ACCOUNT_ACTIONS_CSV))
- }
+ loader = engine.NewFileCSVReader(ratingDb, accountDb, ',',
+ path.Join(*dataPath, utils.DESTINATIONS_CSV),
+ path.Join(*dataPath, utils.TIMINGS_CSV),
+ path.Join(*dataPath, utils.RATES_CSV),
+ path.Join(*dataPath, utils.DESTINATION_RATES_CSV),
+ path.Join(*dataPath, utils.RATING_PLANS_CSV),
+ path.Join(*dataPath, utils.RATING_PROFILES_CSV),
+ path.Join(*dataPath, utils.ACTIONS_CSV),
+ path.Join(*dataPath, utils.ACTION_PLANS_CSV),
+ path.Join(*dataPath, utils.ACTION_TRIGGERS_CSV),
+ path.Join(*dataPath, utils.ACCOUNT_ACTIONS_CSV))
+ }
err = loader.LoadAll()
if err != nil {
log.Fatal(err)
@@ -155,7 +153,7 @@ func main() {
return
}
if *historyServer != "" { // Init scribeAgent so we can store the differences
- if scribeAgent, err := history.NewProxyScribe(*historyServer, *rpcEncoding); err != nil {
+ if scribeAgent, err := history.NewProxyScribe(*historyServer); err != nil {
log.Fatalf("Could not connect to history server, error: %s. Make sure you have properly configured it via -history_server flag.", err.Error())
return
} else {
@@ -167,11 +165,7 @@ func main() {
log.Print("WARNING: Rates history archiving is disabled!")
}
if *raterAddress != "" { // Init connection to rater so we can reload it's data
- if *rpcEncoding == config.JSON {
- rater, err = jsonrpc.Dial("tcp", *raterAddress)
- } else {
- rater, err = rpc.Dial("tcp", *raterAddress)
- }
+ rater, err = rpc.Dial("tcp", *raterAddress)
if err != nil {
log.Fatalf("Could not connect to rater: %s", err.Error())
return
diff --git a/cmd/cgr-tester/cgr-tester.go b/cmd/cgr-tester/cgr-tester.go
index 575163121..8eade503f 100644
--- a/cmd/cgr-tester/cgr-tester.go
+++ b/cmd/cgr-tester/cgr-tester.go
@@ -20,48 +20,47 @@ package main
import (
"flag"
+ "fmt"
"log"
+ "net/rpc"
"os"
"runtime"
"runtime/pprof"
"time"
- "fmt"
- "net/rpc"
- "net/rpc/jsonrpc"
- "github.com/cgrates/cgrates/engine"
+
"github.com/cgrates/cgrates/config"
+ "github.com/cgrates/cgrates/engine"
)
var (
- cgrConfig, _ = config.NewDefaultCGRConfig()
- cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
- memprofile = flag.String("memprofile", "", "write memory profile to this file")
- runs = flag.Int("runs", 10000, "stress cycle number")
- parallel = flag.Int("parallel", 0, "run n requests in parallel")
- ratingdb_type = flag.String("ratingdb_type", cgrConfig.RatingDBType, "The type of the RatingDb database ")
- ratingdb_host = flag.String("ratingdb_host", cgrConfig.RatingDBHost, "The RatingDb host to connect to.")
- ratingdb_port = flag.String("ratingdb_port", cgrConfig.RatingDBPort, "The RatingDb port to bind to.")
- ratingdb_name = flag.String("ratingdb_name", cgrConfig.RatingDBName, "The name/number of the RatingDb to connect to.")
- ratingdb_user = flag.String("ratingdb_user", cgrConfig.RatingDBUser, "The RatingDb user to sign in as.")
- ratingdb_pass = flag.String("ratingdb_passwd", cgrConfig.RatingDBPass, "The RatingDb user's password.")
- accountdb_type = flag.String("accountdb_type", cgrConfig.AccountDBType, "The type of the AccountingDb database ")
- accountdb_host = flag.String("accountdb_host", cgrConfig.AccountDBHost, "The AccountingDb host to connect to.")
- accountdb_port = flag.String("accountdb_port", cgrConfig.AccountDBPort, "The AccountingDb port to bind to.")
- accountdb_name = flag.String("accountdb_name", cgrConfig.AccountDBName, "The name/number of the AccountingDb to connect to.")
- accountdb_user = flag.String("accountdb_user", cgrConfig.AccountDBUser, "The AccountingDb user to sign in as.")
- accountdb_pass = flag.String("accountdb_passwd", cgrConfig.AccountDBPass, "The AccountingDb user's password.")
+ cgrConfig, _ = config.NewDefaultCGRConfig()
+ cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
+ memprofile = flag.String("memprofile", "", "write memory profile to this file")
+ runs = flag.Int("runs", 10000, "stress cycle number")
+ parallel = flag.Int("parallel", 0, "run n requests in parallel")
+ ratingdb_type = flag.String("ratingdb_type", cgrConfig.RatingDBType, "The type of the RatingDb database ")
+ ratingdb_host = flag.String("ratingdb_host", cgrConfig.RatingDBHost, "The RatingDb host to connect to.")
+ ratingdb_port = flag.String("ratingdb_port", cgrConfig.RatingDBPort, "The RatingDb port to bind to.")
+ ratingdb_name = flag.String("ratingdb_name", cgrConfig.RatingDBName, "The name/number of the RatingDb to connect to.")
+ ratingdb_user = flag.String("ratingdb_user", cgrConfig.RatingDBUser, "The RatingDb user to sign in as.")
+ ratingdb_pass = flag.String("ratingdb_passwd", cgrConfig.RatingDBPass, "The RatingDb user's password.")
+ accountdb_type = flag.String("accountdb_type", cgrConfig.AccountDBType, "The type of the AccountingDb database ")
+ accountdb_host = flag.String("accountdb_host", cgrConfig.AccountDBHost, "The AccountingDb host to connect to.")
+ accountdb_port = flag.String("accountdb_port", cgrConfig.AccountDBPort, "The AccountingDb port to bind to.")
+ accountdb_name = flag.String("accountdb_name", cgrConfig.AccountDBName, "The name/number of the AccountingDb to connect to.")
+ accountdb_user = flag.String("accountdb_user", cgrConfig.AccountDBUser, "The AccountingDb user to sign in as.")
+ accountdb_pass = flag.String("accountdb_passwd", cgrConfig.AccountDBPass, "The AccountingDb user's password.")
dbdata_encoding = flag.String("dbdata_encoding", cgrConfig.DBDataEncoding, "The encoding used to store object data in strings.")
- raterAddress = flag.String("rater_address", "", "Rater address for remote tests. Empty for internal rater.")
- rpcEncoding = flag.String("rpc_encoding", cgrConfig.RPCEncoding, "Rpc encoding to use when talking to remote rater ")
- tor = flag.String("tor", "call", "The type of record to use in queries.")
- tenant = flag.String("tenant", "call", "The type of record to use in queries.")
- subject = flag.String("subject", "1001", "The rating subject to use in queries.")
- destination = flag.String("destination", "+4986517174963", "The destination to use in queries.")
-
+ raterAddress = flag.String("rater_address", "", "Rater address for remote tests. Empty for internal rater.")
+ tor = flag.String("tor", "call", "The type of record to use in queries.")
+ tenant = flag.String("tenant", "call", "The type of record to use in queries.")
+ subject = flag.String("subject", "1001", "The rating subject to use in queries.")
+ destination = flag.String("destination", "+4986517174963", "The destination to use in queries.")
+
nilDuration = time.Duration(0)
)
-func durInternalRater( cd *engine.CallDescriptor) (time.Duration, error) {
+func durInternalRater(cd *engine.CallDescriptor) (time.Duration, error) {
ratingDb, err := engine.ConfigureRatingStorage(*ratingdb_type, *ratingdb_host, *ratingdb_port, *ratingdb_name, *ratingdb_user, *ratingdb_pass, *dbdata_encoding)
if err != nil {
return nilDuration, fmt.Errorf("Could not connect to rating database: %s", err.Error())
@@ -104,16 +103,9 @@ func durInternalRater( cd *engine.CallDescriptor) (time.Duration, error) {
return time.Since(start), nil
}
-
-func durRemoteRater( cd *engine.CallDescriptor) (time.Duration, error) {
+func durRemoteRater(cd *engine.CallDescriptor) (time.Duration, error) {
result := engine.CallCost{}
- var client *rpc.Client
- var err error
- if *rpcEncoding=="json" {
- client, err = jsonrpc.Dial("tcp", *raterAddress)
- } else {
- client, err = rpc.Dial("tcp", *raterAddress)
- }
+ client, err := rpc.Dial("tcp", *raterAddress)
if err != nil {
return nilDuration, fmt.Errorf("Could not connect to engine: ", err.Error())
}
@@ -144,9 +136,6 @@ func durRemoteRater( cd *engine.CallDescriptor) (time.Duration, error) {
log.Println(result)
return time.Since(start), nil
}
-
-
-
func main() {
flag.Parse()
diff --git a/config/config.go b/config/config.go
index 2db5edf22..acdb7fa0b 100644
--- a/config/config.go
+++ b/config/config.go
@@ -72,7 +72,9 @@ type CGRConfig struct {
StorDBUser string // The user to sign in as.
StorDBPass string // The user's password.
DBDataEncoding string // The encoding used to store object data in strings:
- RPCEncoding string // RPC encoding used on APIs: .
+ RPCJSONListen string // RPC JSON listening address
+ RPCGOBListen string // RPC GOB listening address
+ HTTPListen string // HTTP listening address
DefaultReqType string // Use this request type if not defined on top
DefaultTOR string // set default type of record
DefaultTenant string // set default tenant
@@ -81,65 +83,60 @@ type CGRConfig struct {
RoundingDecimals int // Number of decimals to round end prices at
RaterEnabled bool // start standalone server (no balancer)
RaterBalancer string // balancer address host:port
- RaterListen string // listening address host:port
BalancerEnabled bool
- BalancerListen string // Json RPC server address
SchedulerEnabled bool
- CDRSEnabled bool // Enable CDR Server service
- CDRSListen string // CDRS's listening interface: .
- CDRSExtraFields []string //Extra fields to store in CDRs
- CDRSMediator string // Address where to reach the Mediator. Empty for disabling mediation. <""|internal>
- CdreCdrFormat string // Format of the exported CDRs.
- CdreExtraFields []string // Extra fields list to add in exported CDRs
- CdreDir string // Path towards exported cdrs directory
- CdrcEnabled bool // Enable CDR client functionality
- CdrcCdrs string // Address where to reach CDR server
- CdrcCdrsMethod string // Mechanism to use when posting CDRs on server
- CdrcRunDelay time.Duration // Sleep interval between consecutive runs, if time unit missing, defaults to seconds, 0 to use automation via inotify
- CdrcCdrType string // CDR file format .
- CdrcCdrInDir string // Absolute path towards the directory where the CDRs are stored.
- CdrcCdrOutDir string // Absolute path towards the directory where processed CDRs will be moved.
- CdrcSourceId string // Tag identifying the source of the CDRs within CGRS database.
- CdrcAccIdField string // Accounting id field identifier. Use index number in case of .csv cdrs.
- CdrcReqTypeField string // Request type field identifier. Use index number in case of .csv cdrs.
- CdrcDirectionField string // Direction field identifier. Use index numbers in case of .csv cdrs.
- CdrcTenantField string // Tenant field identifier. Use index numbers in case of .csv cdrs.
- CdrcTorField string // Type of Record field identifier. Use index numbers in case of .csv cdrs.
- CdrcAccountField string // Account field identifier. Use index numbers in case of .csv cdrs.
- CdrcSubjectField string // Subject field identifier. Use index numbers in case of .csv CDRs.
- CdrcDestinationField string // Destination field identifier. Use index numbers in case of .csv cdrs.
- CdrcAnswerTimeField string // Answer time field identifier. Use index numbers in case of .csv cdrs.
- CdrcDurationField string // Duration field identifier. Use index numbers in case of .csv cdrs.
- CdrcExtraFields []string // Field identifiers of the fields to add in extra fields section, special format in case of .csv "field1:index1,field2:index2"
+ CDRSEnabled bool // Enable CDR Server service
+ CDRSExtraFields []string //Extra fields to store in CDRs
+ CDRSMediator string // Address where to reach the Mediator. Empty for disabling mediation. <""|internal>
+ CdreCdrFormat string // Format of the exported CDRs.
+ CdreExtraFields []string // Extra fields list to add in exported CDRs
+ CdreDir string // Path towards exported cdrs directory
+ CdrcEnabled bool // Enable CDR client functionality
+ CdrcCdrs string // Address where to reach CDR server
+ CdrcCdrsMethod string // Mechanism to use when posting CDRs on server
+ CdrcRunDelay time.Duration // Sleep interval between consecutive runs, if time unit missing, defaults to seconds, 0 to use automation via inotify
+ CdrcCdrType string // CDR file format .
+ CdrcCdrInDir string // Absolute path towards the directory where the CDRs are stored.
+ CdrcCdrOutDir string // Absolute path towards the directory where processed CDRs will be moved.
+ CdrcSourceId string // Tag identifying the source of the CDRs within CGRS database.
+ CdrcAccIdField string // Accounting id field identifier. Use index number in case of .csv cdrs.
+ CdrcReqTypeField string // Request type field identifier. Use index number in case of .csv cdrs.
+ CdrcDirectionField string // Direction field identifier. Use index numbers in case of .csv cdrs.
+ CdrcTenantField string // Tenant field identifier. Use index numbers in case of .csv cdrs.
+ CdrcTorField string // Type of Record field identifier. Use index numbers in case of .csv cdrs.
+ CdrcAccountField string // Account field identifier. Use index numbers in case of .csv cdrs.
+ CdrcSubjectField string // Subject field identifier. Use index numbers in case of .csv CDRs.
+ CdrcDestinationField string // Destination field identifier. Use index numbers in case of .csv cdrs.
+ CdrcAnswerTimeField string // Answer time field identifier. Use index numbers in case of .csv cdrs.
+ CdrcDurationField string // Duration field identifier. Use index numbers in case of .csv cdrs.
+ CdrcExtraFields []string // Field identifiers of the fields to add in extra fields section, special format in case of .csv "field1:index1,field2:index2"
SMEnabled bool
SMSwitchType string
- SMRater string // address where to access rater. Can be internal, direct rater address or the address of a balancer
- SMRaterReconnects int // Number of reconnect attempts to rater
- SMDebitInterval int // the period to be debited in advanced during a call (in seconds)
+ SMRater string // address where to access rater. Can be internal, direct rater address or the address of a balancer
+ SMRaterReconnects int // Number of reconnect attempts to rater
+ SMDebitInterval int // the period to be debited in advanced during a call (in seconds)
SMMaxCallDuration time.Duration // The maximum duration of a call
- MediatorEnabled bool // Starts Mediator service: .
- MediatorListen string // Mediator's listening interface: .
- MediatorRater string // Address where to reach the Rater:
- MediatorRaterReconnects int // Number of reconnects to rater before giving up.
- MediatorRunIds []string // Identifiers for each mediation run on CDRs
- MediatorReqTypeFields []string // Name of request type fields to be used during mediation. Use index number in case of .csv cdrs.
- MediatorDirectionFields []string // Name of direction fields to be used during mediation. Use index numbers in case of .csv cdrs.
- MediatorTenantFields []string // Name of tenant fields to be used during mediation. Use index numbers in case of .csv cdrs.
- MediatorTORFields []string // Name of tor fields to be used during mediation. Use index numbers in case of .csv cdrs.
- MediatorAccountFields []string // Name of account fields to be used during mediation. Use index numbers in case of .csv cdrs.
- MediatorSubjectFields []string // Name of subject fields to be used during mediation. Use index numbers in case of .csv cdrs.
- MediatorDestFields []string // Name of destination fields to be used during mediation. Use index numbers in case of .csv cdrs.
- MediatorAnswerTimeFields []string // Name of time_start fields to be used during mediation. Use index numbers in case of .csv cdrs.
- MediatorDurationFields []string // Name of duration fields to be used during mediation. Use index numbers in case of .csv cdrs.
- FreeswitchServer string // freeswitch address host:port
- FreeswitchPass string // FS socket password
- FreeswitchReconnects int // number of times to attempt reconnect after connect fails
- HistoryAgentEnabled bool // Starts History as an agent: .
- HistoryServer string // Address where to reach the master history server:
- HistoryServerEnabled bool // Starts History as server: .
- HistoryListen string // History server listening interface:
- HistoryDir string // Location on disk where to store history files.
- HistorySaveInterval time.Duration // The timout duration between history writes
+ MediatorEnabled bool // Starts Mediator service: .
+ MediatorRater string // Address where to reach the Rater:
+ MediatorRaterReconnects int // Number of reconnects to rater before giving up.
+ MediatorRunIds []string // Identifiers for each mediation run on CDRs
+ MediatorReqTypeFields []string // Name of request type fields to be used during mediation. Use index number in case of .csv cdrs.
+ MediatorDirectionFields []string // Name of direction fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ MediatorTenantFields []string // Name of tenant fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ MediatorTORFields []string // Name of tor fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ MediatorAccountFields []string // Name of account fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ MediatorSubjectFields []string // Name of subject fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ MediatorDestFields []string // Name of destination fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ MediatorAnswerTimeFields []string // Name of time_start fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ MediatorDurationFields []string // Name of duration fields to be used during mediation. Use index numbers in case of .csv cdrs.
+ FreeswitchServer string // freeswitch address host:port
+ FreeswitchPass string // FS socket password
+ FreeswitchReconnects int // number of times to attempt reconnect after connect fails
+ HistoryAgentEnabled bool // Starts History as an agent: .
+ HistoryServer string // Address where to reach the master history server:
+ HistoryServerEnabled bool // Starts History as server: .
+ HistoryDir string // Location on disk where to store history files.
+ HistorySaveInterval time.Duration // The timout duration between history writes
}
func (self *CGRConfig) setDefaults() error {
@@ -162,7 +159,9 @@ func (self *CGRConfig) setDefaults() error {
self.StorDBUser = "cgrates"
self.StorDBPass = "CGRateS.org"
self.DBDataEncoding = utils.MSGPACK
- self.RPCEncoding = JSON
+ self.RPCJSONListen = "127.0.0.1:2012"
+ self.RPCGOBListen = "127.0.0.1:2013"
+ self.HTTPListen = "127.0.0.1:2080"
self.DefaultReqType = utils.RATED
self.DefaultTOR = "call"
self.DefaultTenant = "cgrates.org"
@@ -170,20 +169,17 @@ func (self *CGRConfig) setDefaults() error {
self.RoundingMethod = utils.ROUNDING_MIDDLE
self.RoundingDecimals = 4
self.RaterEnabled = false
- self.RaterBalancer = DISABLED
- self.RaterListen = "127.0.0.1:2012"
+ self.RaterBalancer = ""
self.BalancerEnabled = false
- self.BalancerListen = "127.0.0.1:2013"
self.SchedulerEnabled = false
self.CDRSEnabled = false
- self.CDRSListen = "127.0.0.1:2022"
self.CDRSExtraFields = []string{}
self.CDRSMediator = ""
self.CdreCdrFormat = "csv"
self.CdreExtraFields = []string{}
self.CdreDir = "/var/log/cgrates/cdr/cdrexport/csv"
self.CdrcEnabled = false
- self.CdrcCdrs = "127.0.0.1:2022"
+ self.CdrcCdrs = "127.0.0.1:2080"
self.CdrcCdrsMethod = "http_cgr"
self.CdrcRunDelay = time.Duration(0)
self.CdrcCdrType = "csv"
@@ -202,8 +198,7 @@ func (self *CGRConfig) setDefaults() error {
self.CdrcDurationField = "9"
self.CdrcExtraFields = []string{}
self.MediatorEnabled = false
- self.MediatorListen = "127.0.0.1:2032"
- self.MediatorRater = "127.0.0.1:2012"
+ self.MediatorRater = "127.0.0.1:2013"
self.MediatorRaterReconnects = 3
self.MediatorRunIds = []string{}
self.MediatorSubjectFields = []string{}
@@ -217,7 +212,7 @@ func (self *CGRConfig) setDefaults() error {
self.MediatorDurationFields = []string{}
self.SMEnabled = false
self.SMSwitchType = FS
- self.SMRater = "127.0.0.1:2012"
+ self.SMRater = "127.0.0.1:2013"
self.SMRaterReconnects = 3
self.SMDebitInterval = 10
self.SMMaxCallDuration = time.Duration(3) * time.Hour
@@ -227,7 +222,6 @@ func (self *CGRConfig) setDefaults() error {
self.HistoryAgentEnabled = false
self.HistoryServerEnabled = false
self.HistoryServer = "127.0.0.1:2013"
- self.HistoryListen = "127.0.0.1:2013"
self.HistoryDir = "/var/log/cgrates/history"
self.HistorySaveInterval = time.Duration(1) * time.Second
return nil
@@ -318,8 +312,14 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
if hasOpt = c.HasOption("global", "dbdata_encoding"); hasOpt {
cfg.DBDataEncoding, _ = c.GetString("global", "dbdata_encoding")
}
- if hasOpt = c.HasOption("global", "rpc_encoding"); hasOpt {
- cfg.RPCEncoding, _ = c.GetString("global", "rpc_encoding")
+ if hasOpt = c.HasOption("global", "rpc_json_listen"); hasOpt {
+ cfg.RPCJSONListen, _ = c.GetString("global", "rpc_json_listen")
+ }
+ if hasOpt = c.HasOption("global", "rpc_gob_listen"); hasOpt {
+ cfg.RPCGOBListen, _ = c.GetString("global", "rpc_gob_listen")
+ }
+ if hasOpt = c.HasOption("global", "http_listen"); hasOpt {
+ cfg.HTTPListen, _ = c.GetString("global", "http_listen")
}
if hasOpt = c.HasOption("global", "default_reqtype"); hasOpt {
cfg.DefaultReqType, _ = c.GetString("global", "default_reqtype")
@@ -345,24 +345,15 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
if hasOpt = c.HasOption("rater", "balancer"); hasOpt {
cfg.RaterBalancer, _ = c.GetString("rater", "balancer")
}
- if hasOpt = c.HasOption("rater", "listen"); hasOpt {
- cfg.RaterListen, _ = c.GetString("rater", "listen")
- }
if hasOpt = c.HasOption("balancer", "enabled"); hasOpt {
cfg.BalancerEnabled, _ = c.GetBool("balancer", "enabled")
}
- if hasOpt = c.HasOption("balancer", "listen"); hasOpt {
- cfg.BalancerListen, _ = c.GetString("balancer", "listen")
- }
if hasOpt = c.HasOption("scheduler", "enabled"); hasOpt {
cfg.SchedulerEnabled, _ = c.GetBool("scheduler", "enabled")
}
if hasOpt = c.HasOption("cdrs", "enabled"); hasOpt {
cfg.CDRSEnabled, _ = c.GetBool("cdrs", "enabled")
}
- if hasOpt = c.HasOption("cdrs", "listen"); hasOpt {
- cfg.CDRSListen, _ = c.GetString("cdrs", "listen")
- }
if hasOpt = c.HasOption("cdrs", "extra_fields"); hasOpt {
if cfg.CDRSExtraFields, errParse = ConfigSlice(c, "cdrs", "extra_fields"); errParse != nil {
return nil, errParse
@@ -392,7 +383,7 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
cfg.CdrcCdrsMethod, _ = c.GetString("cdrc", "cdrs_method")
}
if hasOpt = c.HasOption("cdrc", "run_delay"); hasOpt {
- durStr,_ := c.GetString("cdrc", "run_delay")
+ durStr, _ := c.GetString("cdrc", "run_delay")
if cfg.CdrcRunDelay, errParse = utils.ParseDurationWithSecs(durStr); errParse != nil {
return nil, errParse
}
@@ -447,9 +438,6 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
if hasOpt = c.HasOption("mediator", "enabled"); hasOpt {
cfg.MediatorEnabled, _ = c.GetBool("mediator", "enabled")
}
- if hasOpt = c.HasOption("mediator", "listen"); hasOpt {
- cfg.MediatorListen, _ = c.GetString("mediator", "listen")
- }
if hasOpt = c.HasOption("mediator", "rater"); hasOpt {
cfg.MediatorRater, _ = c.GetString("mediator", "rater")
}
@@ -522,7 +510,7 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
cfg.SMDebitInterval, _ = c.GetInt("session_manager", "debit_interval")
}
if hasOpt = c.HasOption("session_manager", "max_call_duration"); hasOpt {
- maxCallDurStr,_ := c.GetString("session_manager", "max_call_duration")
+ maxCallDurStr, _ := c.GetString("session_manager", "max_call_duration")
if cfg.SMMaxCallDuration, errParse = utils.ParseDurationWithSecs(maxCallDurStr); errParse != nil {
return nil, errParse
}
@@ -545,14 +533,11 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
if hasOpt = c.HasOption("history_server", "enabled"); hasOpt {
cfg.HistoryServerEnabled, _ = c.GetBool("history_server", "enabled")
}
- if hasOpt = c.HasOption("history_server", "listen"); hasOpt {
- cfg.HistoryListen, _ = c.GetString("history_server", "listen")
- }
if hasOpt = c.HasOption("history_server", "history_dir"); hasOpt {
cfg.HistoryDir, _ = c.GetString("history_server", "history_dir")
}
if hasOpt = c.HasOption("history_server", "save_interval"); hasOpt {
- saveIntvlStr,_ := c.GetString("history_server", "save_interval")
+ saveIntvlStr, _ := c.GetString("history_server", "save_interval")
if cfg.HistorySaveInterval, errParse = utils.ParseDurationWithSecs(saveIntvlStr); errParse != nil {
return nil, errParse
}
diff --git a/config/config_test.go b/config/config_test.go
index 0e43924d8..7b40d8603 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -28,8 +28,7 @@ import (
)
func TestConfigSharing(t *testing.T) {
- cfg,_ := NewDefaultCGRConfig()
- cfg.RPCEncoding = utils.MSGPACK
+ cfg, _ := NewDefaultCGRConfig()
SetCgrConfig(cfg)
cfgReturn := CgrConfig()
if !reflect.DeepEqual(cfgReturn, cfg) {
@@ -65,7 +64,9 @@ func TestDefaults(t *testing.T) {
eCfg.StorDBUser = "cgrates"
eCfg.StorDBPass = "CGRateS.org"
eCfg.DBDataEncoding = utils.MSGPACK
- eCfg.RPCEncoding = JSON
+ eCfg.RPCJSONListen = "127.0.0.1:2012"
+ eCfg.RPCGOBListen = "127.0.0.1:2013"
+ eCfg.HTTPListen = "127.0.0.1:2080"
eCfg.DefaultReqType = utils.RATED
eCfg.DefaultTOR = "call"
eCfg.DefaultTenant = "cgrates.org"
@@ -73,20 +74,17 @@ func TestDefaults(t *testing.T) {
eCfg.RoundingMethod = utils.ROUNDING_MIDDLE
eCfg.RoundingDecimals = 4
eCfg.RaterEnabled = false
- eCfg.RaterBalancer = DISABLED
- eCfg.RaterListen = "127.0.0.1:2012"
+ eCfg.RaterBalancer = ""
eCfg.BalancerEnabled = false
- eCfg.BalancerListen = "127.0.0.1:2013"
eCfg.SchedulerEnabled = false
eCfg.CDRSEnabled = false
- eCfg.CDRSListen = "127.0.0.1:2022"
eCfg.CDRSExtraFields = []string{}
eCfg.CDRSMediator = ""
eCfg.CdreCdrFormat = "csv"
eCfg.CdreExtraFields = []string{}
eCfg.CdreDir = "/var/log/cgrates/cdr/cdrexport/csv"
eCfg.CdrcEnabled = false
- eCfg.CdrcCdrs = "127.0.0.1:2022"
+ eCfg.CdrcCdrs = "127.0.0.1:2080"
eCfg.CdrcCdrsMethod = "http_cgr"
eCfg.CdrcRunDelay = time.Duration(0)
eCfg.CdrcCdrType = "csv"
@@ -105,8 +103,7 @@ func TestDefaults(t *testing.T) {
eCfg.CdrcDurationField = "9"
eCfg.CdrcExtraFields = []string{}
eCfg.MediatorEnabled = false
- eCfg.MediatorListen = "127.0.0.1:2032"
- eCfg.MediatorRater = "127.0.0.1:2012"
+ eCfg.MediatorRater = "127.0.0.1:2013"
eCfg.MediatorRaterReconnects = 3
eCfg.MediatorRunIds = []string{}
eCfg.MediatorSubjectFields = []string{}
@@ -120,7 +117,7 @@ func TestDefaults(t *testing.T) {
eCfg.MediatorDurationFields = []string{}
eCfg.SMEnabled = false
eCfg.SMSwitchType = FS
- eCfg.SMRater = "127.0.0.1:2012"
+ eCfg.SMRater = "127.0.0.1:2013"
eCfg.SMRaterReconnects = 3
eCfg.SMDebitInterval = 10
eCfg.SMMaxCallDuration = time.Duration(3) * time.Hour
@@ -130,9 +127,8 @@ func TestDefaults(t *testing.T) {
eCfg.HistoryAgentEnabled = false
eCfg.HistoryServer = "127.0.0.1:2013"
eCfg.HistoryServerEnabled = false
- eCfg.HistoryListen = "127.0.0.1:2013"
eCfg.HistoryDir = "/var/log/cgrates/history"
- eCfg.HistorySaveInterval = time.Duration(1)*time.Second
+ eCfg.HistorySaveInterval = time.Duration(1) * time.Second
if !reflect.DeepEqual(cfg, eCfg) {
t.Log(eCfg)
t.Log(cfg)
@@ -141,7 +137,7 @@ func TestDefaults(t *testing.T) {
}
// Make sure defaults did not change
-func TestDefaultsSanity(t *testing.T) {
+/*func TestDefaultsSanity(t *testing.T) {
cfg := &CGRConfig{}
errSet := cfg.setDefaults()
if errSet != nil {
@@ -157,7 +153,7 @@ func TestDefaultsSanity(t *testing.T) {
(cfg.CDRSListen != INTERNAL && cfg.CDRSListen == cfg.MediatorListen) {
t.Error("Listen defaults on the same port!")
}
-}
+}*/
// Load config from file and make sure we have all set
func TestConfigFromFile(t *testing.T) {
@@ -188,7 +184,9 @@ func TestConfigFromFile(t *testing.T) {
eCfg.StorDBUser = "test"
eCfg.StorDBPass = "test"
eCfg.DBDataEncoding = "test"
- eCfg.RPCEncoding = "test"
+ eCfg.RPCJSONListen = "test"
+ eCfg.RPCGOBListen = "test"
+ eCfg.HTTPListen = "test"
eCfg.DefaultReqType = "test"
eCfg.DefaultTOR = "test"
eCfg.DefaultTenant = "test"
@@ -197,12 +195,9 @@ func TestConfigFromFile(t *testing.T) {
eCfg.RoundingDecimals = 99
eCfg.RaterEnabled = true
eCfg.RaterBalancer = "test"
- eCfg.RaterListen = "test"
eCfg.BalancerEnabled = true
- eCfg.BalancerListen = "test"
eCfg.SchedulerEnabled = true
eCfg.CDRSEnabled = true
- eCfg.CDRSListen = "test"
eCfg.CDRSExtraFields = []string{"test"}
eCfg.CDRSMediator = "test"
eCfg.CdreCdrFormat = "test"
@@ -211,7 +206,7 @@ func TestConfigFromFile(t *testing.T) {
eCfg.CdrcEnabled = true
eCfg.CdrcCdrs = "test"
eCfg.CdrcCdrsMethod = "test"
- eCfg.CdrcRunDelay = time.Duration(99)*time.Second
+ eCfg.CdrcRunDelay = time.Duration(99) * time.Second
eCfg.CdrcCdrType = "test"
eCfg.CdrcCdrInDir = "test"
eCfg.CdrcCdrOutDir = "test"
@@ -228,7 +223,6 @@ func TestConfigFromFile(t *testing.T) {
eCfg.CdrcDurationField = "test"
eCfg.CdrcExtraFields = []string{"test"}
eCfg.MediatorEnabled = true
- eCfg.MediatorListen = "test"
eCfg.MediatorRater = "test"
eCfg.MediatorRaterReconnects = 99
eCfg.MediatorRunIds = []string{"test"}
@@ -246,16 +240,15 @@ func TestConfigFromFile(t *testing.T) {
eCfg.SMRater = "test"
eCfg.SMRaterReconnects = 99
eCfg.SMDebitInterval = 99
- eCfg.SMMaxCallDuration = time.Duration(99)*time.Second
+ eCfg.SMMaxCallDuration = time.Duration(99) * time.Second
eCfg.FreeswitchServer = "test"
eCfg.FreeswitchPass = "test"
eCfg.FreeswitchReconnects = 99
eCfg.HistoryAgentEnabled = true
eCfg.HistoryServer = "test"
eCfg.HistoryServerEnabled = true
- eCfg.HistoryListen = "test"
eCfg.HistoryDir = "test"
- eCfg.HistorySaveInterval = time.Duration(99)*time.Second
+ eCfg.HistorySaveInterval = time.Duration(99) * time.Second
if !reflect.DeepEqual(cfg, eCfg) {
t.Log(eCfg)
t.Log(cfg)
diff --git a/config/test_data.txt b/config/test_data.txt
index 0b820a81c..91db7858c 100644
--- a/config/test_data.txt
+++ b/config/test_data.txt
@@ -21,7 +21,9 @@ stordb_name = test # The name of the log database to connect to.
stordb_user = test # Username to use when connecting to logdb.
stordb_passwd = test # Password to use when connecting to logdb.
dbdata_encoding = test # The encoding used to store object data in strings:
-rpc_encoding = test # RPC encoding used on APIs: .
+rpc_json_listen = test # RPC JSON listening address
+rpc_gob_listen = test # RPC GOB listening address
+http_listen = test # HTTP listening address
default_reqtype = test # Default request type to consider when missing from requests: <""|prepaid|postpaid|pseudoprepaid|rated>.
default_tor = test # Default Type of Record to consider when missing from requests.
default_tenant = test # Default Tenant to consider when missing from requests.
@@ -32,19 +34,16 @@ rounding_decimals = 99 # Number of decimals to round floats/costs at
[balancer]
enabled = true # Start Balancer service: .
-listen = test # Balancer listen interface: .
[rater]
enabled = true # Enable Rater service: .
balancer = test # Register to Balancer as worker: .
-listen = test # Rater's listening interface: .
[scheduler]
enabled = true # Starts Scheduler service: .
[cdrs]
enabled = true # Start the CDR Server service: .
-listen=test # CDRS's listening interface: .
extra_fields = test # Extra fields to store in CDRs
mediator = test # Address where to reach the Mediator. Empty for disabling mediation. <""|internal>
@@ -76,7 +75,6 @@ extra_fields = test # Field identifiers of the fields to add in extra fields s
[mediator]
enabled = true # Starts Mediator service: .
-listen=test # Mediator's listening interface: .
rater = test # Address where to reach the Rater:
rater_reconnects = 99 # Number of reconnects to rater before giving up.
run_ids = test # Identifiers for each mediation run on CDRs
@@ -105,7 +103,6 @@ reconnects = 99 # Number of attempts on connect failure.
[history_server]
enabled = true # Starts History service: .
-listen = test # Listening addres for history server:
history_dir = test # Location on disk where to store history files.
save_interval = 99 # Timeout duration between saves
diff --git a/console/add_account.go b/console/add_account.go
index ade30f214..b38642b65 100644
--- a/console/add_account.go
+++ b/console/add_account.go
@@ -56,7 +56,7 @@ func (self *CmdAddAccount) FromArgs(args []string) error {
self.rpcParams.Tenant = args[2]
self.rpcParams.Account = args[3]
self.rpcParams.Type = args[4]
- self.rpcParams.ActionTimingsId = args[5]
+ self.rpcParams.ActionPlanId = args[5]
if len(args) > 6 {
self.rpcParams.Direction = args[6]
}
diff --git a/data/conf/cgrates.cfg b/data/conf/cgrates.cfg
index 1ba1e1a2c..75646af42 100644
--- a/data/conf/cgrates.cfg
+++ b/data/conf/cgrates.cfg
@@ -24,7 +24,9 @@
# stordb_user = cgrates # Username to use when connecting to stordb.
# stordb_passwd = CGRateS.org # Password to use when connecting to stordb.
# dbdata_encoding = msgpack # The encoding used to store object data in strings:
-# rpc_encoding = json # RPC encoding used on APIs: .
+# rpc_json_listen = "127.0.0.1:2012" # RPC JSON listening address
+# rpc_gob_listen = "127.0.0.1:2013" # RPC GOB listening address
+# http_listen = "127.0.0.1:2080" # HTTP listening address
# default_reqtype = rated # Default request type to consider when missing from requests: <""|prepaid|postpaid|pseudoprepaid|rated>.
# default_tor = call # Default Type of Record to consider when missing from requests.
# default_tenant = cgrates.org # Default Tenant to consider when missing from requests.
@@ -34,19 +36,16 @@
[balancer]
# enabled = false # Start Balancer service: .
-# listen = 127.0.0.1:2012 # Balancer listen interface: <""|x.y.z.y:1234>.
[rater]
# enabled = false # Enable RaterCDRSExportPath service: .
-# balancer = disabled # Register to Balancer as worker: .
-# listen = 127.0.0.1:2012 # Rater's listening interface: .
+# balancer = # Register to Balancer as worker: <""|127.0.0.1:2013>.
[scheduler]
# enabled = false # Starts Scheduler service: .
[cdrs]
# enabled = false # Start the CDR Server service: .
-# listen=127.0.0.1:2022 # CDRS's listening interface: .
# extra_fields = # Extra fields to store in CDRs
# mediator = # Address where to reach the Mediator. Empty for disabling mediation. <""|internal>
@@ -57,7 +56,7 @@
[cdrc]
# enabled = false # Enable CDR client functionality
-# cdrs = 127.0.0.1:2022 # Address where to reach CDR server
+# cdrs = 127.0.0.1:2080 # Address where to reach CDR server
# cdrs_method = http_cgr # Mechanism to use when posting CDRs on server
# run_delay = 0 # Sleep interval in seconds between consecutive runs, 0 to use automation via inotify
# cdr_type = csv # CDR file format .
@@ -78,8 +77,7 @@
[mediator]
# enabled = false # Starts Mediator service: .
-# listen=internal # Mediator's listening interface: .
-# rater = 127.0.0.1:2012 # Address where to reach the Rater:
+# rater = 127.0.0.1:2013 # Address where to reach the Rater:
# rater_reconnects = 3 # Number of reconnects to rater before giving up.
# run_ids = # Identifiers of each extra mediation to run on CDRs
# reqtype_fields = # Name of request type fields to be used during extra mediation. Use index number in case of .csv cdrs.
@@ -95,7 +93,7 @@
[session_manager]
# enabled = false # Starts SessionManager service: .
# switch_type = freeswitch # Defines the type of switch behind: .
-# rater = 127.0.0.1:2012 # Address where to reach the Rater.
+# rater = 127.0.0.1:2013 # Address where to reach the Rater.
# rater_reconnects = 3 # Number of reconnects to rater before giving up.
# debit_interval = 10 # Interval to perform debits on.
# max_call_duration = 3h # Maximum call duration a prepaid call can last
@@ -107,7 +105,6 @@
[history_server]
# enabled = false # Starts History service: .
-# listen = 127.0.0.1:2013 # Listening addres for history server:
# history_dir = /var/log/cgrates/history # Location on disk where to store history files.
# save_interval = 1s # Interval to save changed cache into .git archive
diff --git a/data/freeswitch/conf/autoload_configs/abstraction.conf.xml b/data/freeswitch/conf/autoload_configs/abstraction.conf.xml
deleted file mode 100644
index d4b1dfd27..000000000
--- a/data/freeswitch/conf/autoload_configs/abstraction.conf.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/acl.conf.xml b/data/freeswitch/conf/autoload_configs/acl.conf.xml
deleted file mode 100644
index 0c117d07b..000000000
--- a/data/freeswitch/conf/autoload_configs/acl.conf.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/alsa.conf.xml b/data/freeswitch/conf/autoload_configs/alsa.conf.xml
deleted file mode 100644
index e589acaac..000000000
--- a/data/freeswitch/conf/autoload_configs/alsa.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/blacklist.conf.xml b/data/freeswitch/conf/autoload_configs/blacklist.conf.xml
deleted file mode 100644
index a981ebbdb..000000000
--- a/data/freeswitch/conf/autoload_configs/blacklist.conf.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/callcenter.conf.xml b/data/freeswitch/conf/autoload_configs/callcenter.conf.xml
deleted file mode 100644
index a069413ac..000000000
--- a/data/freeswitch/conf/autoload_configs/callcenter.conf.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/cdr_mongodb.conf.xml b/data/freeswitch/conf/autoload_configs/cdr_mongodb.conf.xml
deleted file mode 100644
index ce366d1bd..000000000
--- a/data/freeswitch/conf/autoload_configs/cdr_mongodb.conf.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/cdr_pg_csv.conf.xml b/data/freeswitch/conf/autoload_configs/cdr_pg_csv.conf.xml
deleted file mode 100644
index 4fec817b4..000000000
--- a/data/freeswitch/conf/autoload_configs/cdr_pg_csv.conf.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/cdr_sqlite.conf.xml b/data/freeswitch/conf/autoload_configs/cdr_sqlite.conf.xml
deleted file mode 100644
index 872c04c4f..000000000
--- a/data/freeswitch/conf/autoload_configs/cdr_sqlite.conf.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}",${duration},${billsec},"${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}"
-
-
diff --git a/data/freeswitch/conf/autoload_configs/cepstral.conf.xml b/data/freeswitch/conf/autoload_configs/cepstral.conf.xml
deleted file mode 100644
index cf4aa92f4..000000000
--- a/data/freeswitch/conf/autoload_configs/cepstral.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/freeswitch/conf/autoload_configs/cidlookup.conf.xml b/data/freeswitch/conf/autoload_configs/cidlookup.conf.xml
deleted file mode 100644
index a30f9f5c1..000000000
--- a/data/freeswitch/conf/autoload_configs/cidlookup.conf.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/conference.conf.xml b/data/freeswitch/conf/autoload_configs/conference.conf.xml
deleted file mode 100644
index 826f6fb9b..000000000
--- a/data/freeswitch/conf/autoload_configs/conference.conf.xml
+++ /dev/null
@@ -1,213 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/console.conf.xml b/data/freeswitch/conf/autoload_configs/console.conf.xml
deleted file mode 100644
index 2d9e3e8de..000000000
--- a/data/freeswitch/conf/autoload_configs/console.conf.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/db.conf.xml b/data/freeswitch/conf/autoload_configs/db.conf.xml
deleted file mode 100644
index abc6c0c15..000000000
--- a/data/freeswitch/conf/autoload_configs/db.conf.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/dialplan_directory.conf.xml b/data/freeswitch/conf/autoload_configs/dialplan_directory.conf.xml
deleted file mode 100644
index e4edcd6b1..000000000
--- a/data/freeswitch/conf/autoload_configs/dialplan_directory.conf.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/dingaling.conf.xml b/data/freeswitch/conf/autoload_configs/dingaling.conf.xml
deleted file mode 100644
index dd6c9a5da..000000000
--- a/data/freeswitch/conf/autoload_configs/dingaling.conf.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/directory.conf.xml b/data/freeswitch/conf/autoload_configs/directory.conf.xml
deleted file mode 100644
index 748b2337c..000000000
--- a/data/freeswitch/conf/autoload_configs/directory.conf.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/distributor.conf.xml b/data/freeswitch/conf/autoload_configs/distributor.conf.xml
deleted file mode 100644
index a03b1ee81..000000000
--- a/data/freeswitch/conf/autoload_configs/distributor.conf.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/easyroute.conf.xml b/data/freeswitch/conf/autoload_configs/easyroute.conf.xml
deleted file mode 100644
index 350a50989..000000000
--- a/data/freeswitch/conf/autoload_configs/easyroute.conf.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/enum.conf.xml b/data/freeswitch/conf/autoload_configs/enum.conf.xml
deleted file mode 100644
index b9813efa2..000000000
--- a/data/freeswitch/conf/autoload_configs/enum.conf.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/erlang_event.conf.xml b/data/freeswitch/conf/autoload_configs/erlang_event.conf.xml
deleted file mode 100644
index 62deb84f6..000000000
--- a/data/freeswitch/conf/autoload_configs/erlang_event.conf.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/event_multicast.conf.xml b/data/freeswitch/conf/autoload_configs/event_multicast.conf.xml
deleted file mode 100644
index eac039260..000000000
--- a/data/freeswitch/conf/autoload_configs/event_multicast.conf.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/event_socket.conf.xml b/data/freeswitch/conf/autoload_configs/event_socket.conf.xml
deleted file mode 100644
index 5ea2e0978..000000000
--- a/data/freeswitch/conf/autoload_configs/event_socket.conf.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/fax.conf.xml b/data/freeswitch/conf/autoload_configs/fax.conf.xml
deleted file mode 100644
index c7d825665..000000000
--- a/data/freeswitch/conf/autoload_configs/fax.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/fifo.conf.xml b/data/freeswitch/conf/autoload_configs/fifo.conf.xml
deleted file mode 100644
index b1db4dd2b..000000000
--- a/data/freeswitch/conf/autoload_configs/fifo.conf.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/hash.conf.xml b/data/freeswitch/conf/autoload_configs/hash.conf.xml
deleted file mode 100644
index 95b792877..000000000
--- a/data/freeswitch/conf/autoload_configs/hash.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/httapi.conf.xml b/data/freeswitch/conf/autoload_configs/httapi.conf.xml
deleted file mode 100644
index 50bbe78f4..000000000
--- a/data/freeswitch/conf/autoload_configs/httapi.conf.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/http_cache.conf.xml b/data/freeswitch/conf/autoload_configs/http_cache.conf.xml
deleted file mode 100644
index 4f0526965..000000000
--- a/data/freeswitch/conf/autoload_configs/http_cache.conf.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/ivr.conf.xml b/data/freeswitch/conf/autoload_configs/ivr.conf.xml
deleted file mode 100644
index bd4e73ded..000000000
--- a/data/freeswitch/conf/autoload_configs/ivr.conf.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/java.conf.xml b/data/freeswitch/conf/autoload_configs/java.conf.xml
deleted file mode 100644
index 5f71553e3..000000000
--- a/data/freeswitch/conf/autoload_configs/java.conf.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/lcr.conf.xml b/data/freeswitch/conf/autoload_configs/lcr.conf.xml
deleted file mode 100644
index 9d106d489..000000000
--- a/data/freeswitch/conf/autoload_configs/lcr.conf.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/local_stream.conf.xml b/data/freeswitch/conf/autoload_configs/local_stream.conf.xml
deleted file mode 100644
index 94a566539..000000000
--- a/data/freeswitch/conf/autoload_configs/local_stream.conf.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/logfile.conf.xml b/data/freeswitch/conf/autoload_configs/logfile.conf.xml
deleted file mode 100644
index 65bea552b..000000000
--- a/data/freeswitch/conf/autoload_configs/logfile.conf.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/lua.conf.xml b/data/freeswitch/conf/autoload_configs/lua.conf.xml
deleted file mode 100644
index 1eb594f0b..000000000
--- a/data/freeswitch/conf/autoload_configs/lua.conf.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/memcache.conf.xml b/data/freeswitch/conf/autoload_configs/memcache.conf.xml
deleted file mode 100644
index dc0173f98..000000000
--- a/data/freeswitch/conf/autoload_configs/memcache.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/modules.conf.xml b/data/freeswitch/conf/autoload_configs/modules.conf.xml
deleted file mode 100644
index 68d89288c..000000000
--- a/data/freeswitch/conf/autoload_configs/modules.conf.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/mongo.conf.xml b/data/freeswitch/conf/autoload_configs/mongo.conf.xml
deleted file mode 100644
index 8423645e9..000000000
--- a/data/freeswitch/conf/autoload_configs/mongo.conf.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/nibblebill.conf.xml b/data/freeswitch/conf/autoload_configs/nibblebill.conf.xml
deleted file mode 100644
index ed1c9332c..000000000
--- a/data/freeswitch/conf/autoload_configs/nibblebill.conf.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/opal.conf.xml b/data/freeswitch/conf/autoload_configs/opal.conf.xml
deleted file mode 100644
index 280b69304..000000000
--- a/data/freeswitch/conf/autoload_configs/opal.conf.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/oreka.conf.xml b/data/freeswitch/conf/autoload_configs/oreka.conf.xml
deleted file mode 100644
index 29eabd5c2..000000000
--- a/data/freeswitch/conf/autoload_configs/oreka.conf.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/osp.conf.xml b/data/freeswitch/conf/autoload_configs/osp.conf.xml
deleted file mode 100644
index b320dbba8..000000000
--- a/data/freeswitch/conf/autoload_configs/osp.conf.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/perl.conf.xml b/data/freeswitch/conf/autoload_configs/perl.conf.xml
deleted file mode 100644
index b2435000f..000000000
--- a/data/freeswitch/conf/autoload_configs/perl.conf.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml b/data/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml
deleted file mode 100644
index 3bf7d5e57..000000000
--- a/data/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/portaudio.conf.xml b/data/freeswitch/conf/autoload_configs/portaudio.conf.xml
deleted file mode 100644
index 02c21ef44..000000000
--- a/data/freeswitch/conf/autoload_configs/portaudio.conf.xml
+++ /dev/null
@@ -1,218 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/post_load_modules.conf.xml b/data/freeswitch/conf/autoload_configs/post_load_modules.conf.xml
deleted file mode 100644
index 8f4e132fa..000000000
--- a/data/freeswitch/conf/autoload_configs/post_load_modules.conf.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/presence_map.conf.xml b/data/freeswitch/conf/autoload_configs/presence_map.conf.xml
deleted file mode 100644
index 8a9d1dde5..000000000
--- a/data/freeswitch/conf/autoload_configs/presence_map.conf.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/python.conf.xml b/data/freeswitch/conf/autoload_configs/python.conf.xml
deleted file mode 100644
index d3a8fdc75..000000000
--- a/data/freeswitch/conf/autoload_configs/python.conf.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/redis.conf.xml b/data/freeswitch/conf/autoload_configs/redis.conf.xml
deleted file mode 100644
index 1a1f47403..000000000
--- a/data/freeswitch/conf/autoload_configs/redis.conf.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/rss.conf.xml b/data/freeswitch/conf/autoload_configs/rss.conf.xml
deleted file mode 100644
index f8c4f6d2b..000000000
--- a/data/freeswitch/conf/autoload_configs/rss.conf.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/rtmp.conf.xml b/data/freeswitch/conf/autoload_configs/rtmp.conf.xml
deleted file mode 100644
index d5d278810..000000000
--- a/data/freeswitch/conf/autoload_configs/rtmp.conf.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/sangoma_codec.conf.xml b/data/freeswitch/conf/autoload_configs/sangoma_codec.conf.xml
deleted file mode 100644
index eed9d673e..000000000
--- a/data/freeswitch/conf/autoload_configs/sangoma_codec.conf.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/shout.conf.xml b/data/freeswitch/conf/autoload_configs/shout.conf.xml
deleted file mode 100644
index 3f381e627..000000000
--- a/data/freeswitch/conf/autoload_configs/shout.conf.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/skinny.conf.xml b/data/freeswitch/conf/autoload_configs/skinny.conf.xml
deleted file mode 100644
index 6a878fcd7..000000000
--- a/data/freeswitch/conf/autoload_configs/skinny.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/sofia.conf.xml b/data/freeswitch/conf/autoload_configs/sofia.conf.xml
deleted file mode 100644
index a5e861432..000000000
--- a/data/freeswitch/conf/autoload_configs/sofia.conf.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/spandsp.conf.xml b/data/freeswitch/conf/autoload_configs/spandsp.conf.xml
deleted file mode 100644
index f70416bc6..000000000
--- a/data/freeswitch/conf/autoload_configs/spandsp.conf.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/spidermonkey.conf.xml b/data/freeswitch/conf/autoload_configs/spidermonkey.conf.xml
deleted file mode 100644
index 2e6dc6a16..000000000
--- a/data/freeswitch/conf/autoload_configs/spidermonkey.conf.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/switch.conf.xml b/data/freeswitch/conf/autoload_configs/switch.conf.xml
deleted file mode 100644
index ddf41f899..000000000
--- a/data/freeswitch/conf/autoload_configs/switch.conf.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/syslog.conf.xml b/data/freeswitch/conf/autoload_configs/syslog.conf.xml
deleted file mode 100644
index 636a12c8c..000000000
--- a/data/freeswitch/conf/autoload_configs/syslog.conf.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/timezones.conf.xml b/data/freeswitch/conf/autoload_configs/timezones.conf.xml
deleted file mode 100644
index 397e9a979..000000000
--- a/data/freeswitch/conf/autoload_configs/timezones.conf.xml
+++ /dev/null
@@ -1,551 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/tts_commandline.conf.xml b/data/freeswitch/conf/autoload_configs/tts_commandline.conf.xml
deleted file mode 100644
index eb816431b..000000000
--- a/data/freeswitch/conf/autoload_configs/tts_commandline.conf.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/unicall.conf.xml b/data/freeswitch/conf/autoload_configs/unicall.conf.xml
deleted file mode 100644
index eeaa0782f..000000000
--- a/data/freeswitch/conf/autoload_configs/unicall.conf.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/unimrcp.conf.xml b/data/freeswitch/conf/autoload_configs/unimrcp.conf.xml
deleted file mode 100644
index 45dda798a..000000000
--- a/data/freeswitch/conf/autoload_configs/unimrcp.conf.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/voicemail.conf.xml b/data/freeswitch/conf/autoload_configs/voicemail.conf.xml
deleted file mode 100644
index ff4683675..000000000
--- a/data/freeswitch/conf/autoload_configs/voicemail.conf.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/voicemail_ivr.conf.xml b/data/freeswitch/conf/autoload_configs/voicemail_ivr.conf.xml
deleted file mode 100644
index 1cdf3c222..000000000
--- a/data/freeswitch/conf/autoload_configs/voicemail_ivr.conf.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/xml_cdr.conf.xml b/data/freeswitch/conf/autoload_configs/xml_cdr.conf.xml
deleted file mode 100644
index e546e6f43..000000000
--- a/data/freeswitch/conf/autoload_configs/xml_cdr.conf.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/xml_curl.conf.xml b/data/freeswitch/conf/autoload_configs/xml_curl.conf.xml
deleted file mode 100644
index 30951d83c..000000000
--- a/data/freeswitch/conf/autoload_configs/xml_curl.conf.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/xml_rpc.conf.xml b/data/freeswitch/conf/autoload_configs/xml_rpc.conf.xml
deleted file mode 100644
index 714a90990..000000000
--- a/data/freeswitch/conf/autoload_configs/xml_rpc.conf.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/xml_scgi.conf.xml b/data/freeswitch/conf/autoload_configs/xml_scgi.conf.xml
deleted file mode 100644
index b9662d163..000000000
--- a/data/freeswitch/conf/autoload_configs/xml_scgi.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/freeswitch/conf/autoload_configs/zeroconf.conf.xml b/data/freeswitch/conf/autoload_configs/zeroconf.conf.xml
deleted file mode 100644
index 84c1a4617..000000000
--- a/data/freeswitch/conf/autoload_configs/zeroconf.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/monit/cgrates.monit b/data/monit/cgrates.monit
new file mode 100644
index 000000000..8e85e3fca
--- /dev/null
+++ b/data/monit/cgrates.monit
@@ -0,0 +1,9 @@
+# CGRateS Monit check script
+
+check process CGRateS with pidfile /var/run/cgrates/cgr-engine.pid
+ start program = "/etc/init.d/cgrates start"
+ stop program = "/etc/init.d/cgrates stop"
+ if failed host 127.0.0.1 port 2012 type TCP 4 times within 4 cycles then restart # Rater
+ if failed host 127.0.0.1 port 2013 type TCP 4 times within 4 cycles then restart # History
+ if failed host 127.0.0.1 port 2022 type TCP 4 times within 4 cycles then restart # CDRS
+ if 5 restarts within 20 cycles then timeout
diff --git a/data/storage/mysql/create_tariffplan_tables.sql b/data/storage/mysql/create_tariffplan_tables.sql
index b53403b45..4ad5bcb83 100644
--- a/data/storage/mysql/create_tariffplan_tables.sql
+++ b/data/storage/mysql/create_tariffplan_tables.sql
@@ -139,8 +139,8 @@ CREATE TABLE `tp_actions` (
-- Table structure for table `tp_action_timings`
--
-DROP TABLE IF EXISTS `tp_action_timings`;
-CREATE TABLE `tp_action_timings` (
+DROP TABLE IF EXISTS `tp_action_plans`;
+CREATE TABLE `tp_action_plans` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tpid` varchar(64) NOT NULL,
`tag` varchar(64) NOT NULL,
diff --git a/data/storage/mysql/setup_cgr_db.sh b/data/storage/mysql/setup_cgr_db.sh
index f27029093..40b5e803c 100755
--- a/data/storage/mysql/setup_cgr_db.sh
+++ b/data/storage/mysql/setup_cgr_db.sh
@@ -14,16 +14,22 @@ if [ -z "$3" ]; then
fi
mysql -u $1 -p$2 -h $host < create_db_with_users.sql
+cu=$?
mysql -u $1 -p$2 -h $host -D cgrates < create_cdrs_tables.sql
+cdrt=$?
mysql -u $1 -p$2 -h $host -D cgrates < create_costdetails_tables.sql
+cdt=$?
mysql -u $1 -p$2 -h $host -D cgrates < create_mediator_tables.sql
+mdt=$?
mysql -u $1 -p$2 -h $host -D cgrates < create_tariffplan_tables.sql
+tpt=$?
-echo ""
-echo "\t+++ CGR-DB successfully set-up! +++"
-echo ""
-
-exit 0
+if [ $cu = 0 ] && [ $cdrt = 0 ] && [ $cdt = 0 ] && [ $mdt = 0 ] && [ $tpt = 0 ]; then
+ echo ""
+ echo "\t+++ CGR-DB successfully set-up! +++"
+ echo ""
+ exit 0
+fi
diff --git a/data/tariffplans/fs_germany_prep1/ActionTriggers.csv b/data/tariffplans/fs_germany_prep1/ActionTriggers.csv
deleted file mode 100644
index 22d063dfa..000000000
--- a/data/tariffplans/fs_germany_prep1/ActionTriggers.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-#Tag,BalanceType,Direction,ThresholdType,ThresholdValue,DestinationTag,ActionsTag,Weight
-STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,,LOG_BALANCE,10
-STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,,LOG_BALANCE,10
-STANDARD_TRIGGERS,*monetary,*out,*max_counter,15,FS_USERS,LOG_BALANCE,10
diff --git a/data/tariffplans/fs_germany_prep1/DestinationRates.csv b/data/tariffplans/fs_germany_prep1/DestinationRates.csv
deleted file mode 100644
index 1812d2efd..000000000
--- a/data/tariffplans/fs_germany_prep1/DestinationRates.csv
+++ /dev/null
@@ -1,6 +0,0 @@
-#Tag,DestinationsTag,RatesTag
-DR_RETAIL_PEAK,GERMANY,LANDLINE_PEAK
-DR_RETAIL_PEAK,GERMANY_MOBILE,MOBILE_PEAK
-DR_RETAIL_OFFPEAK,GERMANY,LANDLINE_OFFPEAK
-DR_RETAIL_OFFPEAK,GERMANY_MOBILE,MOBILE_OFFPEAK
-DR_FREESWITCH_USERS,FS_USERS,RT_FS_USERS
diff --git a/data/tariffplans/fs_germany_prep1/Destinations.csv b/data/tariffplans/fs_germany_prep1/Destinations.csv
deleted file mode 100644
index 8ee6689cb..000000000
--- a/data/tariffplans/fs_germany_prep1/Destinations.csv
+++ /dev/null
@@ -1,6 +0,0 @@
-#Tag,Prefix
-GERMANY,+49
-GERMANY_MOBILE,+4915
-GERMANY_MOBILE,+4916
-GERMANY_MOBILE,+4917
-FS_USERS,10
diff --git a/data/tariffplans/fs_germany_prep1/README.md b/data/tariffplans/fs_germany_prep1/README.md
deleted file mode 100644
index 32ff027ac..000000000
--- a/data/tariffplans/fs_germany_prep1/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-CGRateS - FSGermanyPrep1
-==========================
-
-Scenario:
----------
-
-* Create the necessary timings (always, peak, offpeak, asap).
-* Configure 3 different destinations: GERMANY, GERMANY_MOBILE and FS_USERS.
-* Calls to landline and mobile numbers in Germany will be charged time based (structured in peak and offpeak profiles). Calls to landline during peak times are charged using different rate slots: first minute charged as a whole at one rate, next minutes charged per second at another rate.
-* Calls to FreeSWITCH users will be free and time independent.
-* This rating profile will be valid for any rating subject.
-
-* Create 5 prepaid accounts (equivalent of 5 FreeSWITCH default test users - 1001, 1002, 1003, 1004, 1005).
-* Add to each of the accounts a monetary balance of 10 units.
-* For each balance created, attach 3 triggers to control the balance: log on balance=2, log on balance=20, log on 15 mins talked towards FS_USERS destination.
diff --git a/data/tariffplans/fs_germany_prep1/Rates.csv b/data/tariffplans/fs_germany_prep1/Rates.csv
deleted file mode 100644
index 23615c56c..000000000
--- a/data/tariffplans/fs_germany_prep1/Rates.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-#Tag,ConnectFee,Rate,RateUnit,RateIncrement,GroupIntervalStart,RoundingMethod,RoundingDecimals
-LANDLINE_PEAK,0.02,0.02,60s,60s,0s,*up,4
-LANDLINE_PEAK,0.02,0.01,1s,1s,60s,*up,4
-MOBILE_PEAK,0.02,0.14,60s,60s,0s,*up,4
-LANDLINE_OFFPEAK,1,0,60s,60s,0s,*up,4
-MOBILE_OFFPEAK,0.02,0.1,60s,60s,0,*up,4
-RT_FS_USERS,0,0,60s,60s,0s,*up,0
diff --git a/data/tariffplans/fs_germany_prep1/RatingPlans.csv b/data/tariffplans/fs_germany_prep1/RatingPlans.csv
deleted file mode 100644
index c47aeafd6..000000000
--- a/data/tariffplans/fs_germany_prep1/RatingPlans.csv
+++ /dev/null
@@ -1,6 +0,0 @@
-#Tag,DestinationRatesTag,TimingTag,Weight
-RETAIL1,DR_RETAIL_PEAK,PEAK,10
-RETAIL1,DR_RETAIL_OFFPEAK,OFFPEAK_MORNING,10
-RETAIL1,DR_RETAIL_OFFPEAK,OFFPEAK_EVENING,10
-RETAIL1,DR_RETAIL_OFFPEAK,WEEKEND,10
-RETAIL1,DR_FREESWITCH_USERS,ALWAYS,10
diff --git a/data/tariffplans/fs_germany_prep1/RatingProfiles.csv b/data/tariffplans/fs_germany_prep1/RatingProfiles.csv
deleted file mode 100644
index 4c7c1dbd3..000000000
--- a/data/tariffplans/fs_germany_prep1/RatingProfiles.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-#Tenant,TOR,Direction,Subject,ActivationTime,RatingPlanTag,FallbackSubject
-cgrates.org,call,*out,*any,2012-01-01T00:00:00Z,RETAIL1,
diff --git a/data/tariffplans/fs_germany_prep1/ActionTimings.csv b/data/tariffplans/prepaid1centpsec/ActionPlans.csv
similarity index 100%
rename from data/tariffplans/fs_germany_prep1/ActionTimings.csv
rename to data/tariffplans/prepaid1centpsec/ActionPlans.csv
diff --git a/data/tutorials/fs_csv/README.md b/data/tutorials/fs_csv/README.md
index 4eaad5ccf..1a39ef3ad 100644
--- a/data/tutorials/fs_csv/README.md
+++ b/data/tutorials/fs_csv/README.md
@@ -1,5 +1,5 @@
-Tutorial fs_prepaid_csv
-=======================
+Tutorial FS_CSV
+===============
Scenario:
---------
diff --git a/data/tutorials/fs_csv/cgrates/tariffplans/README.md b/data/tutorials/fs_csv/cgrates/tariffplans/README.md
index f84eb28f6..124fa3141 100644
--- a/data/tutorials/fs_csv/cgrates/tariffplans/README.md
+++ b/data/tutorials/fs_csv/cgrates/tariffplans/README.md
@@ -1,5 +1,5 @@
-CGRateS - FSGermanyPrep1
-==========================
+Tutorial - FS_CSV
+=================
Scenario:
---------
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/README_IMPORTANT.txt b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/README_IMPORTANT.txt
deleted file mode 100644
index 8d82b404f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/README_IMPORTANT.txt
+++ /dev/null
@@ -1,35 +0,0 @@
- -= PLEASE READ THIS BEFORE YOU PUT A FreeSWITCH BOX INTO PRODUCTION =-
-
-This configuration, generally known as the "default configuration" for FreeSWITCH, is *NOT* designed to be put into a production environment without some important modifications. Please keep in mind that the default configuration is designed to demonstrate what FreeSWITCH *can* do, not what it *should* do in your specific scenario.
-
-*** SECURING YOUR SERVER ***
-
-By default, FreeSWITCH starts up and does a NATPMP and UPnP request to your router. If your router supports either of these protocols then FreeSWITCH does two things:
-#1 - It gets the external IP address, which it uses for SIP communications
-#2 - It causes there to be a "pinhole" opened up in the router allowing inbound communications to your FreeSWITCH server
-
-Please re-read #2. Now, please re-read #2 again. If you do not want a pinhole coming through your router then DO NOT USE the "auto-nat" tools. The way to disable the auto-nat (that is, UPnP/NATPMP) checking is to start FreeSWITCH with the "-nonat" flag. Easy enough.
-
-If you are planning on putting a system into production then you had better pay attention to security in other areas as well. If you are behind a firewall then make sure your firewall is actually protecting you. If you have your server on a public-facing Internet connection then we recommend a few things:
-#1 - Consider using iptables (Linux/Unix)
-#2 - Consider using fail2ban (see http://wiki.freeswitch.org/wiki/Fail2ban)
-
-*** SECURING YOUR USERS ***
-
-By default, the static XML files have 20 "directory users" in conf/directory/10xx.xml, numbered 1000-1019. Also, the default dialplan has routing for calls to those same extension numbers. (NOTE: the directory and the dialplan are 100% separate concepts. Check out chapters 3-5 of the awesome FreeSWITCH book for details.)
-
-The default users all have *very* simple passwords for SIP credentials and voicemail. If you put those into a production system then you are either brave, ignorant, or stupid. Please don't be any of those three things! You have a few choices for handling your users:
-
-#1 - Delete the static XML files and use mod_xml_curl for dynamic users from a back-end database
-#2 - Manually edit the static XML user directory files and modify the passwords
-#3 - Run the handy randomize-passwords.pl script found in scripts/perl/ subdirectory under the main FreeSWITCH source directory
-
-*** GETTING HELP ***
-
-FreeSWITCH has a thriving on-line community - we welcome you to join us!
-IRC: #freeswitch on irc.freenode.net
-Mailing List: freeswitch-users on lists.freeswitch.org
-
-You can also get professional FreeSWITCH assistance by visiting http://www.freeswitchsolutions.com or sending an email to consulting@freeswitch.org.
-
-Happy FreeSWITCHing!
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/abstraction.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/abstraction.conf.xml
deleted file mode 100644
index d4b1dfd27..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/abstraction.conf.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/acl.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/acl.conf.xml
deleted file mode 100644
index 0c117d07b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/acl.conf.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/alsa.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/alsa.conf.xml
deleted file mode 100644
index e589acaac..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/alsa.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/blacklist.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/blacklist.conf.xml
deleted file mode 100644
index a981ebbdb..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/blacklist.conf.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/callcenter.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/callcenter.conf.xml
deleted file mode 100644
index a069413ac..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/callcenter.conf.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_csv.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_csv.conf.xml
deleted file mode 100644
index 92f88c6c1..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_csv.conf.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- INSERT INTO cdr VALUES ("${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}");
- "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}",,"${cgr_reqtype}"
- "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}","${read_codec}","${write_codec}","${sip_user_agent}","${call_clientcode}","${sip_rtp_rxstat}","${sip_rtp_txstat}","${sofia_record_file}"
- "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}","${sip_user_agent}","${sip_p_rtp_stat}"
- "${accountcode}","${caller_id_number}","${destination_number}","${context}","${caller_id}","${channel_name}","${bridge_channel}","${last_app}","${last_arg}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${amaflags}","${uuid}","${userfield}"
- "${uuid}","${signal_bond}","${direction}","${ani}","${destination_number}","${answer_stamp}","${end_stamp}","${billsec}","${accountcode}","${userfield}","${network_addr}","${regex('${original_caller_id_name}'|^.)}","${sip_gateway_name}"
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_mongodb.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_mongodb.conf.xml
deleted file mode 100644
index ce366d1bd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_mongodb.conf.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_pg_csv.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_pg_csv.conf.xml
deleted file mode 100644
index 4fec817b4..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_pg_csv.conf.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_sqlite.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_sqlite.conf.xml
deleted file mode 100644
index 872c04c4f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cdr_sqlite.conf.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}",${duration},${billsec},"${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}"
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cepstral.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cepstral.conf.xml
deleted file mode 100644
index cf4aa92f4..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cepstral.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cidlookup.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cidlookup.conf.xml
deleted file mode 100644
index a30f9f5c1..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/cidlookup.conf.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/conference.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/conference.conf.xml
deleted file mode 100644
index ee41f740d..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/conference.conf.xml
+++ /dev/null
@@ -1,213 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/console.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/console.conf.xml
deleted file mode 100644
index 2d9e3e8de..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/console.conf.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/db.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/db.conf.xml
deleted file mode 100644
index abc6c0c15..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/db.conf.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/dialplan_directory.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/dialplan_directory.conf.xml
deleted file mode 100644
index e4edcd6b1..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/dialplan_directory.conf.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/dingaling.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/dingaling.conf.xml
deleted file mode 100644
index dd6c9a5da..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/dingaling.conf.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/directory.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/directory.conf.xml
deleted file mode 100644
index 748b2337c..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/directory.conf.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/distributor.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/distributor.conf.xml
deleted file mode 100644
index a03b1ee81..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/distributor.conf.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/easyroute.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/easyroute.conf.xml
deleted file mode 100644
index 350a50989..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/easyroute.conf.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/enum.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/enum.conf.xml
deleted file mode 100644
index b9813efa2..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/enum.conf.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/erlang_event.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/erlang_event.conf.xml
deleted file mode 100644
index 62deb84f6..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/erlang_event.conf.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/event_multicast.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/event_multicast.conf.xml
deleted file mode 100644
index eac039260..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/event_multicast.conf.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml
deleted file mode 100644
index 5ea2e0978..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/fax.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/fax.conf.xml
deleted file mode 100644
index c7d825665..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/fax.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/fifo.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/fifo.conf.xml
deleted file mode 100644
index b1db4dd2b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/fifo.conf.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/hash.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/hash.conf.xml
deleted file mode 100644
index 95b792877..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/hash.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/httapi.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/httapi.conf.xml
deleted file mode 100644
index 50bbe78f4..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/httapi.conf.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/http_cache.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/http_cache.conf.xml
deleted file mode 100644
index 5d0294c66..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/http_cache.conf.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/ivr.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/ivr.conf.xml
deleted file mode 100644
index bd4e73ded..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/ivr.conf.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/java.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/java.conf.xml
deleted file mode 100644
index 5f71553e3..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/java.conf.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/lcr.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/lcr.conf.xml
deleted file mode 100644
index 9d106d489..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/lcr.conf.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/local_stream.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/local_stream.conf.xml
deleted file mode 100644
index 94a566539..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/local_stream.conf.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/logfile.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/logfile.conf.xml
deleted file mode 100644
index 65bea552b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/logfile.conf.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/lua.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/lua.conf.xml
deleted file mode 100644
index f50307ea8..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/lua.conf.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/memcache.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/memcache.conf.xml
deleted file mode 100644
index dc0173f98..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/memcache.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/modules.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/modules.conf.xml
deleted file mode 100644
index 0ca6bc5b3..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/modules.conf.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/mongo.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/mongo.conf.xml
deleted file mode 100644
index 72fffafbb..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/mongo.conf.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/nibblebill.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/nibblebill.conf.xml
deleted file mode 100644
index 043c98548..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/nibblebill.conf.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/opal.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/opal.conf.xml
deleted file mode 100644
index 280b69304..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/opal.conf.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/oreka.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/oreka.conf.xml
deleted file mode 100644
index 29eabd5c2..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/oreka.conf.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/osp.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/osp.conf.xml
deleted file mode 100644
index b320dbba8..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/osp.conf.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/perl.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/perl.conf.xml
deleted file mode 100644
index b2435000f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/perl.conf.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/pocketsphinx.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/pocketsphinx.conf.xml
deleted file mode 100644
index 3bf7d5e57..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/pocketsphinx.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/portaudio.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/portaudio.conf.xml
deleted file mode 100644
index a715571c6..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/portaudio.conf.xml
+++ /dev/null
@@ -1,221 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/post_load_modules.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/post_load_modules.conf.xml
deleted file mode 100644
index 8f4e132fa..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/post_load_modules.conf.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/presence_map.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/presence_map.conf.xml
deleted file mode 100644
index 8a9d1dde5..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/presence_map.conf.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/python.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/python.conf.xml
deleted file mode 100644
index d3a8fdc75..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/python.conf.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/redis.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/redis.conf.xml
deleted file mode 100644
index 1a1f47403..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/redis.conf.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/rss.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/rss.conf.xml
deleted file mode 100644
index f8c4f6d2b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/rss.conf.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/rtmp.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/rtmp.conf.xml
deleted file mode 100644
index d5d278810..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/rtmp.conf.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/sangoma_codec.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/sangoma_codec.conf.xml
deleted file mode 100644
index eed9d673e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/sangoma_codec.conf.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/shout.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/shout.conf.xml
deleted file mode 100644
index 3f381e627..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/shout.conf.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/skinny.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/skinny.conf.xml
deleted file mode 100644
index 6a878fcd7..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/skinny.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/sofia.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/sofia.conf.xml
deleted file mode 100644
index a5e861432..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/sofia.conf.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/spandsp.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/spandsp.conf.xml
deleted file mode 100644
index 0241c1f4d..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/spandsp.conf.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/spidermonkey.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/spidermonkey.conf.xml
deleted file mode 100644
index 2e6dc6a16..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/spidermonkey.conf.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/switch.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/switch.conf.xml
deleted file mode 100644
index ddf41f899..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/switch.conf.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/syslog.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/syslog.conf.xml
deleted file mode 100644
index 636a12c8c..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/syslog.conf.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/timezones.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/timezones.conf.xml
deleted file mode 100644
index 397e9a979..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/timezones.conf.xml
+++ /dev/null
@@ -1,551 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/translate.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/translate.conf.xml
deleted file mode 100644
index 453ef3afb..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/translate.conf.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/tts_commandline.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/tts_commandline.conf.xml
deleted file mode 100644
index eb816431b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/tts_commandline.conf.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/unicall.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/unicall.conf.xml
deleted file mode 100644
index eeaa0782f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/unicall.conf.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/unimrcp.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/unimrcp.conf.xml
deleted file mode 100644
index 45dda798a..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/unimrcp.conf.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/voicemail.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/voicemail.conf.xml
deleted file mode 100644
index 9e5e67ffa..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/voicemail.conf.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/voicemail_ivr.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/voicemail_ivr.conf.xml
deleted file mode 100644
index 1cdf3c222..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/voicemail_ivr.conf.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_cdr.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_cdr.conf.xml
deleted file mode 100644
index ac9b1f94d..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_cdr.conf.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_curl.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_curl.conf.xml
deleted file mode 100644
index 30951d83c..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_curl.conf.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_rpc.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_rpc.conf.xml
deleted file mode 100644
index 714a90990..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_rpc.conf.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_scgi.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_scgi.conf.xml
deleted file mode 100644
index b9662d163..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/xml_scgi.conf.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/zeroconf.conf.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/zeroconf.conf.xml
deleted file mode 100644
index 84c1a4617..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/autoload_configs/zeroconf.conf.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/chatplan/default.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/chatplan/default.xml
deleted file mode 100644
index b67bb638f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/chatplan/default.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/config.FS0 b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/config.FS0
deleted file mode 100644
index 531014214..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/config.FS0
+++ /dev/null
@@ -1,78 +0,0 @@
-CountryCode: 1
-AreaCode: 800
-FAXNumber: +1.800.555.1212
-LongDistancePrefix: 1
-InternationalPrefix: 011
-DialStringRules: etc/dialrules
-ServerTracing: 0xFFF
-SessionTracing: 0xFFF
-RecvFileMode: 0600
-LogFileMode: 0600
-DeviceMode: 0600
-RingsBeforeAnswer: 1
-SpeakerVolume: off
-GettyArgs: "-h %l dx_%s"
-LocalIdentifier: "FS"
-TagLineFont: etc/lutRS18.pcf
-TagLineFormat: "From %%l|%c|Page %%P of %%T"
-MaxRecvPages: 200
-#
-#
-# Modem-related stuff: should reflect modem command interface
-# and hardware connection/cabling (e.g. flow control).
-#
-ModemType: Class1 # use this to supply a hint
-
-#
-# Enabling this will use the hfaxd-protocol to set Caller*ID
-#
-#ModemSetOriginCmd: AT+VSID="%s","%d"
-
-#
-# If "glare" during initialization becomes a problem then take
-# the modem off-hook during initialization, and then place it
-# back on-hook when done.
-#
-#ModemResetCmds: "ATH1\nAT+VCID=1" # enables CallID display
-#ModemReadyCmds: ATH0
-
-Class1AdaptRecvCmd: AT+FAR=1
-Class1TMConnectDelay: 400 # counteract quick CONNECT response
-
-#
-# If you have trouble with V.17 receiving or sending,
-# you may want to enable one of these, respectively.
-#
-#Class1RMQueryCmd: "!24,48,72,96" # enable this to disable V.17 receiving
-#Class1TMQueryCmd: "!24,48,72,96" # enable this to disable V.17 sending
-
-#
-# You'll likely want Caller*ID display (also displays DID) enabled.
-#
-ModemResetCmds: AT+VCID=1 # enables CallID display
-
-#
-# The pty does not support changing parity.
-#
-PagerTTYParity: none
-
-#
-# If you are "missing" Caller*ID data on some calls (but not all)
-# and if you do not have adequate glare protection you may want to
-# not answer based on RINGs, but rather enable the CallIDAnswerLength
-# for NDID, disable AT+VCID=1 and do this:
-#
-#RingsBeforeAnswer: 0
-#ModemRingResponse: AT+VRID=1
-
-# Uncomment DATE and TIME if you really want them, but you probably don't.
-#CallIDPattern: "DATE="
-#CallIDPattern: "TIME="
-CallIDPattern: "NMBR="
-CallIDPattern: "NAME="
-CallIDPattern: "ANID="
-#CallIDPattern: "USER=" # username provided by call
-#CallIDPattern: "PASS=" # password provided by call
-#CallIDPattern: "CDID=" # DID context in call
-CallIDPattern: "NDID="
-#CallIDAnswerLength: 4
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default.xml
deleted file mode 100644
index cfdc0a9e4..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default.xml
+++ /dev/null
@@ -1,821 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/00_ladspa.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/00_ladspa.xml
deleted file mode 100644
index a26b193ef..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/00_ladspa.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/00_pizza_demo.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/00_pizza_demo.xml
deleted file mode 100644
index e7fcca204..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/00_pizza_demo.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/01_Talking_Clock.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/01_Talking_Clock.xml
deleted file mode 100644
index bc5077053..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/01_Talking_Clock.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/01_example.com.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/01_example.com.xml
deleted file mode 100644
index bd61cd278..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/01_example.com.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/ideasip.com.noload b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/ideasip.com.noload
deleted file mode 100644
index 8b963e3bd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/ideasip.com.noload
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/pulver.com.noload b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/pulver.com.noload
deleted file mode 100644
index 7b86caa84..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/pulver.com.noload
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/sipbroker.com.noload b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/sipbroker.com.noload
deleted file mode 100644
index 4f5e4f8c2..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/sipbroker.com.noload
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/sipphone.com.noload b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/sipphone.com.noload
deleted file mode 100644
index a6ea9e8d4..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/sipphone.com.noload
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/tollfreegateway.com.noload b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/tollfreegateway.com.noload
deleted file mode 100644
index b7526bf89..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/default/tollfreegateway.com.noload
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/features.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/features.xml
deleted file mode 100644
index b85cadc5f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/features.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/public.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/public.xml
deleted file mode 100644
index e44006e33..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/public.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/public/00_inbound_did.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/public/00_inbound_did.xml
deleted file mode 100644
index d40b3ab2c..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/public/00_inbound_did.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns.xml
deleted file mode 100644
index b37d8eed8..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/20-Demo.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/20-Demo.xml
deleted file mode 100644
index f69658128..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/20-Demo.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/20-Local_extension.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/20-Local_extension.xml
deleted file mode 100644
index 9ad565132..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/20-Local_extension.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/90-External.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/90-External.xml
deleted file mode 100644
index 50d6c37f2..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/90-External.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/99-Default_Drop.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/99-Default_Drop.xml
deleted file mode 100644
index 897fd8fb9..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/dialplan/skinny-patterns/99-Default_Drop.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default.xml
deleted file mode 100644
index 95b75b40d..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1000.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1000.xml
deleted file mode 100644
index 9bee406dd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1000.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1001.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1001.xml
deleted file mode 100644
index de35469de..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1001.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1002.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1002.xml
deleted file mode 100644
index 1068563d4..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1002.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1003.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1003.xml
deleted file mode 100644
index 61809b58f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1003.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1004.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1004.xml
deleted file mode 100644
index 832702984..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1004.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1005.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1005.xml
deleted file mode 100644
index 0e1165f43..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1005.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1006.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1006.xml
deleted file mode 100644
index beaaa7e9f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1006.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1007.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1007.xml
deleted file mode 100644
index 10470a504..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1007.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1008.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1008.xml
deleted file mode 100644
index 0e63fcfde..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1008.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1009.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1009.xml
deleted file mode 100644
index 24db7f815..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1009.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1010.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1010.xml
deleted file mode 100644
index 6d8e0c1ba..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1010.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1011.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1011.xml
deleted file mode 100644
index 79d731de5..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1011.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1012.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1012.xml
deleted file mode 100644
index 3839824fb..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1012.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1013.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1013.xml
deleted file mode 100644
index 6f9c8e475..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1013.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1014.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1014.xml
deleted file mode 100644
index 6a554c065..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1014.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1015.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1015.xml
deleted file mode 100644
index e94b8886a..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1015.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1016.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1016.xml
deleted file mode 100644
index 4f856fc7b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1016.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1017.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1017.xml
deleted file mode 100644
index b0e43a023..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1017.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1018.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1018.xml
deleted file mode 100644
index 6d7071942..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1018.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1019.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1019.xml
deleted file mode 100644
index f23a95f4b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/1019.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/brian.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/brian.xml
deleted file mode 100644
index 05fe0c832..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/brian.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/default.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/default.xml
deleted file mode 100644
index aa138f18d..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/default.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/example.com.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/example.com.xml
deleted file mode 100644
index 42a33ddbf..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/example.com.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/skinny-example.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/skinny-example.xml
deleted file mode 100644
index 357eb72f1..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/directory/default/skinny-example.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/extensions.conf b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/extensions.conf
deleted file mode 100644
index f2c922efc..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/extensions.conf
+++ /dev/null
@@ -1,21 +0,0 @@
-[default]
-
-; Things you're used to....
-exten => music,n,Dial(SIP/1234@conference.freeswitch.org|120)
-
-exten => _1XXXXX,n,set(cool=${EXTEN})
-exten => _1XXXXX,n,set(myvar=true)
-exten => _1XXXXX,n,Goto(default|music)
-exten => 2137991400/1000,n,Goto(default|music)
-
-
-; Some new magic you can do....
-exten => ~^(18(0{2}|8{2}|7{2}|6{2})\d{7})$,n,enum($1)
-exten => ~^(18(0{2}|8{2}|7{2}|6{2})\d{7})$,n,bridge(${enum_auto_route})
-
-; instead of exten, put anything about the call you would rather match on.
-; either the names of a field in caller_profile or a string of variables to expand.
-caller_id_number => 2137991400,n,Goto(default|music)
-${sip_from_user} => bill,n,Goto(default|music)
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/freeswitch.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/freeswitch.xml
deleted file mode 100644
index b067d986c..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/freeswitch.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/fur_elise.ttml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/fur_elise.ttml
deleted file mode 100644
index 6e6ef0372..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/fur_elise.ttml
+++ /dev/null
@@ -1,83 +0,0 @@
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 494)
-%(167, 0, 554)
-%(167, 0, 523)
-%(333, 0, 440)
-%(167, 0, 0)
-%(167, 0, 262)
-%(167, 0, 330)
-%(167, 0, 440)
-%(333, 0, 494)
-%(167, 0, 0)
-%(167, 0, 330)
-%(167, 0, 415)
-%(167, 0, 494)
-%(333, 0, 523)
-%(167, 0, 0)
-%(167, 0, 330)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 494)
-%(167, 0, 554)
-%(167, 0, 523)
-%(333, 0, 440)
-%(167, 0, 0)
-%(167, 0, 262)
-%(167, 0, 330)
-%(167, 0, 440)
-%(333, 0, 494)
-%(167, 0, 0)
-%(167, 0, 330)
-%(167, 0, 523)
-%(167, 0, 494)
-%(167, 0, 440)
-%(167, 0, 0)
-%(167, 0, 494)
-%(167, 0, 523)
-%(167, 0, 587)
-%(333, 0, 659)
-%(167, 0, 0)
-%(167, 0, 392)
-%(167, 0, 698)
-%(167, 0, 784)
-%(333, 0, 587)
-%(167, 0, 0)
-%(167, 0, 349)
-%(167, 0, 659)
-%(167, 0, 587)
-%(333, 0, 523)
-%(167, 0, 0)
-%(167, 0, 330)
-%(167, 0, 587)
-%(167, 0, 523)
-%(333, 0, 494)
-%(167, 0, 0)
-%(167, 0, 330)
-%(167, 0, 659)
-%(167, 0, 330)
-%(167, 0, 659)
-%(167, 0, 659)
-%(167, 0, 1319)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 622)
-%(167, 0, 659)
-%(167, 0, 494)
-%(167, 0, 554)
-%(167, 0, 523)
-%(333, 0, 440)
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/ivr_menus/demo_ivr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/ivr_menus/demo_ivr.xml
deleted file mode 100644
index d9aefaadb..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/ivr_menus/demo_ivr.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/ivr_menus/new_demo_ivr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/ivr_menus/new_demo_ivr.xml
deleted file mode 100644
index f2ca7dc68..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/ivr_menus/new_demo_ivr.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/jingle_profiles/client.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/jingle_profiles/client.xml
deleted file mode 100644
index 20a8dd809..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/jingle_profiles/client.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/jingle_profiles/server.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/jingle_profiles/server.xml
deleted file mode 100644
index b60dc27ea..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/jingle_profiles/server.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/de.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/de.xml
deleted file mode 100644
index a7dbab0c0..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/de.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/demo/demo.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/demo/demo.xml
deleted file mode 100644
index fa77948b6..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/demo/demo.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/vm/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/vm/sounds.xml
deleted file mode 100644
index 657e611c2..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/vm/sounds.xml
+++ /dev/null
@@ -1,413 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/vm/tts.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/vm/tts.xml
deleted file mode 100644
index f91cae1b9..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/de/vm/tts.xml
+++ /dev/null
@@ -1,224 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/demo-ivr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/demo-ivr.xml
deleted file mode 100644
index 98f155a26..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/demo-ivr.xml
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/demo.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/demo.xml
deleted file mode 100644
index bcfe6a822..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/demo.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/funnies.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/funnies.xml
deleted file mode 100644
index e901c5ad9..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/funnies.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/new-demo-ivr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/new-demo-ivr.xml
deleted file mode 100644
index 619d9921e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/demo/new-demo-ivr.xml
+++ /dev/null
@@ -1,171 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/dir/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/dir/sounds.xml
deleted file mode 100644
index b715a7f82..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/dir/sounds.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/dir/tts.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/dir/tts.xml
deleted file mode 100644
index d5f112dcd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/dir/tts.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/en.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/en.xml
deleted file mode 100644
index 3d27bce17..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/en.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/ivr/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/ivr/sounds.xml
deleted file mode 100644
index 0c4f0b9c7..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/ivr/sounds.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/sounds.xml
deleted file mode 100644
index fae8acefa..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/sounds.xml
+++ /dev/null
@@ -1,444 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/tts.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/tts.xml
deleted file mode 100644
index 2de4b3781..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/tts.xml
+++ /dev/null
@@ -1,249 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/voicemail_ivr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/voicemail_ivr.xml
deleted file mode 100644
index 1c4829943..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/en/vm/voicemail_ivr.xml
+++ /dev/null
@@ -1,417 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-es-ES.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-es-ES.xml
deleted file mode 100644
index 4c6919dd0..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-es-ES.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-es-MX.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-es-MX.xml
deleted file mode 100644
index 4c6919dd0..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-es-MX.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-ivr-es-ES.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-ivr-es-ES.xml
deleted file mode 100644
index ec7d7bccd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-ivr-es-ES.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-ivr-es-MX.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-ivr-es-MX.xml
deleted file mode 100644
index ec7d7bccd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/demo/demo-ivr-es-MX.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/sounds-es-ES.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/sounds-es-ES.xml
deleted file mode 100644
index 2bdc1492e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/sounds-es-ES.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/sounds-es-MX.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/sounds-es-MX.xml
deleted file mode 100644
index 2bdc1492e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/sounds-es-MX.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/tts-es-ES.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/tts-es-ES.xml
deleted file mode 100644
index fbdeca703..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/tts-es-ES.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/tts-es-MX.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/tts-es-MX.xml
deleted file mode 100644
index ddf15d0a5..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/dir/tts-es-MX.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/es_ES.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/es_ES.xml
deleted file mode 100644
index f8de6858e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/es_ES.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/es_MX.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/es_MX.xml
deleted file mode 100644
index 936abcf16..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/es_MX.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/sounds-es-ES.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/sounds-es-ES.xml
deleted file mode 100644
index dcc9d9f76..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/sounds-es-ES.xml
+++ /dev/null
@@ -1,404 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/sounds-es-MX.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/sounds-es-MX.xml
deleted file mode 100644
index 1f22c43bd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/sounds-es-MX.xml
+++ /dev/null
@@ -1,404 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/tts-es-ES.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/tts-es-ES.xml
deleted file mode 100644
index 6dab48ca6..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/tts-es-ES.xml
+++ /dev/null
@@ -1,238 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/tts-es-MX.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/tts-es-MX.xml
deleted file mode 100644
index ce5722e93..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/es/vm/tts-es-MX.xml
+++ /dev/null
@@ -1,238 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/demo/demo.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/demo/demo.xml
deleted file mode 100644
index 0d0de592a..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/demo/demo.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/dir/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/dir/sounds.xml
deleted file mode 100644
index a0dcb2c0e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/dir/sounds.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/dir/tts.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/dir/tts.xml
deleted file mode 100644
index 7d3e5e309..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/dir/tts.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/fr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/fr.xml
deleted file mode 100644
index 124ca0241..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/fr.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/vm/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/vm/sounds.xml
deleted file mode 100644
index 9cd209eab..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/fr/vm/sounds.xml
+++ /dev/null
@@ -1,255 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/demo/demo-ivr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/demo/demo-ivr.xml
deleted file mode 100644
index df8d24b75..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/demo/demo-ivr.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/demo/demo.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/demo/demo.xml
deleted file mode 100644
index bcfe6a822..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/demo/demo.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/dir/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/dir/sounds.xml
deleted file mode 100644
index 5fd13fffc..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/dir/sounds.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/he.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/he.xml
deleted file mode 100644
index 7cca73c1e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/he.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/vm/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/vm/sounds.xml
deleted file mode 100644
index 917c84b03..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/he/vm/sounds.xml
+++ /dev/null
@@ -1,417 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-ivr-pt-BR.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-ivr-pt-BR.xml
deleted file mode 100644
index ec7d7bccd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-ivr-pt-BR.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-ivr-pt-PT.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-ivr-pt-PT.xml
deleted file mode 100644
index ec7d7bccd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-ivr-pt-PT.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-pt-BR.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-pt-BR.xml
deleted file mode 100644
index 846561a54..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-pt-BR.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-pt-PT.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-pt-PT.xml
deleted file mode 100644
index 34464f7a6..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/demo/demo-pt-PT.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/sounds-pt-BR.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/sounds-pt-BR.xml
deleted file mode 100644
index 2bdc1492e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/sounds-pt-BR.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/sounds-pt-PT.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/sounds-pt-PT.xml
deleted file mode 100644
index 2bdc1492e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/sounds-pt-PT.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/tts-pt-BR.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/tts-pt-BR.xml
deleted file mode 100644
index 71b79c60a..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/tts-pt-BR.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/tts-pt-PT.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/tts-pt-PT.xml
deleted file mode 100644
index 4f03c5abd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/dir/tts-pt-PT.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/pt_BR.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/pt_BR.xml
deleted file mode 100644
index 690ee6974..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/pt_BR.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/pt_PT.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/pt_PT.xml
deleted file mode 100644
index c30b3612f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/pt_PT.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/sounds-pt-BR.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/sounds-pt-BR.xml
deleted file mode 100644
index 1ab472a71..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/sounds-pt-BR.xml
+++ /dev/null
@@ -1,404 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/sounds-pt-PT.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/sounds-pt-PT.xml
deleted file mode 100644
index 587d3fe5b..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/sounds-pt-PT.xml
+++ /dev/null
@@ -1,404 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/tts-pt-BR.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/tts-pt-BR.xml
deleted file mode 100644
index 4f770457e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/tts-pt-BR.xml
+++ /dev/null
@@ -1,239 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/tts-pt-PT.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/tts-pt-PT.xml
deleted file mode 100644
index c3dfc3a06..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/pt/vm/tts-pt-PT.xml
+++ /dev/null
@@ -1,238 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/demo/demo-ivr.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/demo/demo-ivr.xml
deleted file mode 100644
index 7de0d7fd0..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/demo/demo-ivr.xml
+++ /dev/null
@@ -1,154 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/demo/demo.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/demo/demo.xml
deleted file mode 100644
index 10c9dbc55..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/demo/demo.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/dir/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/dir/sounds.xml
deleted file mode 100644
index a0dcb2c0e..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/dir/sounds.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/dir/tts.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/dir/tts.xml
deleted file mode 100644
index f0aafa267..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/dir/tts.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/ru.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/ru.xml
deleted file mode 100644
index 5f52e768a..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/ru.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/vm/sounds.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/vm/sounds.xml
deleted file mode 100644
index 2ee9e6ec5..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/vm/sounds.xml
+++ /dev/null
@@ -1,374 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/vm/tts.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/vm/tts.xml
deleted file mode 100644
index 2de4b3781..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/lang/ru/vm/tts.xml
+++ /dev/null
@@ -1,249 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mime.types b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mime.types
deleted file mode 100644
index 34d5fc905..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mime.types
+++ /dev/null
@@ -1,983 +0,0 @@
-# This is a comment. I love comments.
-
-# This file controls what Internet media types are sent to the client for
-# given file extension(s). Sending the correct media type to the client
-# is important so they know how to handle the content of the file.
-# Extra types can either be added here or by using an AddType directive
-# in your config files. For more information about Internet media types,
-# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type
-# registry is at .
-
-# MIME type Extensions
-application/activemessage
-application/andrew-inset ez
-application/applefile
-application/atom+xml atom
-application/atomcat+xml atomcat
-application/atomicmail
-application/atomsvc+xml atomsvc
-application/auth-policy+xml
-application/batch-smtp
-application/beep+xml
-application/cals-1840
-application/ccxml+xml ccxml
-application/cellml+xml
-application/cnrp+xml
-application/commonground
-application/conference-info+xml
-application/cpl+xml
-application/csta+xml
-application/cstadata+xml
-application/cybercash
-application/davmount+xml davmount
-application/dca-rft
-application/dec-dx
-application/dialog-info+xml
-application/dicom
-application/dns
-application/dvcs
-application/ecmascript ecma
-application/edi-consent
-application/edi-x12
-application/edifact
-application/epp+xml
-application/eshop
-application/fastinfoset
-application/fastsoap
-application/fits
-application/font-tdpfr pfr
-application/h224
-application/http
-application/hyperstudio stk
-application/iges
-application/im-iscomposing+xml
-application/index
-application/index.cmd
-application/index.obj
-application/index.response
-application/index.vnd
-application/iotp
-application/ipp
-application/isup
-application/javascript js
-application/json json
-application/kpml-request+xml
-application/kpml-response+xml
-application/mac-binhex40 hqx
-application/mac-compactpro cpt
-application/macwriteii
-application/marc mrc
-application/mathematica ma nb mb
-application/mathml+xml mathml
-application/mbms-associated-procedure-description+xml
-application/mbms-deregister+xml
-application/mbms-envelope+xml
-application/mbms-msk+xml
-application/mbms-msk-response+xml
-application/mbms-protection-description+xml
-application/mbms-reception-report+xml
-application/mbms-register+xml
-application/mbms-register-response+xml
-application/mbms-user-service-description+xml
-application/mbox mbox
-application/mediaservercontrol+xml mscml
-application/mikey
-application/mp4 mp4s
-application/mpeg4-generic
-application/mpeg4-iod
-application/mpeg4-iod-xmt
-application/msword doc dot
-application/mxf mxf
-application/nasdata
-application/news-message-id
-application/news-transmission
-application/nss
-application/ocsp-request
-application/ocsp-response
-application/octet-stream bin dms lha lzh class so iso dmg dist distz pkg bpk dump elc
-application/oda oda
-application/oebps-package+xml
-application/ogg ogg
-application/parityfec
-application/pdf pdf
-application/pgp-encrypted pgp
-application/pgp-keys
-application/pgp-signature asc sig
-application/pics-rules prf
-application/pidf+xml
-application/pkcs10 p10
-application/pkcs7-mime p7m p7c
-application/pkcs7-signature p7s
-application/pkix-cert cer
-application/pkix-crl crl
-application/pkix-pkipath pkipath
-application/pkixcmp pki
-application/pls+xml pls
-application/poc-settings+xml
-application/postscript ai eps ps
-application/prs.alvestrand.titrax-sheet
-application/prs.cww cww
-application/prs.nprend
-application/prs.plucker
-application/qsig
-application/rdf+xml rdf
-application/reginfo+xml rif
-application/relax-ng-compact-syntax rnc
-application/remote-printing
-application/resource-lists+xml rl
-application/riscos
-application/rlmi+xml
-application/rls-services+xml rs
-application/rsd+xml rsd
-application/rss+xml rss
-application/rtf rtf
-application/rtx
-application/samlassertion+xml
-application/samlmetadata+xml
-application/sbml+xml sbml
-application/sdp sdp
-application/set-payment
-application/set-payment-initiation setpay
-application/set-registration
-application/set-registration-initiation setreg
-application/sgml
-application/sgml-open-catalog
-application/shf+xml shf
-application/sieve
-application/simple-filter+xml
-application/simple-message-summary
-application/simplesymbolcontainer
-application/slate
-application/smil
-application/smil+xml smi smil
-application/soap+fastinfoset
-application/soap+xml
-application/spirits-event+xml
-application/srgs gram
-application/srgs+xml grxml
-application/ssml+xml ssml
-application/timestamp-query
-application/timestamp-reply
-application/tve-trigger
-application/vemmi
-application/vividence.scriptfile
-application/vnd.3gpp.bsf+xml
-application/vnd.3gpp.pic-bw-large plb
-application/vnd.3gpp.pic-bw-small psb
-application/vnd.3gpp.pic-bw-var pvb
-application/vnd.3gpp.sms
-application/vnd.3gpp2.bcmcsinfo+xml
-application/vnd.3gpp2.sms
-application/vnd.3m.post-it-notes pwn
-application/vnd.accpac.simply.aso aso
-application/vnd.accpac.simply.imp imp
-application/vnd.acucobol acu
-application/vnd.acucorp atc acutc
-application/vnd.adobe.xdp+xml xdp
-application/vnd.adobe.xfdf xfdf
-application/vnd.aether.imp
-application/vnd.amiga.ami ami
-application/vnd.anser-web-certificate-issue-initiation cii
-application/vnd.anser-web-funds-transfer-initiation fti
-application/vnd.antix.game-component atx
-application/vnd.apple.installer+xml mpkg
-application/vnd.audiograph aep
-application/vnd.autopackage
-application/vnd.avistar+xml
-application/vnd.blueice.multipass mpm
-application/vnd.bmi bmi
-application/vnd.businessobjects rep
-application/vnd.cab-jscript
-application/vnd.canon-cpdl
-application/vnd.canon-lips
-application/vnd.cendio.thinlinc.clientconf
-application/vnd.chemdraw+xml cdxml
-application/vnd.chipnuts.karaoke-mmd mmd
-application/vnd.cinderella cdy
-application/vnd.cirpack.isdn-ext
-application/vnd.claymore cla
-application/vnd.clonk.c4group c4g c4d c4f c4p c4u
-application/vnd.commerce-battelle
-application/vnd.commonspace csp cst
-application/vnd.contact.cmsg cdbcmsg
-application/vnd.cosmocaller cmc
-application/vnd.crick.clicker clkx
-application/vnd.crick.clicker.keyboard clkk
-application/vnd.crick.clicker.palette clkp
-application/vnd.crick.clicker.template clkt
-application/vnd.crick.clicker.wordbank clkw
-application/vnd.criticaltools.wbs+xml wbs
-application/vnd.ctc-posml pml
-application/vnd.cups-pdf
-application/vnd.cups-postscript
-application/vnd.cups-ppd ppd
-application/vnd.cups-raster
-application/vnd.cups-raw
-application/vnd.curl curl
-application/vnd.cybank
-application/vnd.data-vision.rdz rdz
-application/vnd.denovo.fcselayout-link fe_launch
-application/vnd.dna dna
-application/vnd.dolby.mlp mlp
-application/vnd.dpgraph dpg
-application/vnd.dreamfactory dfac
-application/vnd.dvb.esgcontainer
-application/vnd.dvb.ipdcesgaccess
-application/vnd.dxr
-application/vnd.ecdis-update
-application/vnd.ecowin.chart mag
-application/vnd.ecowin.filerequest
-application/vnd.ecowin.fileupdate
-application/vnd.ecowin.series
-application/vnd.ecowin.seriesrequest
-application/vnd.ecowin.seriesupdate
-application/vnd.enliven nml
-application/vnd.epson.esf esf
-application/vnd.epson.msf msf
-application/vnd.epson.quickanime qam
-application/vnd.epson.salt slt
-application/vnd.epson.ssf ssf
-application/vnd.ericsson.quickcall
-application/vnd.eszigno3+xml es3 et3
-application/vnd.eudora.data
-application/vnd.ezpix-album ez2
-application/vnd.ezpix-package ez3
-application/vnd.fdf fdf
-application/vnd.ffsns
-application/vnd.fints
-application/vnd.flographit gph
-application/vnd.fluxtime.clip ftc
-application/vnd.framemaker fm frame maker
-application/vnd.frogans.fnc fnc
-application/vnd.frogans.ltf ltf
-application/vnd.fsc.weblaunch fsc
-application/vnd.fujitsu.oasys oas
-application/vnd.fujitsu.oasys2 oa2
-application/vnd.fujitsu.oasys3 oa3
-application/vnd.fujitsu.oasysgp fg5
-application/vnd.fujitsu.oasysprs bh2
-application/vnd.fujixerox.art-ex
-application/vnd.fujixerox.art4
-application/vnd.fujixerox.hbpl
-application/vnd.fujixerox.ddd ddd
-application/vnd.fujixerox.docuworks xdw
-application/vnd.fujixerox.docuworks.binder xbd
-application/vnd.fut-misnet
-application/vnd.fuzzysheet fzs
-application/vnd.genomatix.tuxedo txd
-application/vnd.google-earth.kml+xml kml
-application/vnd.google-earth.kmz kmz
-application/vnd.grafeq gqf gqs
-application/vnd.gridmp
-application/vnd.groove-account gac
-application/vnd.groove-help ghf
-application/vnd.groove-identity-message gim
-application/vnd.groove-injector grv
-application/vnd.groove-tool-message gtm
-application/vnd.groove-tool-template tpl
-application/vnd.groove-vcard vcg
-application/vnd.handheld-entertainment+xml zmm
-application/vnd.hbci hbci
-application/vnd.hcl-bireports
-application/vnd.hhe.lesson-player les
-application/vnd.hp-hpgl hpgl
-application/vnd.hp-hpid hpid
-application/vnd.hp-hps hps
-application/vnd.hp-jlyt jlt
-application/vnd.hp-pcl pcl
-application/vnd.hp-pclxl pclxl
-application/vnd.httphone
-application/vnd.hzn-3d-crossword x3d
-application/vnd.ibm.afplinedata
-application/vnd.ibm.electronic-media
-application/vnd.ibm.minipay mpy
-application/vnd.ibm.modcap afp listafp list3820
-application/vnd.ibm.rights-management irm
-application/vnd.ibm.secure-container sc
-application/vnd.igloader igl
-application/vnd.immervision-ivp ivp
-application/vnd.immervision-ivu ivu
-application/vnd.informedcontrol.rms+xml
-application/vnd.intercon.formnet xpw xpx
-application/vnd.intertrust.digibox
-application/vnd.intertrust.nncp
-application/vnd.intu.qbo qbo
-application/vnd.intu.qfx qfx
-application/vnd.ipunplugged.rcprofile rcprofile
-application/vnd.irepository.package+xml irp
-application/vnd.is-xpr xpr
-application/vnd.jam jam
-application/vnd.japannet-directory-service
-application/vnd.japannet-jpnstore-wakeup
-application/vnd.japannet-payment-wakeup
-application/vnd.japannet-registration
-application/vnd.japannet-registration-wakeup
-application/vnd.japannet-setstore-wakeup
-application/vnd.japannet-verification
-application/vnd.japannet-verification-wakeup
-application/vnd.jcp.javame.midlet-rms rms
-application/vnd.jisp jisp
-application/vnd.kahootz ktz ktr
-application/vnd.kde.karbon karbon
-application/vnd.kde.kchart chrt
-application/vnd.kde.kformula kfo
-application/vnd.kde.kivio flw
-application/vnd.kde.kontour kon
-application/vnd.kde.kpresenter kpr kpt
-application/vnd.kde.kspread ksp
-application/vnd.kde.kword kwd kwt
-application/vnd.kenameaapp htke
-application/vnd.kidspiration kia
-application/vnd.kinar kne knp
-application/vnd.koan skp skd skt skm
-application/vnd.liberty-request+xml
-application/vnd.llamagraphics.life-balance.desktop lbd
-application/vnd.llamagraphics.life-balance.exchange+xml lbe
-application/vnd.lotus-1-2-3 123
-application/vnd.lotus-approach apr
-application/vnd.lotus-freelance pre
-application/vnd.lotus-notes nsf
-application/vnd.lotus-organizer org
-application/vnd.lotus-screencam scm
-application/vnd.lotus-wordpro lwp
-application/vnd.macports.portpkg portpkg
-application/vnd.marlin.drm.actiontoken+xml
-application/vnd.marlin.drm.conftoken+xml
-application/vnd.marlin.drm.mdcf
-application/vnd.mcd mcd
-application/vnd.medcalcdata mc1
-application/vnd.mediastation.cdkey cdkey
-application/vnd.meridian-slingshot
-application/vnd.mfer mwf
-application/vnd.mfmp mfm
-application/vnd.micrografx.flo flo
-application/vnd.micrografx.igx igx
-application/vnd.mif mif
-application/vnd.minisoft-hp3000-save
-application/vnd.mitsubishi.misty-guard.trustweb
-application/vnd.mobius.daf daf
-application/vnd.mobius.dis dis
-application/vnd.mobius.mbk mbk
-application/vnd.mobius.mqy mqy
-application/vnd.mobius.msl msl
-application/vnd.mobius.plc plc
-application/vnd.mobius.txf txf
-application/vnd.mophun.application mpn
-application/vnd.mophun.certificate mpc
-application/vnd.motorola.flexsuite
-application/vnd.motorola.flexsuite.adsi
-application/vnd.motorola.flexsuite.fis
-application/vnd.motorola.flexsuite.gotap
-application/vnd.motorola.flexsuite.kmr
-application/vnd.motorola.flexsuite.ttc
-application/vnd.motorola.flexsuite.wem
-application/vnd.mozilla.xul+xml xul
-application/vnd.ms-artgalry cil
-application/vnd.ms-asf asf
-application/vnd.ms-cab-compressed cab
-application/vnd.ms-excel xls xlm xla xlc xlt xlw
-application/vnd.ms-fontobject eot
-application/vnd.ms-htmlhelp chm
-application/vnd.ms-ims ims
-application/vnd.ms-lrm lrm
-application/vnd.ms-playready.initiator+xml
-application/vnd.ms-powerpoint ppt pps pot
-application/vnd.ms-project mpp mpt
-application/vnd.ms-tnef
-application/vnd.ms-wmdrm.lic-chlg-req
-application/vnd.ms-wmdrm.lic-resp
-application/vnd.ms-wmdrm.meter-chlg-req
-application/vnd.ms-wmdrm.meter-resp
-application/vnd.ms-works wps wks wcm wdb
-application/vnd.ms-wpl wpl
-application/vnd.ms-xpsdocument xps
-application/vnd.mseq mseq
-application/vnd.msign
-application/vnd.music-niff
-application/vnd.musician mus
-application/vnd.ncd.control
-application/vnd.nervana
-application/vnd.netfpx
-application/vnd.neurolanguage.nlu nlu
-application/vnd.noblenet-directory nnd
-application/vnd.noblenet-sealer nns
-application/vnd.noblenet-web nnw
-application/vnd.nokia.catalogs
-application/vnd.nokia.conml+wbxml
-application/vnd.nokia.conml+xml
-application/vnd.nokia.isds-radio-presets
-application/vnd.nokia.iptv.config+xml
-application/vnd.nokia.landmark+wbxml
-application/vnd.nokia.landmark+xml
-application/vnd.nokia.landmarkcollection+xml
-application/vnd.nokia.n-gage.ac+xml
-application/vnd.nokia.n-gage.data ngdat
-application/vnd.nokia.n-gage.symbian.install n-gage
-application/vnd.nokia.ncd
-application/vnd.nokia.pcd+wbxml
-application/vnd.nokia.pcd+xml
-application/vnd.nokia.radio-preset rpst
-application/vnd.nokia.radio-presets rpss
-application/vnd.novadigm.edm edm
-application/vnd.novadigm.edx edx
-application/vnd.novadigm.ext ext
-application/vnd.oasis.opendocument.chart odc
-application/vnd.oasis.opendocument.chart-template otc
-application/vnd.oasis.opendocument.formula odf
-application/vnd.oasis.opendocument.formula-template otf
-application/vnd.oasis.opendocument.graphics odg
-application/vnd.oasis.opendocument.graphics-template otg
-application/vnd.oasis.opendocument.image odi
-application/vnd.oasis.opendocument.image-template oti
-application/vnd.oasis.opendocument.presentation odp
-application/vnd.oasis.opendocument.presentation-template otp
-application/vnd.oasis.opendocument.spreadsheet ods
-application/vnd.oasis.opendocument.spreadsheet-template ots
-application/vnd.oasis.opendocument.text odt
-application/vnd.oasis.opendocument.text-master otm
-application/vnd.oasis.opendocument.text-template ott
-application/vnd.oasis.opendocument.text-web oth
-application/vnd.obn
-application/vnd.olpc-sugar xo
-application/vnd.oma-scws-config
-application/vnd.oma-scws-http-request
-application/vnd.oma-scws-http-response
-application/vnd.oma.bcast.associated-procedure-parameter+xml
-application/vnd.oma.bcast.drm-trigger+xml
-application/vnd.oma.bcast.imd+xml
-application/vnd.oma.bcast.notification+xml
-application/vnd.oma.bcast.sgboot
-application/vnd.oma.bcast.sgdd+xml
-application/vnd.oma.bcast.sgdu
-application/vnd.oma.bcast.simple-symbol-container
-application/vnd.oma.bcast.smartcard-trigger+xml
-application/vnd.oma.bcast.sprov+xml
-application/vnd.oma.dd2+xml dd2
-application/vnd.oma.drm.risd+xml
-application/vnd.oma.group-usage-list+xml
-application/vnd.oma.poc.groups+xml
-application/vnd.oma.xcap-directory+xml
-application/vnd.omads-email+xml
-application/vnd.omads-file+xml
-application/vnd.omads-folder+xml
-application/vnd.omaloc-supl-init
-application/vnd.openofficeorg.extension oxt
-application/vnd.osa.netdeploy
-application/vnd.osgi.dp dp
-application/vnd.otps.ct-kip+xml
-application/vnd.palm prc pdb pqa oprc
-application/vnd.paos.xml
-application/vnd.pg.format str
-application/vnd.pg.osasli ei6
-application/vnd.piaccess.application-licence
-application/vnd.picsel efif
-application/vnd.poc.group-advertisement+xml
-application/vnd.pocketlearn plf
-application/vnd.powerbuilder6 pbd
-application/vnd.powerbuilder6-s
-application/vnd.powerbuilder7
-application/vnd.powerbuilder7-s
-application/vnd.powerbuilder75
-application/vnd.powerbuilder75-s
-application/vnd.preminet
-application/vnd.previewsystems.box box
-application/vnd.proteus.magazine mgz
-application/vnd.publishare-delta-tree qps
-application/vnd.pvi.ptid1 ptid
-application/vnd.pwg-multiplexed
-application/vnd.pwg-xhtml-print+xml
-application/vnd.qualcomm.brew-app-res
-application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb
-application/vnd.rapid
-application/vnd.recordare.musicxml mxl
-application/vnd.recordare.musicxml+xml
-application/vnd.renlearn.rlprint
-application/vnd.rn-realmedia rm
-application/vnd.ruckus.download
-application/vnd.s3sms
-application/vnd.scribus
-application/vnd.sealed.3df
-application/vnd.sealed.csf
-application/vnd.sealed.doc
-application/vnd.sealed.eml
-application/vnd.sealed.mht
-application/vnd.sealed.net
-application/vnd.sealed.ppt
-application/vnd.sealed.tiff
-application/vnd.sealed.xls
-application/vnd.sealedmedia.softseal.html
-application/vnd.sealedmedia.softseal.pdf
-application/vnd.seemail see
-application/vnd.sema sema
-application/vnd.semd semd
-application/vnd.semf semf
-application/vnd.shana.informed.formdata ifm
-application/vnd.shana.informed.formtemplate itp
-application/vnd.shana.informed.interchange iif
-application/vnd.shana.informed.package ipk
-application/vnd.simtech-mindmapper twd twds
-application/vnd.smaf mmf
-application/vnd.solent.sdkm+xml sdkm sdkd
-application/vnd.spotfire.dxp dxp
-application/vnd.spotfire.sfs sfs
-application/vnd.sss-cod
-application/vnd.sss-dtf
-application/vnd.sss-ntf
-application/vnd.street-stream
-application/vnd.sun.wadl+xml
-application/vnd.sus-calendar sus susp
-application/vnd.svd svd
-application/vnd.swiftview-ics
-application/vnd.syncml+xml xsm
-application/vnd.syncml.dm+wbxml bdm
-application/vnd.syncml.dm+xml xdm
-application/vnd.syncml.ds.notification
-application/vnd.tao.intent-module-archive tao
-application/vnd.tmobile-livetv tmo
-application/vnd.trid.tpt tpt
-application/vnd.triscape.mxs mxs
-application/vnd.trueapp tra
-application/vnd.truedoc
-application/vnd.ufdl ufd ufdl
-application/vnd.uiq.theme utz
-application/vnd.umajin umj
-application/vnd.unity unityweb
-application/vnd.uoml+xml uoml
-application/vnd.uplanet.alert
-application/vnd.uplanet.alert-wbxml
-application/vnd.uplanet.bearer-choice
-application/vnd.uplanet.bearer-choice-wbxml
-application/vnd.uplanet.cacheop
-application/vnd.uplanet.cacheop-wbxml
-application/vnd.uplanet.channel
-application/vnd.uplanet.channel-wbxml
-application/vnd.uplanet.list
-application/vnd.uplanet.list-wbxml
-application/vnd.uplanet.listcmd
-application/vnd.uplanet.listcmd-wbxml
-application/vnd.uplanet.signal
-application/vnd.vcx vcx
-application/vnd.vd-study
-application/vnd.vectorworks
-application/vnd.vidsoft.vidconference
-application/vnd.visio vsd vst vss vsw
-application/vnd.visionary vis
-application/vnd.vividence.scriptfile
-application/vnd.vsf vsf
-application/vnd.wap.sic
-application/vnd.wap.slc
-application/vnd.wap.wbxml wbxml
-application/vnd.wap.wmlc wmlc
-application/vnd.wap.wmlscriptc wmlsc
-application/vnd.webturbo wtb
-application/vnd.wfa.wsc
-application/vnd.wordperfect wpd
-application/vnd.wqd wqd
-application/vnd.wrq-hp3000-labelled
-application/vnd.wt.stf stf
-application/vnd.wv.csp+wbxml
-application/vnd.wv.csp+xml
-application/vnd.wv.ssp+xml
-application/vnd.xara xar
-application/vnd.xfdl xfdl
-application/vnd.xmpie.cpkg
-application/vnd.xmpie.dpkg
-application/vnd.xmpie.plan
-application/vnd.xmpie.ppkg
-application/vnd.xmpie.xlim
-application/vnd.yamaha.hv-dic hvd
-application/vnd.yamaha.hv-script hvs
-application/vnd.yamaha.hv-voice hvp
-application/vnd.yamaha.smaf-audio saf
-application/vnd.yamaha.smaf-phrase spf
-application/vnd.yellowriver-custom-menu cmp
-application/vnd.zzazz.deck+xml zaz
-application/voicexml+xml vxml
-application/watcherinfo+xml
-application/whoispp-query
-application/whoispp-response
-application/winhlp hlp
-application/wita
-application/wordperfect5.1
-application/wsdl+xml wsdl
-application/wspolicy+xml wspolicy
-application/x-ace-compressed ace
-application/x-bcpio bcpio
-application/x-bittorrent torrent
-application/x-bzip bz
-application/x-bzip2 bz2 boz
-application/x-cdlink vcd
-application/x-chat chat
-application/x-chess-pgn pgn
-application/x-compress
-application/x-cpio cpio
-application/x-csh csh
-application/x-director dcr dir dxr fgd
-application/x-dvi dvi
-application/x-futuresplash spl
-application/x-gtar gtar
-application/x-gzip
-application/x-hdf hdf
-application/x-latex latex
-application/x-ms-wmd wmd
-application/x-ms-wmz wmz
-application/x-msaccess mdb
-application/x-msbinder obd
-application/x-mscardfile crd
-application/x-msclip clp
-application/x-msdownload exe dll com bat msi
-application/x-msmediaview mvb m13 m14
-application/x-msmetafile wmf
-application/x-msmoney mny
-application/x-mspublisher pub
-application/x-msschedule scd
-application/x-msterminal trm
-application/x-mswrite wri
-application/x-netcdf nc cdf
-application/x-pkcs12 p12 pfx
-application/x-pkcs7-certificates p7b spc
-application/x-pkcs7-certreqresp p7r
-application/x-rar-compressed rar
-application/x-sh sh
-application/x-shar shar
-application/x-shockwave-flash swf
-application/x-stuffit sit
-application/x-stuffitx sitx
-application/x-sv4cpio sv4cpio
-application/x-sv4crc sv4crc
-application/x-tar tar
-application/x-tcl tcl
-application/x-tex tex
-application/x-texinfo texinfo texi
-application/x-ustar ustar
-application/x-wais-source src
-application/x-x509-ca-cert der crt
-application/x400-bp
-application/xcap-att+xml
-application/xcap-caps+xml
-application/xcap-el+xml
-application/xcap-error+xml
-application/xcap-ns+xml
-application/xenc+xml xenc
-application/xhtml+xml xhtml xht
-application/xml xml xsl
-application/xml-dtd dtd
-application/xml-external-parsed-entity
-application/xmpp+xml
-application/xop+xml xop
-application/xslt+xml xslt
-application/xspf+xml xspf
-application/xv+xml mxml xhvml xvml xvm
-application/zip zip
-audio/32kadpcm
-audio/3gpp
-audio/3gpp2
-audio/ac3
-audio/amr
-audio/amr-wb
-audio/amr-wb+
-audio/asc
-audio/basic au snd
-audio/bv16
-audio/bv32
-audio/clearmode
-audio/cn
-audio/dat12
-audio/dls
-audio/dsr-es201108
-audio/dsr-es202050
-audio/dsr-es202211
-audio/dsr-es202212
-audio/dvi4
-audio/eac3
-audio/evrc
-audio/evrc-qcp
-audio/evrc0
-audio/evrc1
-audio/evrcb
-audio/evrcb0
-audio/evrcb1
-audio/g722
-audio/g7221
-audio/g723
-audio/g726-16
-audio/g726-24
-audio/g726-32
-audio/g726-40
-audio/g728
-audio/g729
-audio/g7291
-audio/g729d
-audio/g729e
-audio/gsm
-audio/gsm-efr
-audio/ilbc
-audio/l16
-audio/l20
-audio/l24
-audio/l8
-audio/lpc
-audio/midi mid midi kar rmi
-audio/mobile-xmf
-audio/mp4 mp4a
-audio/mp4a-latm
-audio/mpa
-audio/mpa-robust
-audio/mpeg mpga mp2 mp2a mp3 m2a m3a
-audio/mpeg4-generic
-audio/parityfec
-audio/pcma
-audio/pcmu
-audio/prs.sid
-audio/qcelp
-audio/red
-audio/rtp-enc-aescm128
-audio/rtp-midi
-audio/rtx
-audio/smv
-audio/smv0
-audio/smv-qcp
-audio/sp-midi
-audio/t140c
-audio/t38
-audio/telephone-event
-audio/tone
-audio/vdvi
-audio/vmr-wb
-audio/vnd.3gpp.iufp
-audio/vnd.4sb
-audio/vnd.audiokoz
-audio/vnd.celp
-audio/vnd.cisco.nse
-audio/vnd.cmles.radio-events
-audio/vnd.cns.anp1
-audio/vnd.cns.inf1
-audio/vnd.digital-winds eol
-audio/vnd.dlna.adts
-audio/vnd.dolby.mlp
-audio/vnd.everad.plj
-audio/vnd.hns.audio
-audio/vnd.lucent.voice lvp
-audio/vnd.nokia.mobile-xmf
-audio/vnd.nortel.vbk
-audio/vnd.nuera.ecelp4800 ecelp4800
-audio/vnd.nuera.ecelp7470 ecelp7470
-audio/vnd.nuera.ecelp9600 ecelp9600
-audio/vnd.octel.sbc
-audio/vnd.qcelp
-audio/vnd.rhetorex.32kadpcm
-audio/vnd.sealedmedia.softseal.mpeg
-audio/vnd.vmx.cvsd
-audio/wav wav
-audio/x-aiff aif aiff aifc
-audio/x-mpegurl m3u
-audio/x-ms-wax wax
-audio/x-ms-wma wma
-audio/x-pn-realaudio ram ra
-audio/x-pn-realaudio-plugin rmp
-audio/x-wav wav
-chemical/x-cdx cdx
-chemical/x-cif cif
-chemical/x-cmdf cmdf
-chemical/x-cml cml
-chemical/x-csml csml
-chemical/x-pdb pdb
-chemical/x-xyz xyz
-image/bmp bmp
-image/cgm cgm
-image/fits
-image/g3fax g3
-image/gif gif
-image/ief ief
-image/jp2
-image/jpeg jpeg jpg jpe
-image/jpm
-image/jpx
-image/naplps
-image/png png
-image/prs.btif btif
-image/prs.pti
-image/svg+xml svg svgz
-image/t38
-image/tiff tiff tif
-image/tiff-fx
-image/vnd.adobe.photoshop psd
-image/vnd.cns.inf2
-image/vnd.djvu djvu djv
-image/vnd.dwg dwg
-image/vnd.dxf dxf
-image/vnd.fastbidsheet fbs
-image/vnd.fpx fpx
-image/vnd.fst fst
-image/vnd.fujixerox.edmics-mmr mmr
-image/vnd.fujixerox.edmics-rlc rlc
-image/vnd.globalgraphics.pgb
-image/vnd.microsoft.icon ico
-image/vnd.mix
-image/vnd.ms-modi mdi
-image/vnd.net-fpx npx
-image/vnd.sealed.png
-image/vnd.sealedmedia.softseal.gif
-image/vnd.sealedmedia.softseal.jpg
-image/vnd.svf
-image/vnd.wap.wbmp wbmp
-image/vnd.xiff xif
-image/x-cmu-raster ras
-image/x-cmx cmx
-image/x-icon
-image/x-pcx pcx
-image/x-pict pic pct
-image/x-portable-anymap pnm
-image/x-portable-bitmap pbm
-image/x-portable-graymap pgm
-image/x-portable-pixmap ppm
-image/x-rgb rgb
-image/x-xbitmap xbm
-image/x-xpixmap xpm
-image/x-xwindowdump xwd
-message/cpim
-message/delivery-status
-message/disposition-notification
-message/external-body
-message/http
-message/news
-message/partial
-message/rfc822 eml mime
-message/s-http
-message/sip
-message/sipfrag
-message/tracking-status
-model/iges igs iges
-model/mesh msh mesh silo
-model/vnd.dwf dwf
-model/vnd.flatland.3dml
-model/vnd.gdl gdl
-model/vnd.gs.gdl
-model/vnd.gtw gtw
-model/vnd.moml+xml
-model/vnd.mts mts
-model/vnd.parasolid.transmit.binary
-model/vnd.parasolid.transmit.text
-model/vnd.vtu vtu
-model/vrml wrl vrml
-multipart/alternative
-multipart/appledouble
-multipart/byteranges
-multipart/digest
-multipart/encrypted
-multipart/form-data
-multipart/header-set
-multipart/mixed
-multipart/parallel
-multipart/related
-multipart/report
-multipart/signed
-multipart/voice-message
-text/calendar ics ifb
-text/css css
-text/csv csv
-text/directory
-text/dns
-text/enriched
-text/html html htm
-text/parityfec
-text/plain txt text conf def list log in
-text/prs.fallenstein.rst
-text/prs.lines.tag dsc
-text/red
-text/rfc822-headers
-text/richtext rtx
-text/rtf
-text/rtp-enc-aescm128
-text/rtx
-text/sgml sgml sgm
-text/t140
-text/tab-separated-values tsv
-text/troff t tr roff man me ms
-text/uri-list uri uris urls
-text/vnd.abc
-text/vnd.curl
-text/vnd.dmclientscript
-text/vnd.esmertec.theme-descriptor
-text/vnd.fly fly
-text/vnd.fmi.flexstor flx
-text/vnd.in3d.3dml 3dml
-text/vnd.in3d.spot spot
-text/vnd.iptc.newsml
-text/vnd.iptc.nitf
-text/vnd.latex-z
-text/vnd.motorola.reflex
-text/vnd.ms-mediapackage
-text/vnd.net2phone.commcenter.command
-text/vnd.sun.j2me.app-descriptor jad
-text/vnd.trolltech.linguist
-text/vnd.wap.si
-text/vnd.wap.sl
-text/vnd.wap.wml wml
-text/vnd.wap.wmlscript wmls
-text/x-asm s asm
-text/x-c c cc cxx cpp h hh dic
-text/x-fortran f for f77 f90
-text/x-pascal p pas
-text/x-java-source java
-text/x-setext etx
-text/x-uuencode uu
-text/x-vcalendar vcs
-text/x-vcard vcf
-text/xml
-text/xml-external-parsed-entity
-video/3gpp 3gp
-video/3gpp-tt
-video/3gpp2 3g2
-video/bmpeg
-video/bt656
-video/celb
-video/dv
-video/h261 h261
-video/h263 h263
-video/h263-1998
-video/h263-2000
-video/h264 h264
-video/jpeg jpgv
-video/jpm jpm jpgm
-video/mj2 mj2 mjp2
-video/mp1s
-video/mp2p
-video/mp2t
-video/mp4 mp4 mp4v mpg4
-video/mp4v-es
-video/mpeg mpeg mpg mpe m1v m2v
-video/mpeg4-generic
-video/mpv
-video/nv
-video/parityfec
-video/pointer
-video/quicktime qt mov
-video/raw
-video/rtp-enc-aescm128
-video/rtx
-video/smpte292m
-video/vc1
-video/vnd.dlna.mpeg-tts
-video/vnd.fvt fvt
-video/vnd.hns.video
-video/vnd.motorola.video
-video/vnd.motorola.videop
-video/vnd.mpegurl mxu m4u
-video/vnd.nokia.interleaved-multimedia
-video/vnd.nokia.videovoip
-video/vnd.objectvideo
-video/vnd.sealed.mpeg1
-video/vnd.sealed.mpeg4
-video/vnd.sealed.swf
-video/vnd.sealedmedia.softseal.mov
-video/vnd.vivo viv
-video/x-fli fli
-video/x-ms-asf asf asx
-video/x-ms-wm wm
-video/x-ms-wmv wmv
-video/x-ms-wmx wmx
-video/x-ms-wvx wvx
-video/x-msvideo avi
-video/x-sgi-movie movie
-x-conference/x-cooltalk ice
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/loquendo-7-mrcp-v2.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/loquendo-7-mrcp-v2.xml
deleted file mode 100644
index dcf42821f..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/loquendo-7-mrcp-v2.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-1.0.0-mrcp-v1.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-1.0.0-mrcp-v1.xml
deleted file mode 100644
index 0700dec62..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-1.0.0-mrcp-v1.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-5.0-mrcp-v1.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-5.0-mrcp-v1.xml
deleted file mode 100644
index 3c4938a66..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-5.0-mrcp-v1.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-5.0-mrcp-v2.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-5.0-mrcp-v2.xml
deleted file mode 100644
index b53cba098..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/nuance-5.0-mrcp-v2.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/unimrcpserver-mrcp-v1.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/unimrcpserver-mrcp-v1.xml
deleted file mode 100644
index fe02b1582..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/unimrcpserver-mrcp-v1.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/vestec-mrcp-v1.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/vestec-mrcp-v1.xml
deleted file mode 100644
index cbde87ca5..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/vestec-mrcp-v1.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/voxeo-prophecy-8.0-mrcp-v1.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/voxeo-prophecy-8.0-mrcp-v1.xml
deleted file mode 100644
index fb1d0ee28..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/mrcp_profiles/voxeo-prophecy-8.0-mrcp-v1.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/notify-voicemail.tpl b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/notify-voicemail.tpl
deleted file mode 100644
index 365faa292..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/notify-voicemail.tpl
+++ /dev/null
@@ -1,44 +0,0 @@
-From: "${voicemail_caller_id_name}" <${voicemail_caller_id_number}@${voicemail_domain}>
-Date: ${RFC2822_DATE}
-To: <${voicemail_notify_email}>
-Subject: Voicemail from "${voicemail_caller_id_name}" <${voicemail_caller_id_number}> ${voicemail_message_len}
-X-Priority: ${voicemail_priority}
-X-Mailer: FreeSWITCH
-
-Content-Type: multipart/alternative;
- boundary="000XXX000"
-
---000XXX000
-Content-Type: text/plain; charset=ISO-8859-1; Format=Flowed
-Content-Disposition: inline
-Content-Transfer-Encoding: 7bit
-
-Created: ${voicemail_time}
-From: "${voicemail_caller_id_name}" <${voicemail_caller_id_number}>
-Duration: ${voicemail_message_len}
-Account: ${voicemail_account}@${voicemail_domain}
-
---000XXX000
-Content-Type: text/html; charset=ISO-8859-1
-Content-Disposition: inline
-Content-Transfer-Encoding: 7bit
-
-
-
-
-Voicemail from "${voicemail_caller_id_name}" <${voicemail_caller_id_number}> ${voicemail_message_len}
-
-
-
-
-
-Message From "${voicemail_caller_id_name}" ${voicemail_caller_id_number}
-
-Created: ${voicemail_time}
-Duration: ${voicemail_message_len}
-Account: ${voicemail_account}@${voicemail_domain}
-
-
-
-
---000XXX000--
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/external.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/external.xml
deleted file mode 100644
index 5070c8791..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/external.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/external/example.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/external/example.xml
deleted file mode 100644
index 2a4df31aa..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/external/example.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal-ipv6.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal-ipv6.xml
deleted file mode 100644
index 62b9708e8..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal-ipv6.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal.xml
deleted file mode 100644
index 3a5f0eb4c..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal.xml
+++ /dev/null
@@ -1,405 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal/example.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal/example.xml
deleted file mode 100644
index 10263b05a..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/sip_profiles/internal/example.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/skinny_profiles/internal.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/skinny_profiles/internal.xml
deleted file mode 100644
index 0ca4ed0c4..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/skinny_profiles/internal.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/tetris.ttml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/tetris.ttml
deleted file mode 100644
index 2e33a5d69..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/tetris.ttml
+++ /dev/null
@@ -1,69 +0,0 @@
-%(428,0,659,494)
-%(214,0,494,415)
-%(214,0,523,440)
-%(214,0,587,494)
-%(107,0,659,494)
-%(107,0,587,494)
-%(214,0,523,440)
-%(214,0,494,415)
-%(428,0,330,440)
-%(214,0,330,440)
-%(214,0,523,440)
-%(428,0,659,523)
-%(214,0,587,494)
-%(214,0,523,440)
-%(214,0,494,415)
-%(214,0,494,440)
-%(214,0,494,415)
-%(214,0,523,440)
-%(428,0,587,494)
-%(428,0,659,523)
-%(428,0,523,440)
-%(428,0,330,440)
-%(857,0,330,440)
-%(214,0,0,0)
-%(428,0,587,349)
-%(214,0,698,440)
-%(214,0,880,523)
-%(107,0,880,523)
-%(107,0,880,523)
-%(214,0,784,494)
-%(214,0,698,440)
-%(642,0,659,392)
-%(214,0,523,330)
-%(214,0,659,392)
-%(107,0,659,440)
-%(107,0,659,392)
-%(214,0,587,349)
-%(214,0,523,330)
-%(214,0,494,415)
-%(214,0,494,330)
-%(214,0,494,415)
-%(214,0,523,440)
-%(214,0,587,494)
-%(214,0,587,415)
-%(214,0,659,523)
-%(214,0,659,415)
-%(214,0,523,440)
-%(214,0,523,330)
-%(428,0,440,330)
-%(428,0,440,330)
-%(428,0,0,0)
-%(857,0,330,262)
-%(857,0,262,220)
-%(857,0,294,247)
-%(857,0,247,208)
-%(857,0,262,220)
-%(857,0,220,165)
-%(857,0,208,165)
-%(428,0,247,208)
-%(428,0,0,0)
-%(857,0,330,262)
-%(857,0,262,220)
-%(857,0,294,247)
-%(857,0,208,165)
-%(428,0,262,220)
-%(428,0,330,262)
-%(857,0,440,330)
-%(857,0,415,294)
-%(857,0,0,0)
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/vars.xml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/vars.xml
deleted file mode 100644
index 8c8d0cf90..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/vars.xml
+++ /dev/null
@@ -1,290 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/voicemail.tpl b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/voicemail.tpl
deleted file mode 100644
index 2774b78a9..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/voicemail.tpl
+++ /dev/null
@@ -1,44 +0,0 @@
-From: "${voicemail_caller_id_name}" <${voicemail_caller_id_number}@${voicemail_domain}>
-Date: ${RFC2822_DATE}
-To: <${voicemail_email}>
-Subject: Voicemail from "${voicemail_caller_id_name}" <${voicemail_caller_id_number}> ${voicemail_message_len}
-X-Priority: ${voicemail_priority}
-X-Mailer: FreeSWITCH
-
-Content-Type: multipart/alternative;
- boundary="000XXX000"
-
---000XXX000
-Content-Type: text/plain; charset=ISO-8859-1; Format=Flowed
-Content-Disposition: inline
-Content-Transfer-Encoding: 7bit
-
-Created: ${voicemail_time}
-From: "${voicemail_caller_id_name}" <${voicemail_caller_id_number}>
-Duration: ${voicemail_message_len}
-Account: ${voicemail_account}@${voicemail_domain}
-
---000XXX000
-Content-Type: text/html; charset=ISO-8859-1
-Content-Disposition: inline
-Content-Transfer-Encoding: 7bit
-
-
-
-
-Voicemail from "${voicemail_caller_id_name}" <${voicemail_caller_id_number}> ${voicemail_message_len}
-
-
-
-
-
-Message From "${voicemail_caller_id_name}" ${voicemail_caller_id_number}
-
-Created: ${voicemail_time}
-Duration: ${voicemail_message_len}
-Account: ${voicemail_account}@${voicemail_domain}
-
-
-
-
---000XXX000--
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/web-vm.tpl b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/web-vm.tpl
deleted file mode 100644
index 1c6563320..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/web-vm.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-FreeSWITCH Voicemail
-
-
-
-
-Voicemail Messages
-
-
-
-
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/yaml/extensions.yaml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/yaml/extensions.yaml
deleted file mode 100644
index f74fcf2e3..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/yaml/extensions.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-default:
- ${destination_number} =~ (9664):
- set: foo=bar
- playback: ${hold_music}
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/yaml/mod_yaml.yaml b/data/tutorials/fs_csv/freeswitch/etc/freeswitch/yaml/mod_yaml.yaml
deleted file mode 100644
index 65f1b05dd..000000000
--- a/data/tutorials/fs_csv/freeswitch/etc/freeswitch/yaml/mod_yaml.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-settings:
-#look for foo.conf.yaml when foo.conf is looked for in the xml
- bind_config: true
-
-
-
diff --git a/data/tutorials/fs_csv/freeswitch/etc/freeswitch_conf.tar.gz b/data/tutorials/fs_csv/freeswitch/etc/freeswitch_conf.tar.gz
new file mode 100644
index 000000000..aa3e2f5df
Binary files /dev/null and b/data/tutorials/fs_csv/freeswitch/etc/freeswitch_conf.tar.gz differ
diff --git a/data/tutorials/fs_json/README.md b/data/tutorials/fs_json/README.md
new file mode 100644
index 000000000..b3355dd50
--- /dev/null
+++ b/data/tutorials/fs_json/README.md
@@ -0,0 +1,18 @@
+Tutorial FS_JSON
+================
+
+Scenario:
+---------
+
+- FreeSWITCH with *vanilla* configuration, replacing *mod_cdr_csv* with *mod_json_cdr*.
+
+ - Modified following users (with configs in *etc/freeswitch/directory/default*): 1001-prepaid, 1002-postpaid, 1003-pseudoprepaid, 1004-rated.
+ - Have added inside default dialplan CGR own extensions just before routing towards users (*etc/freeswitch/dialplan/default.xml*).
+ - FreeSWITCH configured to generate default *http-json* CDRs.
+
+- **CGRateS** with following components:
+
+ - CGR-SM started as prepaid controller, with debits taking place at 5s intervals.
+ - CGR-Mediator compoenent attaching costs to the raw CDRs from FreeSWITCH_ inside CGR StorDB.
+ - CGR-CDRE exporting mediated CDRs from CGR StorDB (export path: */tmp*).
+ - CGR-History component keeping the archive of the rates modifications (path browsable with git client at */tmp/cgr_history*).
diff --git a/data/tutorials/fs_json/cgrates/etc/cgrates/cgrates.cfg b/data/tutorials/fs_json/cgrates/etc/cgrates/cgrates.cfg
new file mode 100644
index 000000000..1ac42f06e
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/etc/cgrates/cgrates.cfg
@@ -0,0 +1,116 @@
+# CGRateS Configuration file
+#
+# This file contains the default configuration hardcoded into CGRateS.
+# This is what you get when you load CGRateS with an empty configuration file.
+# [global] must exist in all files, rest of the configuration is inter-changeable.
+
+[global]
+# ratingdb_type = redis # Rating subsystem database: .
+# ratingdb_host = 127.0.0.1 # Rating subsystem database host address.
+# ratingdb_port = 6379 # Rating subsystem port to reach the database.
+# ratingdb_name = 10 # Rating subsystem database name to connect to.
+# ratingdb_user = # Rating subsystem username to use when connecting to database.
+# ratingdb_passwd = # Rating subsystem password to use when connecting to database.
+# accountdb_type = redis # Accounting subsystem database: .
+# accountdb_host = 127.0.0.1 # Accounting subsystem database host address.
+# accountdb_port = 6379 # Accounting subsystem port to reach the database.
+# accountdb_name = 11 # Accounting subsystem database name to connect to.
+# accountdb_user = # Accounting subsystem username to use when connecting to database.
+# accountdb_passwd = # Accounting subsystem password to use when connecting to database.
+# stordb_type = mysql # Stor database type to use:
+# stordb_host = 127.0.0.1 # The host to connect to. Values that start with / are for UNIX domain sockets.
+# stordb_port = 3306 # The port to reach the logdb.
+# stordb_name = cgrates # The name of the log database to connect to.
+# stordb_user = cgrates # Username to use when connecting to stordb.
+# stordb_passwd = CGRateS.org # Password to use when connecting to stordb.
+# dbdata_encoding = msgpack # The encoding used to store object data in strings:
+# rpc_encoding = json # RPC encoding used on APIs: .
+# default_reqtype = rated # Default request type to consider when missing from requests: <""|prepaid|postpaid|pseudoprepaid|rated>.
+# default_tor = 0 # Default Type of Record to consider when missing from requests.
+# default_tenant = 0 # Default Tenant to consider when missing from requests.
+# default_subject = 0 # Default rating Subject to consider when missing from requests.
+# rounding_method = *middle # Rounding method for floats/costs: <*up|*middle|*down>
+# rounding_decimals = 4 # Number of decimals to round float/costs at
+
+[balancer]
+# enabled = false # Start Balancer service: .
+# listen = 127.0.0.1:2012 # Balancer listen interface: <""|x.y.z.y:1234>.
+
+[rater]
+enabled = true # Enable RaterCDRSExportPath service: .
+# balancer = disabled # Register to Balancer as worker: .
+# listen = 127.0.0.1:2012 # Rater's listening interface: .
+
+[scheduler]
+enabled = true # Starts Scheduler service: .
+
+[cdrs]
+enabled = true # Start the CDR Server service: .
+# listen=127.0.0.1:2022 # CDRS's listening interface: .
+# extra_fields = # Extra fields to store in CDRs
+mediator = internal # Address where to reach the Mediator. Empty for disabling mediation. <""|internal>
+
+[cdre]
+# cdr_format = csv # Exported CDRs format
+# extra_fields = # List of extra fields to be exported out in CDRs
+export_dir = /tmp # Path where the exported CDRs will be placed
+
+[cdrc]
+# enabled = false # Enable CDR client functionality
+# cdrs = 127.0.0.1:2022 # Address where to reach CDR server
+# cdrs_method = http_cgr # Mechanism to use when posting CDRs on server
+# run_delay = 0 # Sleep interval in seconds between consecutive runs, 0 to use automation via inotify
+# cdr_type = freeswitch_csv # CDR file format .
+# cdr_in_dir = /var/log/cgrates/cdr/cdrc/in # Absolute path towards the directory where the CDRs are stored.
+# cdr_out_dir = /tmp # Absolute path towards the directory where processed CDRs will be moved.
+# cdr_source_id = freeswitch_csv # Free form field, tag identifying the source of the CDRs within CGRS database.
+# accid_field = 10 # Accounting id field identifier. Use index number in case of .csv cdrs.
+# reqtype_field = 16 # Request type field identifier. Use index number in case of .csv cdrs.
+# direction_field = ^*out # Direction field identifier. Use index numbers in case of .csv cdrs.
+# tenant_field = ^cgrates.org # Tenant field identifier. Use index numbers in case of .csv cdrs.
+# tor_field = ^call # Type of Record field identifier. Use index numbers in case of .csv cdrs.
+# account_field = 1 # Account field identifier. Use index numbers in case of .csv cdrs.
+# subject_field = 1 # Subject field identifier. Use index numbers in case of .csv CDRs.
+# destination_field = 2 # Destination field identifier. Use index numbers in case of .csv cdrs.
+# answer_time_field = 5 # Answer time field identifier. Use index numbers in case of .csv cdrs.
+# duration_field = 8 # Duration field identifier. Use index numbers in case of .csv cdrs.
+# extra_fields = read_codec:13,write_codec:14 # Extra fields identifiers. For .csv, format: :
+
+[mediator]
+enabled = true # Starts Mediator service: .
+# listen=internal # Mediator's listening interface: .
+# rater = 127.0.0.1:2012 # Address where to reach the Rater:
+# rater_reconnects = 3 # Number of reconnects to rater before giving up.
+# run_ids = # Identifiers of each extra mediation to run on CDRs
+# reqtype_fields = # Name of request type fields to be used during extra mediation. Use index number in case of .csv cdrs.
+# direction_fields = # Name of direction fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+# tenant_fields = # Name of tenant fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+# tor_fields = # Name of tor fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+# account_fields = # Name of account fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+# subject_fields = # Name of fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+# destination_fields = # Name of destination fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+# answer_time_fields = # Name of time_answer fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+# duration_fields = # Name of duration fields to be used during extra mediation. Use index numbers in case of .csv cdrs.
+
+[session_manager]
+enabled = true # Starts SessionManager service: .
+# switch_type = freeswitch # Defines the type of switch behind: .
+# rater = 127.0.0.1:2012 # Address where to reach the Rater.
+# rater_reconnects = 3 # Number of reconnects to rater before giving up.
+# debit_interval = 5 # Interval to perform debits on.
+
+[freeswitch]
+# server = 127.0.0.1:8021 # Adress where to connect to FreeSWITCH socket.
+# passwd = ClueCon # FreeSWITCH socket password.
+# reconnects = 5 # Number of attempts on connect failure.
+
+[history_server]
+enabled = true # Starts History service: .
+# listen = 127.0.0.1:2013 # Listening addres for history server:
+history_dir = /tmp/cgr_history # Location on disk where to store history files.
+# save_interval = 1s # Interval to save changed cache into .git archive
+
+[history_agent]
+# enabled = false # Starts History as a client: .
+# server = 127.0.0.1:2013 # Address where to reach the master history server:
+
diff --git a/data/tutorials/fs_json/cgrates/etc/default/cgrates b/data/tutorials/fs_json/cgrates/etc/default/cgrates
new file mode 100644
index 000000000..4e7add309
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/etc/default/cgrates
@@ -0,0 +1,17 @@
+# defaults file for CGRateS real-time charging system
+
+# start CGRateS init.d script?
+# starts with "true"
+ENABLE=true
+
+# Start with specific user/group
+#USER=cgrates
+#GROUP=cgrates
+
+# what extra options to give cgrates binary?
+# See cgr-engine -h for options
+#ENGINE_OPTS=''
+
+# Don't forget to create an appropriate config file,
+# else the CGRateS system will not start.
+
diff --git a/data/tutorials/fs_json/cgrates/etc/init.d/cgrates b/data/tutorials/fs_json/cgrates/etc/init.d/cgrates
new file mode 100755
index 000000000..e6c27e56f
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/etc/init.d/cgrates
@@ -0,0 +1,162 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: cgrates
+# Required-Start: $remote_fs $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: CGRateS real-time charging system
+# Description: Control CGRateS - carrier grade real-time charging system
+### END INIT INFO
+
+# Author: DanB
+#
+# Do NOT "set -e"
+
+# PATH should only include /usr/* if it runs after the mountnfs.sh script
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC="CGRateS real-time charging system"
+NAME=cgrates
+DAEMON=/usr/bin/cgr-engine
+USER=cgrates
+GROUP=cgrates
+TUTFOLDER=/usr/share/cgrates/tutorials/fs_json/cgrates
+ENGINE_OPTS=-config=$TUTFOLDER/etc/cgrates/cgrates.cfg
+PIDFILE=/tmp/cgr-engine_tutfsjson.pid
+SCRIPTNAME=$TUTFOLDER/etc/init.d/$NAME
+DEFAULTS=$TUTFOLDER/etc/default/$NAME
+ENABLE=false
+
+# Exit if the package is not installed
+[ -x "$DAEMON" ] || exit 0
+
+# Read configuration variable file if it is present
+[ -r $DEFAULTS ] && . $DEFAULTS
+
+# Load the VERBOSE setting and other rcS variables
+. /lib/init/vars.sh
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
+# and status_of_proc is working.
+. /lib/lsb/init-functions
+
+if [ "$ENABLE" != "true" ]; then
+ echo "$DESC not yet configured. Edit $DEFAULTS first."
+ exit 0
+fi
+
+
+#
+# Function that starts the daemon/service
+#
+do_start()
+{
+ # Return
+ # 0 if daemon has been started
+ # 1 if daemon was already running
+ # 2 if daemon could not be started
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+ || return 1
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --exec $DAEMON --chuid $USER:$GROUP --background -- \
+ $ENGINE_OPTS \
+ || return 2
+}
+
+#
+# Function that stops the daemon/service
+#
+do_stop()
+{
+ # Return
+ # 0 if daemon has been stopped
+ # 1 if daemon was already stopped
+ # 2 if daemon could not be stopped
+ # other if a failure occurred
+ start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
+ RETVAL="$?"
+ [ "$RETVAL" = 2 ] && return 2
+ # Wait for children to finish too if this is a daemon that forks
+ # and if the daemon is only ever run from this initscript.
+ # If the above conditions are not satisfied then add some other code
+ # that waits for the process to drop all resources that could be
+ # needed by services started subsequently. A last resort is to
+ # sleep for some time.
+ start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+ [ "$?" = 2 ] && return 2
+ # Many daemons don't delete their pidfiles when they exit.
+ rm -f $PIDFILE
+ return "$RETVAL"
+}
+
+#
+# Function that sends a SIGHUP to the daemon/service
+#
+do_reload() {
+ #
+ # If the daemon can reload its configuration without
+ # restarting (for example, when it is sent a SIGHUP),
+ # then implement that here.
+ #
+ start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+ return 0
+}
+
+case "$1" in
+ start)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
+ do_start
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ esac
+ ;;
+ stop)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ esac
+ ;;
+ status)
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+ ;;
+ #reload|force-reload)
+ #
+ # If do_reload() is not implemented then leave this commented out
+ # and leave 'force-reload' as an alias for 'restart'.
+ #
+ #log_daemon_msg "Reloading $DESC" "$NAME"
+ #do_reload
+ #log_end_msg $?
+ #;;
+ restart|force-reload)
+ #
+ # If the "reload" option is implemented then remove the
+ # 'force-reload' alias
+ #
+ log_daemon_msg "Restarting $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1)
+ do_start
+ case "$?" in
+ 0) log_end_msg 0 ;;
+ 1) log_end_msg 1 ;; # Old process is still running
+ *) log_end_msg 1 ;; # Failed to start
+ esac
+ ;;
+ *)
+ # Failed to stop
+ log_end_msg 1
+ ;;
+ esac
+ ;;
+ *)
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+ exit 3
+ ;;
+esac
+
+:
diff --git a/data/tariffplans/fs_germany_prep1/AccountActions.csv b/data/tutorials/fs_json/cgrates/tariffplans/AccountActions.csv
similarity index 83%
rename from data/tariffplans/fs_germany_prep1/AccountActions.csv
rename to data/tutorials/fs_json/cgrates/tariffplans/AccountActions.csv
index cf7bc4026..455f5318c 100644
--- a/data/tariffplans/fs_germany_prep1/AccountActions.csv
+++ b/data/tutorials/fs_json/cgrates/tariffplans/AccountActions.csv
@@ -3,4 +3,3 @@ cgrates.org,1001,*out,PREPAID_10,STANDARD_TRIGGERS
cgrates.org,1002,*out,PREPAID_10,STANDARD_TRIGGERS
cgrates.org,1003,*out,PREPAID_10,STANDARD_TRIGGERS
cgrates.org,1004,*out,PREPAID_10,STANDARD_TRIGGERS
-cgrates.org,1005,*out,PREPAID_10,STANDARD_TRIGGERS
diff --git a/data/tariffplans/prepaid1centpsec/ActionTimings.csv b/data/tutorials/fs_json/cgrates/tariffplans/ActionTimings.csv
similarity index 100%
rename from data/tariffplans/prepaid1centpsec/ActionTimings.csv
rename to data/tutorials/fs_json/cgrates/tariffplans/ActionTimings.csv
diff --git a/data/tutorials/fs_json/cgrates/tariffplans/ActionTriggers.csv b/data/tutorials/fs_json/cgrates/tariffplans/ActionTriggers.csv
new file mode 100644
index 000000000..2f7729eec
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/tariffplans/ActionTriggers.csv
@@ -0,0 +1,4 @@
+#Tag,BalanceType,Direction,ThresholdType,ThresholdValue,DestinationTag,ActionsTag,Weight
+STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,,LOG_WARNING,10
+STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,,LOG_WARNING,10
+STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,FS_USERS,LOG_WARNING,10
diff --git a/data/tariffplans/fs_germany_prep1/Actions.csv b/data/tutorials/fs_json/cgrates/tariffplans/Actions.csv
similarity index 87%
rename from data/tariffplans/fs_germany_prep1/Actions.csv
rename to data/tutorials/fs_json/cgrates/tariffplans/Actions.csv
index 620e17566..97cef134a 100644
--- a/data/tariffplans/fs_germany_prep1/Actions.csv
+++ b/data/tutorials/fs_json/cgrates/tariffplans/Actions.csv
@@ -1,2 +1,3 @@
#ActionsTag,Action,BalanceType,Direction,Units,ExpiryTime,DestinationTag,RatingSubject,BalanceWeight,ExtraParameters,Weight
PREPAID_10,*topup_reset,*monetary,*out,10,*unlimited,*any,,10,,10
+LOG_WARNING,*log,,,,,,,,,10
diff --git a/data/tutorials/fs_json/cgrates/tariffplans/DestinationRates.csv b/data/tutorials/fs_json/cgrates/tariffplans/DestinationRates.csv
new file mode 100644
index 000000000..7c94d0974
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/tariffplans/DestinationRates.csv
@@ -0,0 +1,7 @@
+#Tag,DestinationsTag,RatesTag
+DR_1002_20CNT,DST_1002,RT_20CNT
+DR_1002_10CNT,DST_1002,RT_10CNT
+DR_1003_20CNT,DST_1003,RT_40CNT
+DR_1003_10CNT,DST_1003,RT_10CNT
+DR_FS_40CNT,DST_FS,RT_40CNT
+DR_FS_10CNT,DST_FS,RT_10CNT
diff --git a/data/tutorials/fs_json/cgrates/tariffplans/Destinations.csv b/data/tutorials/fs_json/cgrates/tariffplans/Destinations.csv
new file mode 100644
index 000000000..1c19d97ea
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/tariffplans/Destinations.csv
@@ -0,0 +1,4 @@
+#Tag,Prefix
+DST_1002,1002
+DST_1003,1003
+DST_FS,10
diff --git a/data/tutorials/fs_json/cgrates/tariffplans/README.md b/data/tutorials/fs_json/cgrates/tariffplans/README.md
new file mode 100644
index 000000000..3b4102574
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/tariffplans/README.md
@@ -0,0 +1,20 @@
+Tutorial FS_JSON
+================
+
+Scenario:
+---------
+
+- Create the necessary timings (always, asap, peak, offpeak).
+- Configure 3 destinations (1002, 1003 and 10 used as catch all rule).
+- As rating we configure the following:
+
+ - Rate id: *RT_10CNT* with connect fee of 20cents, 10cents per minute for the first 60s in 60s increments followed by 5cents per minute in 1s increments.
+ - Rate id: *RT_20CNT* with connect fee of 40cents, 20cents per minute for the first 60s in 60s increments, followed by 10 cents per minute charged in 1s increments.
+ - Rate id: *RT_40CNT* with connect fee of 80cents, 40cents per minute for the first 60s in 60s increments, follwed by 20cents per minute charged in 10s increments.
+ - Will charge by default *RT_40CNT* for all FreeSWITCH_ destinations during peak times (Monday-Friday 08:00-19:00) and *RT_10CNT* during offpeatimes (rest).
+ - Account 1001 will receive a special *deal* for 1002 and 1003 destinations during peak times with *RT_20CNT*, otherwise same as default rating.
+
+- Create 4 accounts (equivalent of 2 FreeSWITCH default test users - 1001, 1002, 1003, 1004).
+- 1001, 1002, 1003, 1004 will receive 10units of *\*monetary* balance.
+- For each balance created, attach 3 triggers to control the balance: log on balance=2, log on balance=20, log on 5 mins talked towards 10xx destination.
+
diff --git a/data/tutorials/fs_json/cgrates/tariffplans/Rates.csv b/data/tutorials/fs_json/cgrates/tariffplans/Rates.csv
new file mode 100644
index 000000000..4cfb2dd9e
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/tariffplans/Rates.csv
@@ -0,0 +1,7 @@
+#Tag,ConnectFee,Rate,RateUnit,RateIncrement,GroupIntervalStart,RoundingMethod,RoundingDecimals
+RT_10CNT,0.2,0.1,60s,60s,0s,*up,4
+RT_10CNT,0,0.05,60s,1s,60s,*up,4
+RT_20CNT,0.4,0.2,60s,60s,0s,*up,4
+RT_20CNT,0,0.1,60s,1s,60s,*up,4
+RT_40CNT,0.8,0.4,60s,30s,0s,*up,4
+RT_40CNT,0,0.2,60s,10s,60s,*up,4
diff --git a/data/tutorials/fs_json/cgrates/tariffplans/RatingPlans.csv b/data/tutorials/fs_json/cgrates/tariffplans/RatingPlans.csv
new file mode 100644
index 000000000..dde7f25bb
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/tariffplans/RatingPlans.csv
@@ -0,0 +1,17 @@
+#Tag,DestinationRatesTag,TimingTag,Weight
+RP_RETAIL1,DR_FS_40CNT,PEAK,10
+RP_RETAIL1,DR_FS_10CNT,OFFPEAK_MORNING,10
+RP_RETAIL1,DR_FS_10CNT,OFFPEAK_EVENING,10
+RP_RETAIL1,DR_FS_10CNT,OFFPEAK_WEEKEND,10
+RP_RETAIL2,DR_1002_20CNT,PEAK,10
+RP_RETAIL2,DR_1003_20CNT,PEAK,10
+RP_RETAIL2,DR_FS_40CNT,PEAK,10
+RP_RETAIL2,DR_1002_10CNT,OFFPEAK_MORNING,10
+RP_RETAIL2,DR_1002_10CNT,OFFPEAK_EVENING,10
+RP_RETAIL2,DR_1002_10CNT,OFFPEAK_WEEKEND,10
+RP_RETAIL2,DR_1003_10CNT,OFFPEAK_MORNING,10
+RP_RETAIL2,DR_1003_10CNT,OFFPEAK_EVENING,10
+RP_RETAIL2,DR_1003_10CNT,OFFPEAK_WEEKEND,10
+RP_RETAIL2,DR_FS_10CNT,OFFPEAK_MORNING,10
+RP_RETAIL2,DR_FS_10CNT,OFFPEAK_EVENING,10
+RP_RETAIL2,DR_FS_10CNT,OFFPEAK_WEEKEND,10
diff --git a/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv b/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv
new file mode 100644
index 000000000..248ea06ca
--- /dev/null
+++ b/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv
@@ -0,0 +1,3 @@
+#Tenant,TOR,Direction,Subject,ActivationTime,RatingPlanTag,FallbackSubject
+cgrates.org,call,*out,*any,2014-01-14T00:00:00Z,RP_RETAIL1,
+cgrates.org,call,*out,1001,2014-01-14T00:00:00Z,RP_RETAIL2,
diff --git a/data/tariffplans/fs_germany_prep1/Timings.csv b/data/tutorials/fs_json/cgrates/tariffplans/Timings.csv
similarity index 52%
rename from data/tariffplans/fs_germany_prep1/Timings.csv
rename to data/tutorials/fs_json/cgrates/tariffplans/Timings.csv
index 9b24e6975..2c5ad517e 100644
--- a/data/tariffplans/fs_germany_prep1/Timings.csv
+++ b/data/tutorials/fs_json/cgrates/tariffplans/Timings.csv
@@ -1,7 +1,7 @@
#Tag,Years,Months,MonthDays,WeekDays,Time
ALWAYS,*any,*any,*any,*any,00:00:00
ASAP,*any,*any,*any,*any,*asap
-OFFPEAK_MORNING,*any,*any,*any,1;2;3;4;5,00:00:00
PEAK,*any,*any,*any,1;2;3;4;5,08:00:00
-OFFPEAK_EVENING,*any,*any,*any,1;2;3;4;5,20:00:00
-WEEKEND,*any,*any,*any,6;7,00:00:00
+OFFPEAK_MORNING,*any,*any,*any,1,00:00:00
+OFFPEAK_EVENING,*any,*any,*any,1;2;3;4;5,19:00:00
+OFFPEAK_WEEKEND,*any,*any,*any,6;7,00:00:00
diff --git a/data/tutorials/fs_json/freeswitch/etc/default/freeswitch b/data/tutorials/fs_json/freeswitch/etc/default/freeswitch
new file mode 100755
index 000000000..752045062
--- /dev/null
+++ b/data/tutorials/fs_json/freeswitch/etc/default/freeswitch
@@ -0,0 +1,2 @@
+# /etc/default/freeswitch
+DAEMON_OPTS="-rp -nonat"
diff --git a/data/tutorials/fs_json/freeswitch/etc/freeswitch_conf.tar.gz b/data/tutorials/fs_json/freeswitch/etc/freeswitch_conf.tar.gz
new file mode 100644
index 000000000..8e9a573c9
Binary files /dev/null and b/data/tutorials/fs_json/freeswitch/etc/freeswitch_conf.tar.gz differ
diff --git a/data/tutorials/fs_json/freeswitch/etc/init.d/freeswitch b/data/tutorials/fs_json/freeswitch/etc/init.d/freeswitch
new file mode 100755
index 000000000..2be40c31b
--- /dev/null
+++ b/data/tutorials/fs_json/freeswitch/etc/init.d/freeswitch
@@ -0,0 +1,135 @@
+#!/bin/sh
+### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*-
+### BEGIN INIT INFO
+# Provides: freeswitch
+# Required-Start: $network $remote_fs $local_fs
+# Required-Stop: $network $remote_fs $local_fs
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: FreeSWITCH Softswitch
+# Description: FreeSWITCH Softswitch
+### END INIT INFO
+
+# Author: Travis Cross
+
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC=freeswitch
+NAME=freeswitch
+DAEMON=/usr/bin/freeswitch
+USER=freeswitch
+GROUP=freeswitch
+TUTDIR=/usr/share/cgrates/tutorials/fs_json/freeswitch
+CONFDIR=$TUTDIR/etc/$NAME
+DEFAULTS=$TUTDIR/etc/default/freeswitch
+RUNDIR=/var/run/$NAME
+LOGDIR=/var/log/freeswitch
+PIDFILE=$RUNDIR/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+WORKDIR=/var/lib/$NAME
+DBDIR=$WORKDIR/db/
+DAEMON_ARGS="-rp -conf $CONFDIR -db $DBDIR -log $LOGDIR -u $USER -g $GROUP -nonat -nc"
+
+
+[ -x $DAEMON ] || exit 0
+[ -r DEFAULTS ] && . DEFAULTS
+. /lib/init/vars.sh
+. /lib/lsb/init-functions
+
+do_start() {
+ if ! [ -f $CONFDIR/freeswitch.xml ]; then
+ echo "$NAME is not configured so not starting.">&2
+ echo "Please review /usr/share/doc/$NAME/README.Debian">&2
+ return 3
+ fi
+
+ # Directory in /var/run may disappear on reboot (e.g. when tmpfs used for /var/run).
+ mkdir -p $RUNDIR
+ chown -R $USER:$GROUP $RUNDIR
+ chmod -R ug=rwX,o= $RUNDIR
+
+ start-stop-daemon --start --quiet \
+ --pidfile $PIDFILE --exec $DAEMON --name $NAME --user $USER \
+ --test > /dev/null \
+ || return 1
+ ulimit -s 240
+ start-stop-daemon --start --quiet \
+ --pidfile $PIDFILE --exec $DAEMON --name $NAME --user $USER \
+ --chdir $WORKDIR -- $DAEMON_ARGS $DAEMON_OPTS \
+ || return 2
+ return 0
+}
+
+stop_fs() {
+ start-stop-daemon --stop --quiet \
+ --pidfile $PIDFILE --name $NAME --user $USER \
+ --retry=TERM/30/KILL/5
+}
+
+stop_fs_children() {
+ start-stop-daemon --stop --quiet \
+ --exec $DAEMON \
+ --oknodo --retry=0/30/KILL/5
+}
+
+do_stop() {
+ stop_fs
+ RETVAL="$?"
+ [ "$RETVAL" -eq 2 ] && return 2
+ stop_fs_children
+ [ "$?" -eq 2 ] && return 2
+ rm -f $PIDFILE
+ return "$RETVAL"
+}
+
+do_reload() {
+ start-stop-daemon --stop --quiet \
+ --pidfile $PIDFILE --name $NAME --user $USER \
+ --signal HUP
+}
+
+case "$1" in
+ start)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
+ do_start
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ esac
+ ;;
+ stop)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ esac
+ ;;
+ status)
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+ ;;
+ reload|force-reload)
+ log_daemon_msg "Reloading $DESC" "$NAME"
+ do_reload
+ log_end_msg $?
+ ;;
+ restart)
+ log_daemon_msg "Restarting $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1)
+ do_start
+ case "$?" in
+ 0) log_end_msg 0 ;;
+ 1|*) log_end_msg 1 ;;
+ esac
+ ;;
+ *) log_end_msg 1 ;;
+ esac
+ ;;
+ *)
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+ exit 3
+ ;;
+esac
+
+exit 0
diff --git a/docs/tut_freeswitch_csv.rst b/docs/tut_freeswitch_csv.rst
index 80de413e2..3a89f5012 100644
--- a/docs/tut_freeswitch_csv.rst
+++ b/docs/tut_freeswitch_csv.rst
@@ -78,6 +78,7 @@ To verify that all actions successfully performed, we use following *cgr-console
cgr-console get_cache_age 1002
cgr-console get_cache_age RP_RETAIL
cgr-console get_cache_age *out:cgrates.org:call:*any
+ cgr-console get_cache_age LOG_WARNING
- Make sure all our balances were topped-up:
@@ -148,6 +149,19 @@ To check that there are no debits during or by the end of the call, but when the
The user 1004 is marked as *rated* inside FreeSWITCH_ hence his calls not interact in any way with accounting subsystem. The only action perfomed by **CGRateS** related to his calls wil be rating/mediation of his CDRs.
+Fraud detection
+~~~~~~~~~~~~~~~
+
+Since we have configured some action triggers (more than 20 units of balance topped-up or less than 2 and more than 5 units spent on *FS_USERS* we should be notified over syslog when things like unexpected events happen (eg: fraud with more than 20 units topped-up). To verify this mechanism simply add some random units into one account's balance:
+
+::
+
+ cgr-console add_balance cgrates.org 1003 21
+ tail -f /var/log/syslog -n 20
+
+*Note*: The actions are only executed once, in order to be repetive they need to be reset (via automated or manual process).
+
+
CDR processing
--------------
diff --git a/docs/tut_freeswitch_installs.rst b/docs/tut_freeswitch_installs.rst
index 0c41bb1b7..a3f98facf 100644
--- a/docs/tut_freeswitch_installs.rst
+++ b/docs/tut_freeswitch_installs.rst
@@ -12,7 +12,7 @@ Some components of **CGRateS** (whether enabled or not is up to the administrato
- Redis_ to serve as Rating and Accounting DB for **CGRateS**.
- MySQL_ to serve as StorDB for **CGRateS**.
-We will install them in one shoot using the command bellow.
+We will install them in one shot using the command bellow.
::
@@ -26,7 +26,7 @@ FreeSWITCH_
More information regarding installing FreeSWITCH_ on Debian can be found on it's official `installation wiki `_.
-To get FreeSWITCH_ installed and configured, we have choosen the simplest method, out of *vanilla* packages.
+To get FreeSWITCH_ installed and configured, we have choosen the simplest method, out of *vanilla* packages plus one individual module we need: *mod-json-cdr*.
We got FreeSWITCH_ installed via following commands:
@@ -37,7 +37,7 @@ We got FreeSWITCH_ installed via following commands:
cd /etc/apt/sources.list.d/
wget http://apt.itsyscom.com/repos/apt/conf/freeswitch.apt.list
apt-get update
- apt-get install freeswitch-meta-vanilla
+ apt-get install freeswitch-meta-vanilla freeswitch-mod-json-cdr
Once installed we proceed with loading the configuration out of specific tutorial cases bellow.
@@ -65,13 +65,6 @@ As described in post-install section, we will need to set up the MySQL_ database
./setup_cgr_db.sh root CGRateS.org localhost
-Since by default FreeSWITCH_ restricts access to *.csv* CDRs to it's own user, we will add the *cgrates* user to freeswitch group.
-
-::
-
- usermod -a -G freeswitch cgrates
-
-
At this point we have **CGRateS** installed but not yet configured. To facilitate the understanding and speed up the process, **CGRateS** comes already with the configurations used in this tutorial, available in the */usr/share/cgrates/tutorials* folder, so we will load them custom on each tutorial case.
diff --git a/docs/tut_freeswitch_json.rst b/docs/tut_freeswitch_json.rst
index 348ea2277..cdca3830a 100644
--- a/docs/tut_freeswitch_json.rst
+++ b/docs/tut_freeswitch_json.rst
@@ -1,2 +1,177 @@
-Case 2: FreeSWITCH_ generating real-time http *json* CDRs
-=========================================================
+FreeSWITCH_ generating *http-json* CDRs
+=======================================
+
+Scenario
+--------
+
+- FreeSWITCH with *vanilla* configuration, replacing *mod_cdr_csv* with *mod_json_cdr*.
+
+ - Modified following users (with configs in *etc/freeswitch/directory/default*): 1001-prepaid, 1002-postpaid, 1003-pseudoprepaid, 1004-rated.
+ - Have added inside default dialplan CGR own extensions just before routing towards users (*etc/freeswitch/dialplan/default.xml*).
+ - FreeSWITCH configured to generate default *http-json* CDRs.
+
+- **CGRateS** with following components:
+
+ - CGR-SM started as prepaid controller, with debits taking place at 5s intervals.
+ - CGR-Mediator compoenent attaching costs to the raw CDRs from FreeSWITCH_ inside CGR StorDB.
+ - CGR-CDRE exporting mediated CDRs from CGR StorDB (export path: */tmp*).
+ - CGR-History component keeping the archive of the rates modifications (path browsable with git client at */tmp/cgr_history*).
+
+
+Starting FreeSWITCH_ with custom configuration
+----------------------------------------------
+
+::
+
+ /usr/share/cgrates/tutorials/fs_json/freeswitch/etc/init.d/freeswitch start
+
+To verify that FreeSWITCH_ is running we run the console command:
+
+::
+
+ fs_cli -x status
+
+
+Starting **CGRateS** with custom configuration
+----------------------------------------------
+
+::
+
+ /usr/share/cgrates/tutorials/fs_json/cgrates/etc/init.d/cgrates start
+
+Check that cgrates is running
+
+::
+
+ cgr-console status
+
+
+Loading **CGRateS** Tariff Plans
+--------------------------------
+
+For our tutorial we load again prepared data out of shared folder, containing following rules:
+
+- Create the necessary timings (always, asap, peak, offpeak).
+- Configure 3 destinations (1002, 1003 and 10 used as catch all rule).
+- As rating we configure the following:
+
+ - Rate id: *RT_10CNT* with connect fee of 20cents, 10cents per minute for the first 60s in 60s increments followed by 5cents per minute in 1s increments.
+ - Rate id: *RT_20CNT* with connect fee of 40cents, 20cents per minute for the first 60s in 60s increments, followed by 10 cents per minute charged in 1s increments.
+ - Rate id: *RT_40CNT* with connect fee of 80cents, 40cents per minute for the first 60s in 60s increments, follwed by 20cents per minute charged in 10s increments.
+ - Will charge by default *RT_40CNT* for all FreeSWITCH_ destinations during peak times (Monday-Friday 08:00-19:00) and *RT_10CNT* during offpeatimes (rest).
+ - Account 1001 will receive a special *deal* for 1002 and 1003 destinations during peak times with *RT_20CNT*, otherwise having default rating.
+
+- Create 4 accounts (equivalent of 2 FreeSWITCH default test users - 1001, 1002, 1003, 1004).
+- 1001, 1002, 1003, 1004 will receive 10units of *\*monetary* balance.
+- For each balance created, attach 3 triggers to control the balance: log on balance=2, log on balance=20, log on 5 mins talked towards 10xx destination.
+
+::
+
+ cgr-loader -verbose -path=/usr/share/cgrates/tutorials/fs_json/cgrates/tariffplans
+
+To verify that all actions successfully performed, we use following *cgr-console* commands:
+
+- Make sure our rates were loaded successfully and they are already in cache:
+
+ ::
+
+ cgr-console get_cache_stats
+ cgr-console get_cache_age 1002
+ cgr-console get_cache_age RP_RETAIL1
+ cgr-console get_cache_age *out:cgrates.org:call:*any
+ cgr-console get_cache_age LOG_WARNING
+
+- Make sure all our balances were topped-up:
+
+ ::
+
+ cgr-console get_balance cgrates.org 1001
+ cgr-console get_balance cgrates.org 1002
+ cgr-console get_balance cgrates.org 1003
+ cgr-console get_balance cgrates.org 1004
+
+- Query call costs so we can see our calls will have expected costs (final cost will result as sum of *ConnectFee* and *Cost* fields):
+
+ ::
+
+ cgr-console get_cost call cgrates.org 1001 1002 *now 20s
+ cgr-console get_cost call cgrates.org 1001 1002 *now 1m25s
+ cgr-console get_cost call cgrates.org 1001 1003 *now 20s
+ cgr-console get_cost call cgrates.org 1001 1003 *now 1m25s
+ cgr-console get_cost call cgrates.org 1001 1004 *now 20s
+ cgr-console get_cost call cgrates.org 1001 1004 *now 1m25s
+
+
+Test calls
+----------
+
+
+1001 -> 1002
+~~~~~~~~~~~~
+
+Since the user 1001 is marked as *prepaid* inside FreeSWITCH_ directory configuration, calling between 1001 and 1002 should generate pre-auth and prepaid debits which can be checked with *get_balance* command integrated within *cgr-console* tool. Charging will be done based on time of day as described above.
+
+*Note*: An important particularity to note here is the ability of **CGRateS** SessionManager to refund units booked in advance (eg: if debit occurs every 10s and rate increments are set to 1s, the SessionManager will be smart enough to refund pre-booked credits for calls stoped in the middle of debit interval).
+
+Check that 1001 balance is properly debitted, during the call:
+
+::
+
+ cgr-console get_balance cgrates.org 1001
+
+
+1002 -> 1001
+~~~~~~~~~~~~
+
+The user 1002 is marked as *postpaid* inside FreeSWITCH_ hence his calls will be debited at the end of the call instead of during a call and his balance will be able to go on negative without influencing his new calls (no pre-auth).
+
+To check that we had debits we use again console command, this time not during the call but at the end of it:
+
+::
+
+ cgr-console get_balance cgrates.org 1002
+
+
+1003 -> 1001
+~~~~~~~~~~~~
+
+The user 1003 is marked as *pseudoprepaid* inside FreeSWITCH_ hence his calls will be considered same as prepaid (no call setups possible on negative balance due to pre-auth mechanism) but not handled automatically by session manager. His call costs will be calculated directly out of CDRs and balance updated by the time when mediation process occurs. This is sometimes a good compromise of prepaid running without influencing performance (there are no recurrent call debits during a call).
+
+To check that there are no debits during or by the end of the call, but when the CDR reaches the CDRS component(which is close to real-time in case of *http-json* CDRs):
+
+::
+
+ cgr-console get_balance cgrates.org 1003
+
+
+1004 -> 1001
+~~~~~~~~~~~~
+
+The user 1004 is marked as *rated* inside FreeSWITCH_ hence his calls not interact in any way with accounting subsystem. The only action perfomed by **CGRateS** related to his calls wil be rating/mediation of his CDRs.
+
+
+Fraud detection
+~~~~~~~~~~~~~~~
+
+Since we have configured some action triggers (more than 20 units of balance topped-up or less than 2 and more than 5 units spent on *FS_USERS* we should be notified over syslog when things like unexpected events happen (eg: fraud with more than 20 units topped-up). To verify this mechanism simply add some random units into one account's balance:
+
+::
+
+ cgr-console add_balance cgrates.org 1003 21
+ tail -f /var/log/syslog -n 20
+
+*Note*: The actions are only executed once, in order to be repetive they need to be reset (via automated or manual process).
+
+
+CDR processing
+--------------
+
+At the end of each call FreeSWITCH_ will issue a http post with the CDR. This will reach inside **CGRateS** through the *CDRS* component (close to real-time). Once in-there it will be instantly mediated and it is ready to be exported:
+
+::
+
+ cgr-console export_cdrs csv
+
+
+.. _FreeSWITCH: http://www.freeswitch.org/
+.. _Jitsi: http://www.jitsi.org/
diff --git a/engine/action.go b/engine/action.go
index c79196e84..1518ba071 100644
--- a/engine/action.go
+++ b/engine/action.go
@@ -24,6 +24,7 @@ import (
"fmt"
"net/http"
"sort"
+ "time"
)
/*
@@ -53,6 +54,7 @@ const (
RESET_COUNTER = "*reset_counter"
RESET_COUNTERS = "*reset_counters"
CALL_URL = "*call_url"
+ CALL_URL_ASYNC = "*call_url_async"
UNLIMITED = "*unlimited"
)
@@ -84,12 +86,15 @@ func getActionFunc(typ string) (actionTypeFunc, bool) {
return resetCountersAction, true
case CALL_URL:
return callUrl, true
+ case CALL_URL_ASYNC:
+ return callUrlAsync, true
}
return nil, false
}
func logAction(ub *UserBalance, a *Action) (err error) {
- Logger.Info(fmt.Sprintf("%v %+v", a.BalanceId, a.Balance))
+ ubMarshal,_ := json.Marshal(ub)
+ Logger.Info(fmt.Sprintf("Threshold reached, balance: %s", ubMarshal))
return
}
@@ -185,6 +190,27 @@ func callUrl(ub *UserBalance, a *Action) error {
return err
}
+// Does not block for posts, no error reports
+func callUrlAsync(ub *UserBalance, a *Action) error {
+ body, err := json.Marshal(ub)
+ if err != nil {
+ return err
+ }
+ go func() {
+ for i := 0; i < 5; i++ { // Loop so we can increase the success rate on best effort
+ if _, err = http.Post(a.ExtraParameters, "application/json", bytes.NewBuffer(body)); err == nil {
+ break // Success, no need to reinterate
+ } else if i == 4 { // Last iteration, syslog the warning
+ Logger.Warning(fmt.Sprintf(" WARNING: Failed calling url: [%s], error: [%s], balance: %s", a.ExtraParameters, err.Error(), body))
+ break
+ }
+ time.Sleep(time.Duration(i) * time.Minute)
+ }
+
+ }()
+ return nil
+}
+
// Structure to store actions according to weight
type Actions []*Action
diff --git a/engine/action_timing.go b/engine/action_timing.go
index 0ade0e0c0..5df8db1bb 100644
--- a/engine/action_timing.go
+++ b/engine/action_timing.go
@@ -44,7 +44,7 @@ type ActionTiming struct {
stCache time.Time // cached time of the next start
}
-type ActionTimings []*ActionTiming
+type ActionPlan []*ActionTiming
func (at *ActionTiming) GetNextStartTime() (t time.Time) {
if !at.stCache.IsZero() {
@@ -297,7 +297,7 @@ func (at *ActionTiming) String_DISABLED() string {
}
// Helper to remove ActionTiming members based on specific filters, empty data means no always match
-func RemActionTiming(ats ActionTimings, actionTimingId, balanceId string) ActionTimings {
+func RemActionTiming(ats ActionPlan, actionTimingId, balanceId string) ActionPlan {
for idx, at := range ats {
if len(actionTimingId)!=0 && at.Id!=actionTimingId { // No Match for ActionTimingId, no need to move further
continue
diff --git a/engine/actions_test.go b/engine/actions_test.go
index 99622aca7..57c8bc9b3 100644
--- a/engine/actions_test.go
+++ b/engine/actions_test.go
@@ -434,7 +434,7 @@ func TestActionTimingsRemoveMember(t *testing.T) {
UserBalanceIds: []string{"three", "four"},
ActionsId: "TEST_ACTIONS2",
}
- ats := ActionTimings{at1, at2}
+ ats := ActionPlan{at1, at2}
if outAts := RemActionTiming(ats, "", "four"); len(outAts[1].UserBalanceIds) != 1 {
t.Error("Expecting fewer balance ids", outAts[1].UserBalanceIds)
}
@@ -444,7 +444,7 @@ func TestActionTimingsRemoveMember(t *testing.T) {
if ats = RemActionTiming(ats, "some_uuid22", "");len(ats) != 1 {
t.Error("Expecting fewer actionTimings members", ats)
}
- ats2 := ActionTimings{at1, at2}
+ ats2 := ActionPlan{at1, at2}
if ats2 = RemActionTiming(ats2, "", ""); len(ats2) != 0 {
t.Error("Should have no members anymore", ats2)
}
diff --git a/engine/loader_csv.go b/engine/loader_csv.go
index a926ed1b3..38424fb0e 100644
--- a/engine/loader_csv.go
+++ b/engine/loader_csv.go
@@ -144,7 +144,7 @@ func (csvr *CSVReader) ShowStatistics() {
// actions
log.Print("Actions: ", len(csvr.actions))
// action timings
- log.Print("Action timings: ", len(csvr.actionsTimings))
+ log.Print("Action plans: ", len(csvr.actionsTimings))
// account actions
log.Print("Account actions: ", len(csvr.accountActions))
}
@@ -195,7 +195,7 @@ func (csvr *CSVReader) WriteToDatabase(flush, verbose bool) (err error) {
}
}
if verbose {
- log.Print("Action timings")
+ log.Print("Action plans")
}
for k, ats := range csvr.actionsTimings {
err = accountingStorage.SetActionTimings(k, ats)
@@ -273,6 +273,9 @@ func (csvr *CSVReader) LoadTimings() (err error) {
}
for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() {
tag := record[0]
+ if _, exists := csvr.timings[tag]; exists {
+ log.Print("Warning: duplicate timing found: ", tag)
+ }
csvr.timings[tag] = NewTiming(record...)
}
return
@@ -497,9 +500,9 @@ func (csvr *CSVReader) LoadActions() (err error) {
}
func (csvr *CSVReader) LoadActionTimings() (err error) {
- csvReader, fp, err := csvr.readerFunc(csvr.actiontimingsFn, csvr.sep, utils.ACTION_TIMINGS_NRCOLS)
+ csvReader, fp, err := csvr.readerFunc(csvr.actiontimingsFn, csvr.sep, utils.ACTION_PLANS_NRCOLS)
if err != nil {
- log.Print("Could not load action timings file: ", err)
+ log.Print("Could not load action plans file: ", err)
// allow writing of the other values
return nil
}
@@ -510,11 +513,11 @@ func (csvr *CSVReader) LoadActionTimings() (err error) {
tag := record[0]
_, exists := csvr.actions[record[1]]
if !exists {
- return errors.New(fmt.Sprintf("ActionTiming: Could not load the action for tag: %v", record[1]))
+ return errors.New(fmt.Sprintf("ActionPlan: Could not load the action for tag: %v", record[1]))
}
t, exists := csvr.timings[record[2]]
if !exists {
- return errors.New(fmt.Sprintf("ActionTiming: Could not load the timing for tag: %v", record[2]))
+ return errors.New(fmt.Sprintf("ActionPlan: Could not load the timing for tag: %v", record[2]))
}
weight, err := strconv.ParseFloat(record[3], 64)
if err != nil {
@@ -663,6 +666,22 @@ func (csvr *CSVReader) GetLoadedIds(categ string) ([]string, error) {
i++
}
return keys, nil
+ case RATING_PROFILE_PREFIX:
+ keys := make([]string, len(csvr.ratingProfiles))
+ i := 0
+ for k := range csvr.ratingProfiles {
+ keys[i] = k
+ i++
+ }
+ return keys, nil
+ case ACTION_PREFIX: // actionsTimings
+ keys := make([]string, len(csvr.actions))
+ i := 0
+ for k := range csvr.actions {
+ keys[i] = k
+ i++
+ }
+ return keys, nil
case ACTION_TIMING_PREFIX: // actionsTimings
keys := make([]string, len(csvr.actionsTimings))
i := 0
diff --git a/engine/loader_db.go b/engine/loader_db.go
index d82d0f3c6..ed9c4516a 100644
--- a/engine/loader_db.go
+++ b/engine/loader_db.go
@@ -104,7 +104,7 @@ func (dbr *DbReader) ShowStatistics() {
// actions
log.Print("Actions: ", len(dbr.actions))
// action timings
- log.Print("Action timings: ", len(dbr.actionsTimings))
+ log.Print("Action plans: ", len(dbr.actionsTimings))
// account actions
log.Print("Account actions: ", len(dbr.accountActions))
}
@@ -151,7 +151,7 @@ func (dbr *DbReader) WriteToDatabase(flush, verbose bool) (err error) {
}
}
if verbose {
- log.Print("Action timings")
+ log.Print("Action plans")
}
for k, ats := range dbr.actionsTimings {
err = accountingStorage.SetActionTimings(k, ats)
@@ -492,9 +492,9 @@ func (dbr *DbReader) LoadAccountActions() (err error) {
ActionTriggers: aTriggers,
}
dbr.accountActions = append(dbr.accountActions, ub)
- aTimings, exists := dbr.actionsTimings[aa.ActionTimingsId]
+ aTimings, exists := dbr.actionsTimings[aa.ActionPlanId]
if !exists {
- log.Printf("Could not get action timing for tag %v", aa.ActionTimingsId)
+ log.Printf("Could not get action timing for tag %v", aa.ActionPlanId)
// must not continue here
}
for _, at := range aTimings {
@@ -513,23 +513,23 @@ func (dbr *DbReader) LoadAccountActionsFiltered(qriedAA *utils.TPAccountActions)
id := accountAction.KeyId()
var actionsIds []string // collects action ids
// action timings
- if accountAction.ActionTimingsId != "" {
+ if accountAction.ActionPlanId != "" {
// get old userBalanceIds
var exitingUserBalanceIds []string
- existingActionTimings, err := dbr.accountDb.GetActionTimings(accountAction.ActionTimingsId)
+ existingActionTimings, err := dbr.accountDb.GetActionTimings(accountAction.ActionPlanId)
if err == nil && len(existingActionTimings) > 0 {
// all action timings from a specific tag shuld have the same list of user balances from the first one
exitingUserBalanceIds = existingActionTimings[0].UserBalanceIds
}
- actionTimingsMap, err := dbr.storDb.GetTPActionTimings(dbr.tpid, accountAction.ActionTimingsId)
+ actionTimingsMap, err := dbr.storDb.GetTPActionTimings(dbr.tpid, accountAction.ActionPlanId)
if err != nil {
return err
} else if len(actionTimingsMap) == 0 {
- return fmt.Errorf("No ActionTimings with id <%s>", accountAction.ActionTimingsId)
+ return fmt.Errorf("No ActionTimings with id <%s>", accountAction.ActionPlanId)
}
var actionTimings []*ActionTiming
- ats := actionTimingsMap[accountAction.ActionTimingsId]
+ ats := actionTimingsMap[accountAction.ActionPlanId]
for _, at := range ats {
// Check action exists before saving it inside actionTiming key
// ToDo: try saving the key after the actions was retrieved in order to save one query here.
@@ -547,7 +547,7 @@ func (dbr *DbReader) LoadAccountActionsFiltered(qriedAA *utils.TPAccountActions)
t := timingsMap[at.TimingId]
actTmg := &ActionTiming{
Id: utils.GenUUID(),
- Tag: accountAction.ActionTimingsId,
+ Tag: accountAction.ActionPlanId,
Weight: at.Weight,
Timing: &RateInterval{
Timing: &RITiming{
@@ -576,7 +576,7 @@ func (dbr *DbReader) LoadAccountActionsFiltered(qriedAA *utils.TPAccountActions)
}
// write action timings
- err = dbr.accountDb.SetActionTimings(accountAction.ActionTimingsId, actionTimings)
+ err = dbr.accountDb.SetActionTimings(accountAction.ActionPlanId, actionTimings)
if err != nil {
return err
}
@@ -718,6 +718,22 @@ func (dbr *DbReader) GetLoadedIds(categ string) ([]string, error) {
i++
}
return keys, nil
+ case RATING_PROFILE_PREFIX:
+ keys := make([]string, len(dbr.ratingProfiles))
+ i := 0
+ for k := range dbr.ratingProfiles {
+ keys[i] = k
+ i++
+ }
+ return keys, nil
+ case ACTION_PREFIX: // actions
+ keys := make([]string, len(dbr.actions))
+ i := 0
+ for k := range dbr.actions {
+ keys[i] = k
+ i++
+ }
+ return keys, nil
case ACTION_TIMING_PREFIX: // actionsTimings
keys := make([]string, len(dbr.actionsTimings))
i := 0
diff --git a/engine/loader_helpers.go b/engine/loader_helpers.go
index d189734f2..602436237 100644
--- a/engine/loader_helpers.go
+++ b/engine/loader_helpers.go
@@ -201,7 +201,7 @@ var FileValidators = map[string]*FileLineRegexValidator{
utils.ACTIONS_CSV: &FileLineRegexValidator{utils.ACTIONS_NRCOLS,
regexp.MustCompile(`(?:\w+\s*),(?:\*\w+\s*),(?:\*\w+\s*)?,(?:\*out\s*)?,(?:\d+\s*)?,(?:\*\w+\s*|\+\d+[smh]\s*|\d+\s*)?,(?:\*any|\w+\s*)?,(?:\*\w+\s*)?,(?:\d+\.?\d*\s*)?,(?:\S+\s*)?,(?:\d+\.?\d*\s*)$`),
"Tag([0-9A-Za-z_]),Action([0-9A-Za-z_]),BalanceType([*a-z_]),Direction(*out),Units([0-9]),ExpiryTime(*[a-z_]|+[0-9][smh]|[0-9])DestinationTag([0-9A-Za-z_]|*all),RatingSubject([0-9A-Za-z_]),BalanceWeight([0-9.]),ExtraParameters([0-9A-Za-z_:;]),Weight([0-9.])"},
- utils.ACTION_TIMINGS_CSV: &FileLineRegexValidator{utils.ACTION_TIMINGS_NRCOLS,
+ utils.ACTION_PLANS_CSV: &FileLineRegexValidator{utils.ACTION_PLANS_NRCOLS,
regexp.MustCompile(`(?:\w+\s*,\s*){3}(?:\d+\.?\d*){1}`),
"Tag([0-9A-Za-z_]),ActionsTag([0-9A-Za-z_]),TimingTag([0-9A-Za-z_]),Weight([0-9.])"},
utils.ACTION_TRIGGERS_CSV: &FileLineRegexValidator{utils.ACTION_TRIGGERS_NRCOLS,
diff --git a/engine/loader_helpers_test.go b/engine/loader_helpers_test.go
index 6faa92e71..94e07a582 100644
--- a/engine/loader_helpers_test.go
+++ b/engine/loader_helpers_test.go
@@ -251,7 +251,7 @@ func TestActionsValidator(t *testing.T) {
func TestActionTimingsValidator(t *testing.T) {
reader := bufio.NewReader(strings.NewReader(actionTimingsSample))
- lnValidator := FileValidators[utils.ACTION_TIMINGS_CSV]
+ lnValidator := FileValidators[utils.ACTION_PLANS_CSV]
lineNr := 0
for {
lineNr++
diff --git a/engine/loader_local_test.go b/engine/loader_local_test.go
index afad41703..b358e5bea 100644
--- a/engine/loader_local_test.go
+++ b/engine/loader_local_test.go
@@ -127,7 +127,7 @@ func TestLoadFromCSV(t *testing.T) {
path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.RATING_PLANS_CSV),
path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.RATING_PROFILES_CSV),
path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTIONS_CSV),
- path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTION_TIMINGS_CSV),
+ path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTION_PLANS_CSV),
path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTION_TRIGGERS_CSV),
path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACCOUNT_ACTIONS_CSV),
)
diff --git a/engine/server.go b/engine/server.go
new file mode 100644
index 000000000..091c5de55
--- /dev/null
+++ b/engine/server.go
@@ -0,0 +1,96 @@
+/*
+Rating system designed to be used in VoIP Carriers World
+Copyright (C) 2013 ITsysCOM
+
+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
+*/
+
+package engine
+
+import (
+ "fmt"
+ "log"
+ "net"
+ "net/http"
+ "net/rpc"
+ "net/rpc/jsonrpc"
+)
+
+type Server struct {
+ rpcEnabled bool
+ httpEnabled bool
+}
+
+func (s *Server) RpcRegister(rcvr interface{}) {
+ rpc.Register(rcvr)
+ s.rpcEnabled = true
+}
+
+func (s *Server) RpcRegisterName(name string, rcvr interface{}) {
+ rpc.RegisterName(name, rcvr)
+ s.rpcEnabled = true
+}
+
+func (s *Server) RegisterHttpFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) {
+ http.HandleFunc(pattern, handler)
+ s.httpEnabled = true
+}
+
+func (s *Server) ServeJSON(addr string) {
+ if !s.rpcEnabled {
+ return
+ }
+ lJSON, e := net.Listen("tcp", addr)
+ if e != nil {
+ log.Fatal("listen error:", e)
+ }
+ for {
+ conn, err := lJSON.Accept()
+ if err != nil {
+ Logger.Err(fmt.Sprintf(" Accept error: %v", conn))
+ continue
+ }
+
+ Logger.Info(fmt.Sprintf(" New incoming connection: %v", conn.RemoteAddr()))
+ go jsonrpc.ServeConn(conn)
+ }
+
+}
+
+func (s *Server) ServeGOB(addr string) {
+ if !s.rpcEnabled {
+ return
+ }
+ lGOB, e := net.Listen("tcp", addr)
+ if e != nil {
+ log.Fatal("listen error:", e)
+ }
+ for {
+ conn, err := lGOB.Accept()
+ if err != nil {
+ Logger.Err(fmt.Sprintf(" Accept error: %v", conn))
+ continue
+ }
+
+ Logger.Info(fmt.Sprintf(" New incoming connection: %v", conn.RemoteAddr()))
+ go rpc.ServeConn(conn)
+ }
+}
+
+func (s *Server) ServeHTTP(addr string) {
+ if !s.httpEnabled {
+ return
+ }
+ http.ListenAndServe(addr, nil)
+}
diff --git a/engine/storage_interface.go b/engine/storage_interface.go
index f3d138194..1cdeab979 100644
--- a/engine/storage_interface.go
+++ b/engine/storage_interface.go
@@ -32,7 +32,7 @@ import (
)
const (
- ACTION_TIMING_PREFIX = "atm_"
+ ACTION_TIMING_PREFIX = "apl_"
RATING_PLAN_PREFIX = "rpl_"
RATING_PROFILE_PREFIX = "rpf_"
ACTION_PREFIX = "act_"
@@ -89,9 +89,9 @@ type AccountingStorage interface {
SetSharedGroup(string, *SharedGroup) error
GetUserBalance(string) (*UserBalance, error)
SetUserBalance(*UserBalance) error
- GetActionTimings(string) (ActionTimings, error)
- SetActionTimings(string, ActionTimings) error
- GetAllActionTimings() (map[string]ActionTimings, error)
+ GetActionTimings(string) (ActionPlan, error)
+ SetActionTimings(string, ActionPlan) error
+ GetAllActionTimings() (map[string]ActionPlan, error)
}
type CdrStorage interface {
diff --git a/engine/storage_map.go b/engine/storage_map.go
index 5a3b59186..f70fb6441 100644
--- a/engine/storage_map.go
+++ b/engine/storage_map.go
@@ -265,7 +265,7 @@ func (ms *MapStorage) SetUserBalance(ub *UserBalance) (err error) {
return
}
-func (ms *MapStorage) GetActionTimings(key string) (ats ActionTimings, err error) {
+func (ms *MapStorage) GetActionTimings(key string) (ats ActionPlan, err error) {
if values, ok := ms.dict[ACTION_TIMING_PREFIX+key]; ok {
err = ms.ms.Unmarshal(values, &ats)
} else {
@@ -274,7 +274,7 @@ func (ms *MapStorage) GetActionTimings(key string) (ats ActionTimings, err error
return
}
-func (ms *MapStorage) SetActionTimings(key string, ats ActionTimings) (err error) {
+func (ms *MapStorage) SetActionTimings(key string, ats ActionPlan) (err error) {
if len(ats) == 0 {
// delete the key
delete(ms.dict, ACTION_TIMING_PREFIX+key)
@@ -285,13 +285,13 @@ func (ms *MapStorage) SetActionTimings(key string, ats ActionTimings) (err error
return
}
-func (ms *MapStorage) GetAllActionTimings() (ats map[string]ActionTimings, err error) {
- ats = make(map[string]ActionTimings)
+func (ms *MapStorage) GetAllActionTimings() (ats map[string]ActionPlan, err error) {
+ ats = make(map[string]ActionPlan)
for key, value := range ms.dict {
if !strings.Contains(key, ACTION_TIMING_PREFIX) {
continue
}
- var tempAts ActionTimings
+ var tempAts ActionPlan
err = ms.ms.Unmarshal(value, &tempAts)
ats[key[len(ACTION_TIMING_PREFIX):]] = tempAts
}
diff --git a/engine/storage_mongo.go b/engine/storage_mongo.go
index b54214383..dfe22954d 100644
--- a/engine/storage_mongo.go
+++ b/engine/storage_mongo.go
@@ -99,7 +99,7 @@ type AcKeyValue struct {
type AtKeyValue struct {
Key string
- Value ActionTimings
+ Value ActionPlan
}
type LogCostEntry struct {
@@ -194,20 +194,20 @@ func (ms *MongoStorage) SetUserBalance(ub *UserBalance) error {
return ms.db.C("userbalances").Insert(ub)
}
-func (ms *MongoStorage) GetActionTimings(key string) (ats ActionTimings, err error) {
+func (ms *MongoStorage) GetActionTimings(key string) (ats ActionPlan, err error) {
result := AtKeyValue{}
err = ms.db.C("actiontimings").Find(bson.M{"key": key}).One(&result)
return result.Value, err
}
-func (ms *MongoStorage) SetActionTimings(key string, ats ActionTimings) error {
+func (ms *MongoStorage) SetActionTimings(key string, ats ActionPlan) error {
return ms.db.C("actiontimings").Insert(&AtKeyValue{key, ats})
}
-func (ms *MongoStorage) GetAllActionTimings() (ats map[string]ActionTimings, err error) {
+func (ms *MongoStorage) GetAllActionTimings() (ats map[string]ActionPlan, err error) {
result := AtKeyValue{}
iter := ms.db.C("actiontimings").Find(nil).Iter()
- ats = make(map[string]ActionTimings)
+ ats = make(map[string]ActionPlan)
for iter.Next(&result) {
ats[result.Key] = result.Value
}
diff --git a/engine/storage_redis.go b/engine/storage_redis.go
index fea4138ce..42968d2cb 100644
--- a/engine/storage_redis.go
+++ b/engine/storage_redis.go
@@ -69,21 +69,13 @@ func (rs *RedisStorage) Flush() (err error) {
}
func (rs *RedisStorage) CacheRating(dKeys, rpKeys, rpfKeys []string) (err error) {
- if dKeys == nil {
- cache2go.RemPrefixKey(DESTINATION_PREFIX)
- }
- if rpKeys == nil {
- cache2go.RemPrefixKey(RATING_PLAN_PREFIX)
- }
- if rpfKeys == nil {
- cache2go.RemPrefixKey(RATING_PROFILE_PREFIX)
- }
if dKeys == nil {
Logger.Info("Caching all destinations")
if dKeys, err = rs.db.Keys(DESTINATION_PREFIX + "*"); err != nil {
return
}
- } else if len(rpKeys) != 0 {
+ cache2go.RemPrefixKey(DESTINATION_PREFIX)
+ } else if len(dKeys) != 0 {
Logger.Info(fmt.Sprintf("Caching destinations: %v", dKeys))
}
for _, key := range dKeys {
@@ -99,6 +91,7 @@ func (rs *RedisStorage) CacheRating(dKeys, rpKeys, rpfKeys []string) (err error)
if rpKeys, err = rs.db.Keys(RATING_PLAN_PREFIX + "*"); err != nil {
return
}
+ cache2go.RemPrefixKey(RATING_PLAN_PREFIX)
} else if len(rpKeys) != 0 {
Logger.Info(fmt.Sprintf("Caching rating plans: %v", rpKeys))
}
@@ -116,6 +109,7 @@ func (rs *RedisStorage) CacheRating(dKeys, rpKeys, rpfKeys []string) (err error)
if rpfKeys, err = rs.db.Keys(RATING_PROFILE_PREFIX + "*"); err != nil {
return
}
+ cache2go.RemPrefixKey(RATING_PROFILE_PREFIX)
} else if len(rpfKeys) != 0 {
Logger.Info(fmt.Sprintf("Caching rating profile: %v", rpfKeys))
}
@@ -222,7 +216,7 @@ func (rs *RedisStorage) SetRatingPlan(rp *RatingPlan) (err error) {
response := 0
go historyScribe.Record(&history.Record{Key: RATING_PLAN_PREFIX + rp.Id, Object: rp}, &response)
}
- cache2go.Cache(RATING_PLAN_PREFIX+rp.Id, rp)
+ //cache2go.Cache(RATING_PLAN_PREFIX+rp.Id, rp)
return
}
@@ -250,7 +244,7 @@ func (rs *RedisStorage) SetRatingProfile(rpf *RatingProfile) (err error) {
response := 0
go historyScribe.Record(&history.Record{Key: RATING_PROFILE_PREFIX + rpf.Id, Object: rpf}, &response)
}
- cache2go.Cache(RATING_PROFILE_PREFIX+rpf.Id, rpf)
+ //cache2go.Cache(RATING_PROFILE_PREFIX+rpf.Id, rpf)
return
}
@@ -299,7 +293,7 @@ func (rs *RedisStorage) SetDestination(dest *Destination) (err error) {
response := 0
go historyScribe.Record(&history.Record{Key: DESTINATION_PREFIX + dest.Id, Object: dest}, &response)
}
- cache2go.Cache(DESTINATION_PREFIX+dest.Id, dest)
+ //cache2go.Cache(DESTINATION_PREFIX+dest.Id, dest)
return
}
@@ -322,7 +316,7 @@ func (rs *RedisStorage) GetActions(key string, checkDb bool) (as Actions, err er
func (rs *RedisStorage) SetActions(key string, as Actions) (err error) {
result, err := rs.ms.Marshal(&as)
err = rs.db.Set(ACTION_PREFIX+key, result)
- cache2go.Cache(ACTION_PREFIX+key, as)
+ // cache2go.Cache(ACTION_PREFIX+key, as)
return
}
@@ -365,7 +359,7 @@ func (rs *RedisStorage) SetUserBalance(ub *UserBalance) (err error) {
return
}
-func (rs *RedisStorage) GetActionTimings(key string) (ats ActionTimings, err error) {
+func (rs *RedisStorage) GetActionTimings(key string) (ats ActionPlan, err error) {
var values []byte
if values, err = rs.db.Get(ACTION_TIMING_PREFIX + key); err == nil {
err = rs.ms.Unmarshal(values, &ats)
@@ -373,7 +367,7 @@ func (rs *RedisStorage) GetActionTimings(key string) (ats ActionTimings, err err
return
}
-func (rs *RedisStorage) SetActionTimings(key string, ats ActionTimings) (err error) {
+func (rs *RedisStorage) SetActionTimings(key string, ats ActionPlan) (err error) {
if len(ats) == 0 {
// delete the key
_, err = rs.db.Del(ACTION_TIMING_PREFIX + key)
@@ -384,18 +378,18 @@ func (rs *RedisStorage) SetActionTimings(key string, ats ActionTimings) (err err
return
}
-func (rs *RedisStorage) GetAllActionTimings() (ats map[string]ActionTimings, err error) {
+func (rs *RedisStorage) GetAllActionTimings() (ats map[string]ActionPlan, err error) {
keys, err := rs.db.Keys(ACTION_TIMING_PREFIX + "*")
if err != nil {
return nil, err
}
- ats = make(map[string]ActionTimings, len(keys))
+ ats = make(map[string]ActionPlan, len(keys))
for _, key := range keys {
values, err := rs.db.Get(key)
if err != nil {
continue
}
- var tempAts ActionTimings
+ var tempAts ActionPlan
err = rs.ms.Unmarshal(values, &tempAts)
ats[key[len(ACTION_TIMING_PREFIX):]] = tempAts
}
diff --git a/engine/storage_sql.go b/engine/storage_sql.go
index 31295937c..6eab69d07 100644
--- a/engine/storage_sql.go
+++ b/engine/storage_sql.go
@@ -489,7 +489,7 @@ func (self *SQLStorage) SetTPActionTimings(tpid string, ats map[string][]*utils.
return nil //Nothing to set
}
var buffer bytes.Buffer
- buffer.WriteString(fmt.Sprintf("INSERT INTO %s (tpid,tag,actions_tag,timing_tag,weight) VALUES ", utils.TBL_TP_ACTION_TIMINGS))
+ buffer.WriteString(fmt.Sprintf("INSERT INTO %s (tpid,tag,actions_tag,timing_tag,weight) VALUES ", utils.TBL_TP_ACTION_PLANS))
i := 0
for atId, atRows := range ats {
for _, at := range atRows {
@@ -509,7 +509,7 @@ func (self *SQLStorage) SetTPActionTimings(tpid string, ats map[string][]*utils.
func (self *SQLStorage) GetTPActionTimings(tpid, atId string) (map[string][]*utils.TPActionTiming, error) {
ats := make(map[string][]*utils.TPActionTiming)
- q := fmt.Sprintf("SELECT tag,actions_tag,timing_tag,weight FROM %s WHERE tpid='%s'", utils.TBL_TP_ACTION_TIMINGS, tpid)
+ q := fmt.Sprintf("SELECT tag,actions_tag,timing_tag,weight FROM %s WHERE tpid='%s'", utils.TBL_TP_ACTION_PLANS, tpid)
if atId != "" {
q += fmt.Sprintf(" AND tag='%s'", atId)
}
@@ -532,7 +532,7 @@ func (self *SQLStorage) GetTPActionTimings(tpid, atId string) (map[string][]*uti
}
func (self *SQLStorage) GetTPActionTimingIds(tpid string) ([]string, error) {
- rows, err := self.Db.Query(fmt.Sprintf("SELECT DISTINCT tag FROM %s where tpid='%s'", utils.TBL_TP_ACTION_TIMINGS, tpid))
+ rows, err := self.Db.Query(fmt.Sprintf("SELECT DISTINCT tag FROM %s where tpid='%s'", utils.TBL_TP_ACTION_PLANS, tpid))
if err != nil {
return nil, err
}
@@ -614,7 +614,7 @@ func (self *SQLStorage) SetTPAccountActions(tpid string, aa map[string]*utils.TP
buffer.WriteRune(',')
}
buffer.WriteString(fmt.Sprintf("('%s','%s','%s','%s','%s','%s','%s')",
- tpid, aActs.LoadId, aActs.Tenant, aActs.Account, aActs.Direction, aActs.ActionTimingsId, aActs.ActionTriggersId))
+ tpid, aActs.LoadId, aActs.Tenant, aActs.Account, aActs.Direction, aActs.ActionPlanId, aActs.ActionTriggersId))
i++
}
buffer.WriteString(" ON DUPLICATE KEY UPDATE action_timings_tag=values(action_timings_tag), action_triggers_tag=values(action_triggers_tag)")
@@ -1129,7 +1129,7 @@ func (self *SQLStorage) GetTpAccountActions(aaFltr *utils.TPAccountActions) (map
Tenant: tenant,
Account: account,
Direction: direction,
- ActionTimingsId: action_timings_tag,
+ ActionPlanId: action_timings_tag,
ActionTriggersId: action_triggers_tag,
}
aa[aacts.KeyId()] = aacts
diff --git a/engine/storage_sql_local_test.go b/engine/storage_sql_local_test.go
index d4391355a..0d9e6b8fa 100644
--- a/engine/storage_sql_local_test.go
+++ b/engine/storage_sql_local_test.go
@@ -111,7 +111,7 @@ func TestRemoveData(t *testing.T) {
// Create AccountActions
aa := &utils.TPAccountActions{TPid: TEST_SQL, LoadId: TEST_SQL, Tenant: "cgrates.org", Account: "1001",
- Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
+ Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"}
if err := mysql.SetTPAccountActions(aa.TPid, map[string]*utils.TPAccountActions{aa.KeyId(): aa}); err != nil {
t.Error(err.Error())
}
diff --git a/engine/tpimporter_csv.go b/engine/tpimporter_csv.go
index f9635bf7d..5fc8bb9a5 100644
--- a/engine/tpimporter_csv.go
+++ b/engine/tpimporter_csv.go
@@ -47,7 +47,7 @@ var fileHandlers = map[string]func(*TPCSVImporter, string) error{
utils.RATING_PLANS_CSV: (*TPCSVImporter).importRatingPlans,
utils.RATING_PROFILES_CSV: (*TPCSVImporter).importRatingProfiles,
utils.ACTIONS_CSV: (*TPCSVImporter).importActions,
- utils.ACTION_TIMINGS_CSV: (*TPCSVImporter).importActionTimings,
+ utils.ACTION_PLANS_CSV: (*TPCSVImporter).importActionTimings,
utils.ACTION_TRIGGERS_CSV: (*TPCSVImporter).importActionTriggers,
utils.ACCOUNT_ACTIONS_CSV: (*TPCSVImporter).importAccountActions,
}
@@ -467,7 +467,7 @@ func (self *TPCSVImporter) importAccountActions(fn string) error {
loadId += "_" + self.ImportId
}
tpaa := &utils.TPAccountActions{TPid: self.TPid, LoadId: loadId, Tenant: tenant, Account: account, Direction: direction,
- ActionTimingsId: actionTimingsTag, ActionTriggersId: actionTriggersTag}
+ ActionPlanId: actionTimingsTag, ActionTriggersId: actionTriggersTag}
aa := map[string]*utils.TPAccountActions{tpaa.KeyId(): tpaa}
if err := self.StorDb.SetTPAccountActions(self.TPid, aa); err != nil {
if self.Verbose {
diff --git a/history/file_scribe.go b/history/file_scribe.go
index a5b5dd09c..0db5ec0f9 100644
--- a/history/file_scribe.go
+++ b/history/file_scribe.go
@@ -38,7 +38,7 @@ const (
)
type FileScribe struct {
- sync.Mutex
+ mu sync.Mutex
fileRoot string
gitCommand string
destinations records
@@ -71,7 +71,7 @@ func NewFileScribe(fileRoot string, saveInterval time.Duration) (*FileScribe, er
}
func (s *FileScribe) Record(rec *Record, out *int) error {
- s.Lock()
+ s.mu.Lock()
var fileToSave string
switch {
case strings.HasPrefix(rec.Key, DESTINATION_PREFIX):
@@ -90,7 +90,7 @@ func (s *FileScribe) Record(rec *Record, out *int) error {
s.loopChecker <- 1
}
s.waitingFile = fileToSave
- defer s.Unlock()
+ defer s.mu.Unlock()
go func() {
t := time.NewTicker(s.savePeriod)
select {
@@ -113,8 +113,8 @@ func (s *FileScribe) Record(rec *Record, out *int) error {
}
func (s *FileScribe) gitInit() error {
- s.Lock()
- defer s.Unlock()
+ s.mu.Lock()
+ defer s.mu.Unlock()
if _, err := os.Stat(s.fileRoot); os.IsNotExist(err) {
if err := os.MkdirAll(s.fileRoot, os.ModeDir|0755); err != nil {
return errors.New(" Error creating history folder: " + err.Error())
@@ -160,8 +160,8 @@ func (s *FileScribe) gitCommit() error {
}
func (s *FileScribe) load(filename string) error {
- s.Lock()
- defer s.Unlock()
+ s.mu.Lock()
+ defer s.mu.Unlock()
f, err := os.Open(filepath.Join(s.fileRoot, filename))
if err != nil {
return err
@@ -190,8 +190,8 @@ func (s *FileScribe) load(filename string) error {
}
func (s *FileScribe) save(filename string) error {
- s.Lock()
- defer s.Unlock()
+ s.mu.Lock()
+ defer s.mu.Unlock()
f, err := os.Create(filepath.Join(s.fileRoot, filename))
if err != nil {
return err
diff --git a/history/mock_scribe.go b/history/mock_scribe.go
index c9afa1a37..0f1caf649 100644
--- a/history/mock_scribe.go
+++ b/history/mock_scribe.go
@@ -28,7 +28,7 @@ import (
)
type MockScribe struct {
- sync.Mutex
+ mu sync.Mutex
destinations records
ratingPlans records
ratingProfiles records
@@ -58,8 +58,8 @@ func (s *MockScribe) Record(rec *Record, out *int) error {
}
func (s *MockScribe) save(filename string) error {
- s.Lock()
- defer s.Unlock()
+ s.mu.Lock()
+ defer s.mu.Unlock()
switch filename {
case DESTINATIONS_FILE:
s.DestBuf.Reset()
diff --git a/history/proxy_scribe.go b/history/proxy_scribe.go
index b6e324827..31fd3efb6 100644
--- a/history/proxy_scribe.go
+++ b/history/proxy_scribe.go
@@ -18,11 +18,7 @@ along with this program. If not, see
package history
-import (
- "errors"
- "net/rpc"
- "net/rpc/jsonrpc"
-)
+import "net/rpc"
const (
JSON = "json"
@@ -33,17 +29,8 @@ type ProxyScribe struct {
Client *rpc.Client
}
-func NewProxyScribe(addr, encoding string) (*ProxyScribe, error) {
- var client *rpc.Client
- var err error
- switch encoding {
- case GOB:
- client, err = rpc.Dial("tcp", addr)
- case JSON:
- client, err = jsonrpc.Dial("tcp", addr)
- default:
- err = errors.New("Hystory proxy scribe: Unknown encoding " + encoding)
- }
+func NewProxyScribe(addr string) (*ProxyScribe, error) {
+ client, err := rpc.Dial("tcp", addr)
if err != nil {
return nil, err
diff --git a/pkg/debian/cgrates.init b/pkg/debian/cgrates.init
old mode 100644
new mode 100755
index c16d528be..488c8b94f
--- a/pkg/debian/cgrates.init
+++ b/pkg/debian/cgrates.init
@@ -21,7 +21,8 @@ DAEMON=/usr/bin/cgr-engine
USER=cgrates
GROUP=cgrates
ENGINE_OPTS=""
-PIDFILE=/var/run/$NAME/cgr-engine.pid
+RUNDIR=/var/run/$NAME
+PIDFILE=$RUNDIR/cgr-engine.pid
SCRIPTNAME=/etc/init.d/$NAME
DEFAULTS=/etc/default/$NAME
ENABLE=false
@@ -45,6 +46,12 @@ if [ "$ENABLE" != "true" ]; then
exit 0
fi
+# Install the run folder
+if [ ! -d $RUNDIR ]; then
+ mkdir $RUNDIR
+ chown $USER:$GROUP $RUNDIR
+fi
+
#
# Function that starts the daemon/service
diff --git a/pkg/debian/postinst b/pkg/debian/postinst
index fe1460296..af3e428a3 100755
--- a/pkg/debian/postinst
+++ b/pkg/debian/postinst
@@ -27,10 +27,9 @@ set -e
case "$1" in
configure)
- adduser --quiet --system --group --disabled-password --shell /bin/false --gecos "CGRateS" cgrates || true
+ adduser --quiet --system --group --disabled-password --shell /bin/false --home /var/run/cgrates --gecos "CGRateS" cgrates || true
chown -R cgrates:cgrates /var/log/cgrates/
chown -R cgrates:cgrates /usr/share/cgrates/
- chown -R cgrates:cgrates /var/run/cgrates/
;;
abort-upgrade|abort-remove|abort-deconfigure)
diff --git a/pkg/debian/rules b/pkg/debian/rules
index 047c58cc1..889fbd6cb 100755
--- a/pkg/debian/rules
+++ b/pkg/debian/rules
@@ -33,7 +33,6 @@ binary-arch: clean
mkdir -p $(PKGDIR)/var/log/cgrates/cdr/cdrc/out
mkdir -p $(PKGDIR)/var/log/cgrates/cdr/cdrexport/csv
mkdir -p $(PKGDIR)/var/log/cgrates/history
- mkdir -p $(PKGDIR)/var/run/cgrates
dh_strip
dh_compress
dh_fixperms
diff --git a/pkg/pkg_cgrates_deb.sh b/pkg/pkg_cgrates_deb.sh
index 7cd21679c..7273621db 100755
--- a/pkg/pkg_cgrates_deb.sh
+++ b/pkg/pkg_cgrates_deb.sh
@@ -1,18 +1,14 @@
#! /usr/bin/env sh
-if [ -z "$1" ]
-then
- echo ""
- echo "Package version not provided, exiting ..."
- echo ""
- exit 0
-fi
-
-WORK_DIR=/tmp/cgrates_$1
+WORK_DIR=/tmp/cgrates
rm -rf $WORK_DIR
mkdir -p $WORK_DIR
cp -r debian $WORK_DIR/debian
cd $WORK_DIR
git clone https://github.com/cgrates/cgrates.git src/github.com/cgrates/cgrates
+tar xvzf src/github.com/cgrates/cgrates/data/tutorials/fs_csv/freeswitch/etc/freeswitch_conf.tar.gz
+rm src/github.com/cgrates/cgrates/data/tutorials/fs_csv/freeswitch/etc/freeswitch_conf.tar.gz
+tar xvzf src/github.com/cgrates/cgrates/data/tutorials/fs_json/freeswitch/etc/freeswitch_conf.tar.gz
+rm src/github.com/cgrates/cgrates/data/tutorials/fs_json/freeswitch/etc/freeswitch_conf.tar.gz
dpkg-buildpackage -us -uc
-rm -rf $WORK_DIR
+#rm -rf $WORK_DIR
diff --git a/utils/apitpdata.go b/utils/apitpdata.go
index 93a838ec7..66913381f 100644
--- a/utils/apitpdata.go
+++ b/utils/apitpdata.go
@@ -220,10 +220,10 @@ type TPAction struct {
Weight float64 // Action's weight
}
-type TPActionTimings struct {
+type TPActionPlan struct {
TPid string // Tariff plan id
- ActionTimingsId string // ActionTimings id
- ActionTimings []*TPActionTiming // Set of ActionTiming bindings this profile will group
+ Id string // ActionPlan id
+ ActionPlan []*TPActionTiming // Set of ActionTiming bindings this profile will group
}
type TPActionTiming struct {
@@ -266,7 +266,7 @@ type TPAccountActions struct {
Tenant string // Tenant's Id
Account string // Account name
Direction string // Traffic direction
- ActionTimingsId string // Id of ActionTimings profile to use
+ ActionPlanId string // Id of ActionPlan profile to use
ActionTriggersId string // Id of ActionTriggers profile to use
}
diff --git a/utils/consts.go b/utils/consts.go
index 070638c1f..3a6135335 100644
--- a/utils/consts.go
+++ b/utils/consts.go
@@ -1,7 +1,7 @@
package utils
const (
- VERSION = "0.9.1c3"
+ VERSION = "0.9.1c4"
POSTGRES = "postgres"
MYSQL = "mysql"
MONGO = "mongo"
@@ -27,7 +27,7 @@ const (
TBL_TP_RATING_PLANS = "tp_rating_plans"
TBL_TP_RATE_PROFILES = "tp_rating_profiles"
TBL_TP_ACTIONS = "tp_actions"
- TBL_TP_ACTION_TIMINGS = "tp_action_timings"
+ TBL_TP_ACTION_PLANS = "tp_action_plans"
TBL_TP_ACTION_TRIGGERS = "tp_action_triggers"
TBL_TP_ACCOUNT_ACTIONS = "tp_account_actions"
TBL_CDRS_PRIMARY = "cdrs_primary"
@@ -41,7 +41,7 @@ const (
RATING_PLANS_CSV = "RatingPlans.csv"
RATING_PROFILES_CSV = "RatingProfiles.csv"
ACTIONS_CSV = "Actions.csv"
- ACTION_TIMINGS_CSV = "ActionTimings.csv"
+ ACTION_PLANS_CSV = "ActionPlans.csv"
ACTION_TRIGGERS_CSV = "ActionTriggers.csv"
ACCOUNT_ACTIONS_CSV = "AccountActions.csv"
TIMINGS_NRCOLS = 6
@@ -51,7 +51,7 @@ const (
DESTRATE_TIMINGS_NRCOLS = 4
RATE_PROFILES_NRCOLS = 7
ACTIONS_NRCOLS = 11
- ACTION_TIMINGS_NRCOLS = 4
+ ACTION_PLANS_NRCOLS = 4
ACTION_TRIGGERS_NRCOLS = 8
ACCOUNT_ACTIONS_NRCOLS = 5
ROUNDING_UP = "*up"