[PATCH] http admin commands + userguide

Alejandro Guerrieri <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
Here's the patch with the userguide part.

If no objections, I'll commit it later.

Regards,
--
Alejandro Guerrieri
[email protected]
kannel-http-admin-ug.patch (application/octet-stream, 11.5 KB)
Index: doc/userguide/userguide.xml
===================================================================
RCS file: /home/cvs/gateway/doc/userguide/userguide.xml,v
retrieving revision 1.353
diff -u -b -w -r1.353 userguide.xml
--- doc/userguide/userguide.xml	23 Jun 2009 07:19:58 -0000	1.353
+++ doc/userguide/userguide.xml	8 Jul 2009 10:25:47 -0000
@@ -1918,6 +1918,8 @@
         Re-start a single SMSC link. Password required. Additionally
 		  the <literal>smsc</literal> parameter must be given to identify
  		  which <literal>smsc-admin-id</literal> should be re-started.
+        The configuration for the SMSC link is re-read from disk before
+        the action is performed.
    </entry></row>
 
   	<row><entry><literal>stop-smsc</literal></entry>
@@ -1926,6 +1928,21 @@
 		  the <literal>smsc</literal> parameter must be given (see above).
    </entry></row>
 
+    <row><entry><literal>add-smsc</literal></entry>
+    <entry valign="bottom">
+        Adds an SMSC link previously removed or created after the service was
+        started. Password required. Additionally the <literal>smsc</literal>
+        parameter must be given (see above).
+    </entry></row>
+
+    <row><entry><literal>remove-smsc</literal></entry>
+    <entry valign="bottom">
+        Removes an existing SMSC link. Password required. Additionally the
+        <literal>smsc</literal> parameter must be given (see above). If you
+        want a permanent removal, you should also remove the entry from the
+        configuration file or it will be recreated after a service restart.
+    </entry></row>
+
 	<row><entry><literal>restart</literal></entry>
    <entry valign="bottom">
         Re-start whole bearerbox, hence all SMSC links. Password required.
Index: gw/bb_http.c
===================================================================
RCS file: /home/cvs/gateway/gw/bb_http.c,v
retrieving revision 1.53
diff -u -b -w -r1.53 bb_http.c
--- gw/bb_http.c	12 Jan 2009 16:46:56 -0000	1.53
+++ gw/bb_http.c	8 Jul 2009 10:25:49 -0000
@@ -266,6 +266,42 @@
         return octstr_create("SMSC id not given");
 }
 
+static Octstr *httpd_remove_smsc(List *cgivars, int status_type)
+{
+    Octstr *reply;
+    Octstr *smsc;
+    if ((reply = httpd_check_authorization(cgivars, 0))!= NULL) return reply;
+    if ((reply = httpd_check_status())!= NULL) return reply;
+
+    /* check if the smsc id is given */
+    smsc = http_cgi_variable(cgivars, "smsc");
+    if (smsc) {
+        if (bb_remove_smsc(smsc) == -1)
+            return octstr_format("Could not remove smsc-id `%s'", octstr_get_cstr(smsc));
+        else
+            return octstr_format("SMSC `%s' removed", octstr_get_cstr(smsc));
+    } else
+        return octstr_create("SMSC id not given");
+}
+
+static Octstr *httpd_add_smsc(List *cgivars, int status_type)
+{
+    Octstr *reply;
+    Octstr *smsc;
+    if ((reply = httpd_check_authorization(cgivars, 0))!= NULL) return reply;
+    if ((reply = httpd_check_status())!= NULL) return reply;
+
+    /* check if the smsc id is given */
+    smsc = http_cgi_variable(cgivars, "smsc");
+    if (smsc) {
+        if (bb_add_smsc(smsc) == -1)
+            return octstr_format("Could not add smsc-id `%s'", octstr_get_cstr(smsc));
+        else
+            return octstr_format("SMSC `%s' added", octstr_get_cstr(smsc));
+    } else
+        return octstr_create("SMSC id not given");
+}
+
 static Octstr *httpd_restart_smsc(List *cgivars, int status_type)
 {
     Octstr *reply;
@@ -312,6 +348,8 @@
     { "flush-dlr", httpd_flush_dlr },
     { "stop-smsc", httpd_stop_smsc },
     { "start-smsc", httpd_restart_smsc },
+    { "add-smsc", httpd_add_smsc },
+    { "remove-smsc", httpd_remove_smsc },
     { "reload-lists", httpd_reload_lists },
     { NULL , NULL } /* terminate list */
 };
Index: gw/bb_smscconn.c
===================================================================
RCS file: /home/cvs/gateway/gw/bb_smscconn.c,v
retrieving revision 1.101
diff -u -b -w -r1.101 bb_smscconn.c
--- gw/bb_smscconn.c	6 May 2009 18:47:34 -0000	1.101
+++ gw/bb_smscconn.c	8 Jul 2009 10:25:53 -0000
@@ -115,6 +115,9 @@
 /* incoming sms queue control */
 extern long max_incoming_sms_qlength;
 
+/* configuration filename */
+extern Octstr *cfg_filename;
+
 /* our own thingies */
 
 static volatile sig_atomic_t smsc_running;
@@ -494,6 +497,22 @@
     return SMSCCONN_SUCCESS;
 }
 
+int bb_reload_smsc_groups()
+{
+    Cfg *cfg;
+
+    debug("bb.sms", 0, "Reloading groups list from disk");
+    cfg =  cfg_create(cfg_filename);
+    if (cfg_read(cfg) == -1) {
+        warning(0, "Error opening configuration file %s", octstr_get_cstr(cfg_filename));
+        return -1;
+    }
+    if (smsc_groups != NULL)
+        gwlist_destroy(smsc_groups, NULL);
+    smsc_groups = cfg_get_multi_group(cfg, octstr_imm("smsc"));
+    return 0;
+}
+
 
 /*---------------------------------------------------------------------
  * Other functions
@@ -703,6 +722,7 @@
 {
     SMSCConn *conn;
     long i = -1;
+    int success = 0;
 
     if (!smsc_running)
         return -1;
@@ -717,9 +737,14 @@
         } else {
             info(0,"HTTP: Shutting down smsc-id `%s'", octstr_get_cstr(id));
             smscconn_shutdown(conn, 1);   /* shutdown the smsc */
+            success = 1;
         }
     }
     gw_rwlock_unlock(&smsc_list_lock);
+    if (success == 0) {
+        error(0, "SMSC %s not found", octstr_get_cstr(id));
+        return -1;
+    }
     return 0;
 }
 
@@ -729,15 +754,21 @@
     SMSCConn *conn, *new_conn;
     Octstr *smscid = NULL;
     long i = -1;
+    int hit;
     int num = 0;
+    int success = 0;
 
     if (!smsc_running)
         return -1;
 
     gw_rwlock_wrlock(&smsc_list_lock);
+
+    if (bb_reload_smsc_groups() != 0) {
+        gw_rwlock_unlock(&smsc_list_lock);
+        return -1;
+    }
     /* find the specific smsc via id */
     while((i = smsc2_find(id, ++i)) != -1) {
-        int hit;
         long group_index;
         /* check if smsc has online status already */
         conn = gwlist_get(smsc_list, i);
@@ -746,13 +777,17 @@
                 octstr_get_cstr(id));
             continue;
         }
-        /* find the group with equal smsc id */
-        hit = 0;
+        /* find the group with equal smsc (admin-)id */
+        hit = -1;
         grp = NULL;
         for (group_index = 0; group_index < gwlist_len(smsc_groups) && 
              (grp = gwlist_get(smsc_groups, group_index)) != NULL; group_index++) {
+            smscid = cfg_get(grp, octstr_imm("smsc-admin-id"));
+            if (smscid == NULL)
             smscid = cfg_get(grp, octstr_imm("smsc-id"));
             if (smscid != NULL && octstr_compare(smscid, id) == 0) {
+                if (hit < 0)
+                    hit = 0;
                 if (hit == num)
                     break;
                 else
@@ -782,14 +817,99 @@
         smscconn_destroy(conn);
         gwlist_insert(smsc_list, i, new_conn);
         smscconn_start(new_conn);
+        success = 1;
         num++;
     }
+
     gw_rwlock_unlock(&smsc_list_lock);
     
+    if (success == 0) {
+        error(0, "SMSC %s not found", octstr_get_cstr(id));
+        return -1;
+    }
     /* wake-up the router */
     if (router_thread >= 0)
         gwthread_wakeup(router_thread);
+    return 0;
+}
+
+int smsc2_remove_smsc(Octstr *id)
+{
+    SMSCConn *conn;
+    Octstr *smscid = NULL;
+    long i = -1;
+    int success = 0;
+
+    if (!smsc_running)
+        return -1;
+
+    gw_rwlock_wrlock(&smsc_list_lock);
+
+    gwlist_add_producer(smsc_list);
+    while((i = smsc2_find(id, ++i)) != -1) {
+        conn = gwlist_get(smsc_list, i);
+        gwlist_delete(smsc_list, i, 1);
+        smscconn_shutdown(conn, 0);
+        smscconn_destroy(conn);
+        success = 1;
+    }
+    gwlist_remove_producer(smsc_list);
+
+    gw_rwlock_unlock(&smsc_list_lock);
+    if (success == 0) {
+        error(0, "SMSC %s not found", octstr_get_cstr(id));
+        return -1;
+    }
+    return 0;
+}
+
+int smsc2_add_smsc(Octstr *id)
+{
+    CfgGroup *grp;
+    SMSCConn *conn;
+    Octstr *smsc_type;
+    Octstr *smscid = NULL;
+    long i;
+    int success = 0;
+
+    if (!smsc_running)
+        return -1;
+
+    gw_rwlock_wrlock(&smsc_list_lock);
+    if (bb_reload_smsc_groups() != 0) {
+        gw_rwlock_unlock(&smsc_list_lock);
+        return -1;
+    }
     
+    if (smsc2_find(id, 0) != -1) {
+        warning(0, "Could not add already existing SMSC %s", octstr_get_cstr(id));
+        gw_rwlock_unlock(&smsc_list_lock);
+        return -1;
+    }
+
+    gwlist_add_producer(smsc_list);
+    grp = NULL;
+    for (i = 0; i < gwlist_len(smsc_groups) &&
+        (grp = gwlist_get(smsc_groups, i)) != NULL; i++) {
+        smscid = cfg_get(grp, octstr_imm("smsc-admin-id"));
+        if (smscid == NULL)
+            smscid = cfg_get(grp, octstr_imm("smsc-id"));
+
+        if (smscid != NULL && octstr_compare(smscid, id) == 0) {
+            conn = smscconn_create(grp, 1);
+            if (conn != NULL) {
+                gwlist_append(smsc_list, conn);
+                smscconn_start(conn);
+                success = 1;
+            }
+        }
+    }
+    gwlist_remove_producer(smsc_list);
+    gw_rwlock_unlock(&smsc_list_lock);
+    if (success == 0) {
+        error(0, "SMSC %s not found", octstr_get_cstr(id));
+        return -1;
+    }
     return 0;
 }
 
Index: gw/bearerbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/bearerbox.c,v
retrieving revision 1.169
diff -u -b -w -r1.169 bearerbox.c
--- gw/bearerbox.c	12 Jan 2009 16:46:56 -0000	1.169
+++ gw/bearerbox.c	8 Jul 2009 10:25:56 -0000
@@ -122,6 +122,9 @@
  */
 List *isolated;
 
+/* configuration filename */
+Octstr *cfg_filename;
+
 volatile sig_atomic_t bb_status;
 
 /* 
@@ -591,7 +594,6 @@
 {
     int cf_index;
     Cfg *cfg;
-    Octstr *filename;
 
     bb_status = BB_RUNNING;
     
@@ -606,15 +608,13 @@
     cf_index = get_and_set_debugs(argc, argv, check_args);
 
     if (argv[cf_index] == NULL)
-        filename = octstr_create("kannel.conf");
+        cfg_filename = octstr_create("kannel.conf");
     else
-        filename = octstr_create(argv[cf_index]);
-    cfg = cfg_create(filename); 
+        cfg_filename = octstr_create(argv[cf_index]);
+    cfg = cfg_create(cfg_filename);
     
     if (cfg_read(cfg) == -1)
-        panic(0, "Couldn't read configuration from `%s'.", octstr_get_cstr(filename));
-    
-    octstr_destroy(filename);
+        panic(0, "Couldn't read configuration from `%s'.", octstr_get_cstr(cfg_filename));
 
     dlr_init(cfg);
     
@@ -821,6 +821,16 @@
     return smsc2_restart_smsc(id);
 }
 
+int bb_add_smsc(Octstr *id)
+{
+    return smsc2_add_smsc(id);
+}
+
+int bb_remove_smsc(Octstr *id)
+{
+    return smsc2_remove_smsc(id);
+}
+
 int bb_restart(void)
 {
     restart = 1;
Index: gw/bearerbox.h
===================================================================
RCS file: /home/cvs/gateway/gw/bearerbox.h,v
retrieving revision 1.35
diff -u -b -w -r1.35 bearerbox.h
--- gw/bearerbox.h	12 Jan 2009 16:46:56 -0000	1.35
+++ gw/bearerbox.h	8 Jul 2009 10:26:00 -0000
@@ -170,6 +170,8 @@
 
 int smsc2_stop_smsc(Octstr *id);   /* shutdown a specific smsc */
 int smsc2_restart_smsc(Octstr *id);  /* re-start a specific smsc */
+int smsc2_add_smsc(Octstr *id);   /* add a new smsc */
+int smsc2_remove_smsc(Octstr *id);   /* remove a specific smsc */
 
 
 /*---------------
@@ -208,8 +210,11 @@
 int bb_restart(void);
 int bb_flush_dlr(void);
 int bb_stop_smsc(Octstr *id);
+int bb_add_smsc(Octstr *id);
+int bb_remove_smsc(Octstr *id);
 int bb_restart_smsc(Octstr *id);
 int bb_reload_lists(void);
+int bb_reload_smsc_groups(void);
 
 /* return string of current status */
 Octstr *bb_print_status(int status_type);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.