Module: sip-router
Branch: master
Commit: 1c6fed07a177593634a8c31a8d004f0aab165d16
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1c6fed0…
Author: Juha Heinanen <jh(a)tutpro.com>
Committer: Juha Heinanen <jh(a)tutpro.com>
Date: Tue Jan 31 01:20:10 2012 +0200
modules/lcr: added lcr.defunct_gw rpc command
---
modules/lcr/README | 17 +++++++++++++++++
modules/lcr/doc/lcr_admin.xml | 19 +++++++++++++++++++
modules/lcr/lcr_mod.c | 32 ++++++++++++++++++++++++++++++++
modules/lcr/lcr_mod.h | 5 ++---
modules/lcr/lcr_rpc.c | 32 ++++++++++++++++++++++++++++++--
5 files changed, 100 insertions(+), 5 deletions(-)
diff --git a/modules/lcr/README b/modules/lcr/README
index 3e1ab37..b98cb6c 100644
--- a/modules/lcr/README
+++ b/modules/lcr/README
@@ -78,6 +78,7 @@ Juha Heinanen
5.1. lcr.reload
5.2. lcr.dump_gws
5.3. lcr.dump_rules
+ 5.4. lcr.defunct_gw
6. Known Limitations
@@ -131,6 +132,7 @@ Juha Heinanen
1.46. lcr.reload RPC example
1.47. lcr.dump_gws RPC example
1.48. lcr.dump_rules RPC example
+ 1.49. lcr.defunct_gw RPC example
Chapter 1. Admin Guide
@@ -197,6 +199,7 @@ Chapter 1. Admin Guide
5.1. lcr.reload
5.2. lcr.dump_gws
5.3. lcr.dump_rules
+ 5.4. lcr.defunct_gw
6. Known Limitations
@@ -971,6 +974,7 @@ if (to_any_gw("192.55.66.2", 1)) {
5.1. lcr.reload
5.2. lcr.dump_gws
5.3. lcr.dump_rules
+ 5.4. lcr.defunct_gw
5.1. lcr.reload
@@ -1002,6 +1006,19 @@ if (to_any_gw("192.55.66.2", 1)) {
Example 1.48. lcr.dump_rules RPC example
$ sercmd lcr.dump_rules
+5.4. lcr.defunct_gw
+
+ Defuncts gateway loaded into memory for a period of time (seconds)
+ without a need to store gateway's defunct value into database and
+ reload the tables.
+
+ Name: lcr.defunct_gw
+
+ Parameters: lcr_id gw_id period
+
+ Example 1.49. lcr.defunct_gw RPC example
+ $ sercmd lcr.defunct_gw 1 4 120
+
6. Known Limitations
In-memory LCR rules and gw tables are switched by two consecutive
diff --git a/modules/lcr/doc/lcr_admin.xml b/modules/lcr/doc/lcr_admin.xml
index 64854e9..b8e243d 100644
--- a/modules/lcr/doc/lcr_admin.xml
+++ b/modules/lcr/doc/lcr_admin.xml
@@ -1324,6 +1324,25 @@ if (to_any_gw("192.55.66.2", 1)) {
</programlisting>
</example>
</section>
+
+ <section>
+ <title><function>lcr.defunct_gw</function></title>
+ <para>
+ Defuncts gateway loaded into memory for a period of
+ time (seconds) without a need to store gateway's
+ defunct value into database and reload the tables.
+ </para>
+ <para>
+ Name: <emphasis>lcr.defunct_gw</emphasis>
+ </para>
+ <para>Parameters: <emphasis>lcr_id gw_id
period</emphasis></para>
+ <example>
+ <title><function>lcr.defunct_gw</function> RPC example</title>
+ <programlisting format="linespecific">
+ $ sercmd lcr.defunct_gw 1 4 120
+ </programlisting>
+ </example>
+ </section>
</section>
<section>
<title>Known Limitations</title>
diff --git a/modules/lcr/lcr_mod.c b/modules/lcr/lcr_mod.c
index 8f8d373..58dd0cd 100644
--- a/modules/lcr/lcr_mod.c
+++ b/modules/lcr/lcr_mod.c
@@ -2049,6 +2049,38 @@ static int defunct_gw(struct sip_msg* _m, char *_defunct_period,
char *_s2)
/*
+ * Defunct given gw in given lcr until time period given as argument has passed.
+ */
+int rpc_defunct_gw(unsigned int lcr_id, unsigned int gw_id, unsigned int period)
+{
+ struct gw_info *gws;
+ unsigned int until, i;
+
+ if ((lcr_id < 1) || (lcr_id > lcr_count_param)) {
+ LM_ERR("invalid lcr_id value <%u>\n", lcr_id);
+ return 0;
+ }
+
+ until = time((time_t *)NULL) + period;
+
+ LM_DBG("defuncting gw <lcr_id/gw_id>=<%u/%u> for %u seconds until
%d\n",
+ lcr_id, gw_id, period, until);
+
+ gws = gw_pt[lcr_id];
+ for (i = 1; i <= gws[0].ip_addr.u.addr32[0]; i++) {
+ if (gws[i].gw_id == gw_id) {
+ gws[i].defunct_until = until;
+ return 1;
+ }
+ }
+
+ LM_ERR("gateway with id <%u> not found\n", gw_id);
+
+ return 0;
+}
+
+
+/*
* When called first time, rewrites scheme, host, port, and
* transport parts of R-URI based on first gw_uri_avp value, which is then
* destroyed. Saves R-URI user to ruri_user_avp for later use.
diff --git a/modules/lcr/lcr_mod.h b/modules/lcr/lcr_mod.h
index e544f68..5ac2406 100644
--- a/modules/lcr/lcr_mod.h
+++ b/modules/lcr/lcr_mod.h
@@ -110,8 +110,7 @@ extern gen_lock_t *reload_lock;
extern struct gw_info **gw_pt;
extern struct rule_info ***rule_pt;
-int mi_print_gws(struct mi_node* rpl);
-int mi_print_lcrs(struct mi_node* rpl);
-int reload_tables();
+extern int reload_tables();
+extern int rpc_defunct_gw(unsigned int, unsigned int, unsigned int);
#endif /* LCR_MOD_H */
diff --git a/modules/lcr/lcr_rpc.c b/modules/lcr/lcr_rpc.c
index f70c042..111bfb0 100644
--- a/modules/lcr/lcr_rpc.c
+++ b/modules/lcr/lcr_rpc.c
@@ -67,6 +67,8 @@ static void dump_gws(rpc_t* rpc, void* c)
str gw_name, hostname, params;
str prefix, tag;
struct gw_info *gws;
+ char buf[INT2STR_MAX_LEN], *start;
+ int len;
for (j = 1; j <= lcr_count_param; j++) {
@@ -132,12 +134,14 @@ static void dump_gws(rpc_t* rpc, void* c)
prefix.len=gws[i].prefix_len;
tag.s=gws[i].tag;
tag.len=gws[i].tag_len;
- rpc->struct_add(st, "dSSdd",
+ start = int2strbuf(gws[i].defunct_until, &(buf[0]), INT2STR_MAX_LEN,
+ &len);
+ rpc->struct_add(st, "dSSds",
"strip", gws[i].strip,
"prefix", &prefix,
"tag", &tag,
"flags", gws[i].flags,
- "defunct_until", &gws[i].defunct_until
+ "defunct_until", start
);
}
}
@@ -199,9 +203,33 @@ static void dump_rules(rpc_t* rpc, void* c)
}
+static const char* defunct_gw_doc[2] = {
+ "Defunct gateway until speficied time (Unix timestamp).",
+ 0
+};
+
+
+static void defunct_gw(rpc_t* rpc, void* c)
+{
+ unsigned int lcr_id, gw_id, until;
+
+ if (rpc->scan(c, "ddd", &lcr_id, &gw_id, &until) < 3) {
+ rpc->fault(c, 400, "lcr_id, gw_id, and timestamp parameters required");
+ return;
+ }
+
+ if (rpc_defunct_gw(lcr_id, gw_id, until) == 0) {
+ rpc->fault(c, 400, "parameter value error (see syslog)");
+ }
+
+ return;
+}
+
+
rpc_export_t lcr_rpc[] = {
{"lcr.reload", reload, reload_doc, 0},
{"lcr.dump_gws", dump_gws, dump_gws_doc, 0},
{"lcr.dump_rules", dump_rules, dump_rules_doc, 0},
+ {"lcr.defunct_gw", defunct_gw, defunct_gw_doc, 0},
{0, 0, 0, 0}
};