summaryrefslogtreecommitdiff
path: root/src/lbdatafactory.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lbdatafactory.cc')
-rw-r--r--src/lbdatafactory.cc71
1 files changed, 70 insertions, 1 deletions
diff --git a/src/lbdatafactory.cc b/src/lbdatafactory.cc
index f230f4f..f708096 100644
--- a/src/lbdatafactory.cc
+++ b/src/lbdatafactory.cc
@@ -107,6 +107,17 @@ LBDataFactory::load(const string &conf_file)
return false;
}
+ //insert default test if empty
+ LBData::InterfaceHealthIter iter = _lb_data._iface_health_coll.begin();
+ while (iter != _lb_data._iface_health_coll.end()) {
+ if (iter->second._test_coll.empty()) {
+ LBTestICMP *test = new LBTestICMP(_debug);
+ iter->second._test_coll.insert(pair<int,LBTest*>(1,test));
+ //add default ping test...
+ }
+ ++iter;
+ }
+
if (_debug) {
_lb_data.dump();
}
@@ -184,6 +195,9 @@ LBDataFactory::process(const vector<string> &path, int depth, const string &key,
else if (depth > 0 && path[1] == "enable-source-based-routing") {
process_rule_enablesourcebasedrouting(l_key,l_value);
}
+ else if (depth > 1 && path[1] == "limit") {
+ process_rule_limit(l_key,l_value);
+ }
else {
process_rule(l_key,l_value);
}
@@ -345,6 +359,9 @@ LBDataFactory::process_rule(const string &key, const string &value)
void
LBDataFactory::process_rule_protocol(const string &key, const string &value)
{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
if (key == "protocol") {
if (strcasecmp(value.c_str(),"ALL") == 0) {
_rule_iter->second._proto = "all";
@@ -370,24 +387,36 @@ LBDataFactory::process_rule_protocol(const string &key, const string &value)
void
LBDataFactory::process_rule_exclude(const string &key, const string &value)
{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
_rule_iter->second._exclude = true;
}
void
LBDataFactory::process_rule_failover(const string &key, const string &value)
{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
_rule_iter->second._failover = true;
}
void
LBDataFactory::process_rule_enablesourcebasedrouting(const string &key, const string &value)
{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
_rule_iter->second._enable_source_based_routing = true;
}
void
LBDataFactory::process_rule_source(const string &key, const string &value)
{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
if (key == "address") {
_rule_iter->second._s_addr = value;
}
@@ -402,6 +431,9 @@ LBDataFactory::process_rule_source(const string &key, const string &value)
void
LBDataFactory::process_rule_destination(const string &key, const string &value)
{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
if (key == "address") {
_rule_iter->second._d_addr = value;
}
@@ -416,6 +448,9 @@ LBDataFactory::process_rule_destination(const string &key, const string &value)
void
LBDataFactory::process_rule_inbound_interface(const string &key, const string &value)
{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
if (_debug) {
cout << "LBDataFactory::process_rule_inbound_interface(): " << key << ", " << value << endl;
}
@@ -460,7 +495,41 @@ LBDataFactory::process_rule_interface(const string &key, const string &value)
}
}
-
+void
+LBDataFactory::process_rule_limit(const string &key, const string &value)
+{
+ if (_rule_iter == _lb_data._lb_rule_coll.end()) {
+ return;
+ }
+
+ _rule_iter->second._limit = true;
+
+ if (key == "burst") {
+ _rule_iter->second._limit_burst = value;
+ }
+ else if (key == "rate") {
+ _rule_iter->second._limit_rate = value;
+ }
+ else if (key == "period") {
+ if (key == "second") {
+ _rule_iter->second._limit_period = LBRule::K_SECOND;
+ }
+ else if (key == "minute") {
+ _rule_iter->second._limit_period = LBRule::K_MINUTE;
+ }
+ else if (key == "hour") {
+ _rule_iter->second._limit_period = LBRule::K_HOUR;
+ }
+ }
+ else if (key == "threshold") {
+ if (value == "true") {
+ _rule_iter->second._limit_mode = true;
+ }
+ else {
+ _rule_iter->second._limit_mode = false;
+ }
+ }
+}
LBData
LBDataFactory::get()