domainpolicy_mod.c

Go to the documentation of this file.
00001 /*
00002  * $Id$
00003  *
00004  * Copyright (C) 2002-2003 Juha Heinanen
00005  *
00006  * This file is part of Kamailio, a free SIP server.
00007  *
00008  * Kamailio is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version
00012  *
00013  * Kamailio is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License 
00019  * along with this program; if not, write to the Free Software 
00020  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  * History:
00023  * -------
00024  * 2003-03-11: New module interface (janakj)
00025  * 2003-03-16: flags export parameter added (janakj)
00026  * 2003-04-05: default_uri #define used (jiri)
00027  * 2003-04-06: db connection closed in mod_init (janakj)
00028  * 2004-06-06  updated to the new DB api, cleanup: static dbf & handler,
00029  *              calls to domainpolicy_db_{bind,init,close,ver} (andrei)
00030  */
00031 
00032 
00038 #include "domainpolicy_mod.h"
00039 #include <stdio.h>
00040 #include "../../mem/shm_mem.h"
00041 #include "../../sr_module.h"
00042 #include "../../ut.h"
00043 #include "domainpolicy.h"
00044 
00045 /*
00046  * Module management function prototypes
00047  */
00048 static int mod_init(void);
00049 static int child_init(int rank);
00050 
00051 MODULE_VERSION
00052 
00057 #define DOMAINPOLICY_TABLE_VERSION 2
00058 
00059 
00060 #define DOMAINPOLICY_TABLE "domainpolicy"
00061 #define DOMAINPOLICY_COL_RULE "rule"
00062 #define DOMAINPOLICY_COL_TYPE "type"
00063 #define DOMAINPOLICY_COL_ATT "att"
00064 #define DOMAINPOLICY_COL_VAL "val"
00065 
00066 /* Default avp names */
00067 #define DEF_PORT_OVERRIDE_AVP         "portoverride"
00068 #define DEF_TRANSPORT_OVERRIDE_AVP    "transportoverride"
00069 #define DEF_DOMAIN_PREFIX_AVP         "domainprefix"
00070 #define DEF_DOMAIN_SUFFIX_AVP         "domainsuffix"
00071 #define DEF_DOMAIN_REPLACEMENT_AVP    "domainreplacement"
00072 #define DEF_SEND_SOCKET_AVP           "sendsocket"
00073 
00074 /*
00075  * Module parameter variables
00076  */
00077 static str db_url         = str_init(DEFAULT_RODB_URL);
00078 str domainpolicy_table    = str_init(DOMAINPOLICY_TABLE);     
00079 str domainpolicy_col_rule = str_init(DOMAINPOLICY_COL_RULE);
00080 str domainpolicy_col_type = str_init(DOMAINPOLICY_COL_TYPE);
00081 str domainpolicy_col_att  = str_init(DOMAINPOLICY_COL_ATT);
00082 str domainpolicy_col_val  = str_init(DOMAINPOLICY_COL_VAL);
00083 
00084 str port_override_avp         = str_init(DEF_PORT_OVERRIDE_AVP);
00085 str transport_override_avp    = str_init(DEF_TRANSPORT_OVERRIDE_AVP);
00086 str domain_prefix_avp         = str_init(DEF_DOMAIN_PREFIX_AVP);
00087 str domain_suffix_avp         = str_init(DEF_DOMAIN_SUFFIX_AVP);
00088 str domain_replacement_avp    = str_init(DEF_DOMAIN_REPLACEMENT_AVP);
00089 str send_socket_avp           = str_init(DEF_SEND_SOCKET_AVP);
00090 
00091 /*
00092  * Other module variables
00093  */
00094 
00095 int_str port_override_name, transport_override_name, domain_prefix_name, 
00096         domain_suffix_name, domain_replacement_name, send_socket_name;
00097 unsigned short port_override_avp_name_str;
00098 unsigned short transport_override_avp_name_str;
00099 unsigned short domain_prefix_avp_name_str;
00100 unsigned short domain_suffix_avp_name_str;
00101 unsigned short domain_replacement_avp_name_str;
00102 unsigned short send_socket_avp_name_str;
00103 
00104 /*
00105  * Exported functions
00106  */
00107 static cmd_export_t cmds[] = {
00108         {"dp_can_connect",  (cmd_function)dp_can_connect,  0, 0, 0, REQUEST_ROUTE},
00109         {"dp_apply_policy", (cmd_function)dp_apply_policy, 0, 0, 0, REQUEST_ROUTE},
00110         {0, 0, 0, 0, 0, 0}
00111 };
00112 
00113 
00114 /*
00115  * Exported parameters
00116  */
00117 static param_export_t params[] = {
00118         {"db_url",                    STR_PARAM, &db_url.s                   },
00119         {"dp_table",                  STR_PARAM, &domainpolicy_table.s       },
00120         {"dp_col_rule",               STR_PARAM, &domainpolicy_col_rule.s    },
00121         {"dp_col_type",               STR_PARAM, &domainpolicy_col_type.s    },
00122         {"dp_col_att",                STR_PARAM, &domainpolicy_col_att.s     },
00123         {"dp_col_val",                STR_PARAM, &domainpolicy_col_val.s     },
00124         {"port_override_avp",         STR_PARAM, &port_override_avp.s        },
00125         {"transport_override_avp",    STR_PARAM, &transport_override_avp.s   },
00126         {"domain_prefix_avp",         STR_PARAM, &domain_prefix_avp.s        },
00127         {"domain_suffix_avp",         STR_PARAM, &domain_suffix_avp.s        },
00128         {"domain_replacement_avp",    STR_PARAM, &domain_replacement_avp.s   },
00129         {"send_socket_avp",           STR_PARAM, &send_socket_avp.s          },
00130         {0, 0, 0}
00131 };
00132 
00133 
00134 /*
00135  * Module interface
00136  */
00137 struct module_exports exports = {
00138         "domainpolicy", 
00139         DEFAULT_DLFLAGS, 
00140         cmds,      
00141         params,    
00142         0,         
00143         0,         
00144         0,         
00145         0,         
00146         mod_init,  
00147         0,         
00148         0,         
00149         child_init 
00150 };
00151 
00152 
00153 static int mod_init(void)
00154 {
00155         unsigned int par;
00156         int ver;
00157 
00158         db_url.len = strlen(db_url.s);
00159         domainpolicy_table.len = strlen(domainpolicy_table.s);
00160         domainpolicy_col_rule.len = strlen(domainpolicy_col_rule.s);
00161         domainpolicy_col_type.len = strlen(domainpolicy_col_type.s);
00162         domainpolicy_col_att.len = strlen(domainpolicy_col_att.s);
00163         domainpolicy_col_val.len = strlen(domainpolicy_col_val.s);
00164 
00165         LM_DBG("check for DB module\n");
00166 
00167         /* Check if database module has been loaded */
00168         if (domainpolicy_db_bind(&db_url)<0)  {
00169                 LM_ERR("no database module loaded!"
00170                         " Please make sure that a DB module is loaded first\n");
00171                 return -1;
00172         }
00173 
00174         LM_DBG("update length of module variables\n");
00175         /* Update length of module variables */
00176         port_override_avp.len         = strlen(port_override_avp.s);
00177         transport_override_avp.len    = strlen(transport_override_avp.s);
00178         domain_prefix_avp.len         = strlen(domain_prefix_avp.s);
00179         domain_suffix_avp.len         = strlen(domain_suffix_avp.s);
00180         domain_replacement_avp.len    = strlen(domain_replacement_avp.s);
00181         send_socket_avp.len           = strlen(send_socket_avp.s);
00182 
00183         /* Check table version */
00184         ver = domainpolicy_db_ver(&db_url, &domainpolicy_table);
00185         if (ver < 0) {
00186                 LM_ERR("failed to query table version\n");
00187                 return -1;
00188         } else if (ver < DOMAINPOLICY_TABLE_VERSION) {
00189                 LM_ERR("invalid table version of domainpolicy table\n");
00190                 return -1;
00191         }
00192 
00193         /* Assign AVP parameter names */
00194         LM_DBG("AVP\n");
00195         if (str2int(&port_override_avp, &par) == 0) {
00196                 if (!par) {
00197                         LM_ERR("port_override_avp not defined!\n");
00198                         return -1;
00199                 }
00200                 port_override_name.n = par;
00201                 port_override_avp_name_str = 0;
00202         } else {
00203                 port_override_name.s = port_override_avp;
00204                 port_override_avp_name_str = AVP_NAME_STR;
00205         }
00206         if (str2int(&transport_override_avp, &par) == 0) {
00207                 if (!par) {
00208                         LM_ERR(" transport_override_avp not defined!\n");
00209                         return -1;
00210                 }
00211                 transport_override_name.n = par;
00212                 transport_override_avp_name_str = 0;
00213         } else {
00214                 transport_override_name.s = transport_override_avp;
00215                 transport_override_avp_name_str = AVP_NAME_STR;
00216         }
00217         if (str2int(&domain_prefix_avp, &par) == 0) {
00218                 if (!par) {
00219                         LM_ERR("domain_prefix_avp not defined!\n");
00220                         return -1;
00221                 }
00222                 domain_prefix_name.n = par;
00223                 domain_prefix_avp_name_str = 0;
00224         } else {
00225                 domain_prefix_name.s = domain_prefix_avp;
00226                 domain_prefix_avp_name_str = AVP_NAME_STR;
00227         }
00228         if (str2int(&domain_suffix_avp, &par) == 0) {
00229                 if (!par) {
00230                         LM_ERR(" domain_suffix_avp not defined!\n");
00231                         return -1;
00232                 }
00233                 domain_suffix_name.n = par;
00234                 domain_suffix_avp_name_str = 0;
00235         } else {
00236                 domain_suffix_name.s = domain_suffix_avp;
00237                 domain_suffix_avp_name_str = AVP_NAME_STR;
00238         }
00239         if (str2int(&domain_replacement_avp, &par) == 0) {
00240                 if (!par) {
00241                         LM_ERR(" domain_replacement_avp not defined!\n");
00242                         return -1;
00243                 }
00244                 domain_replacement_name.n = par;
00245                 domain_replacement_avp_name_str = 0;
00246         } else {
00247                 domain_replacement_name.s = domain_replacement_avp;
00248                 domain_replacement_avp_name_str = AVP_NAME_STR;
00249         }
00250         if (str2int(&send_socket_avp, &par) == 0) {
00251                 if (!par) {
00252                         LM_ERR(" send_socket_avp not defined!\n");
00253                         return -1;
00254                 }
00255                 send_socket_name.n = par;
00256                 send_socket_avp_name_str = 0;
00257         } else {
00258                 send_socket_name.s = send_socket_avp;
00259                 send_socket_avp_name_str = AVP_NAME_STR;
00260         }
00261 
00262         return 0;
00263 }
00264 
00265 
00266 static int child_init(int rank)
00267 {
00268         /* Check if database is needed by child */
00269         if (rank > 0)  {
00270                 if (domainpolicy_db_init(&db_url)<0) {
00271                         LM_ERR("unable to connect to the database\n");
00272                         return -1;
00273                 }
00274         }
00275         return 0;
00276 }