1
0
Fork 0

re-org of mmsc code into one executable: mmsc

This commit is contained in:
bagyenda 2008-09-01 15:18:43 +00:00
parent 2236d0e9e5
commit 526ec741fb
12 changed files with 198 additions and 202 deletions

View File

@ -1,3 +1,5 @@
2008-09-01 P. A. Bagyenda <bagyenda@dsmagic.com>
* Rolled mmsrelay + mmsproxy into one item (for easier online management)
2008-08-29 P. A. Bagyenda <bagyenda@dsmagic.com>
* Changes to doc for config from DLL
* Misc. code re-ordering for mmsbox

View File

@ -27,23 +27,15 @@ static List *free_conns;
static int pool_size;
static int pgq_init_module(Octstr *conninfo, int max_threads)
{
long i, n = 0;
long i, n;
gw_assert(conninfo);
i = octstr_search_char(conninfo,':', 0);
if (i>0) {
n = strtoul(octstr_get_cstr(conninfo), NULL, 10);
octstr_delete(conninfo, 0, i+1);
}
n = max_threads + 1;
if (n <= 0)
n = DEFAULT_CONNECTIONS;
else if (n <= max_threads * 4) { /* must all each thread up to 2 connections, and then some.*/
n = max_threads*4 + 1;
info(0, "pgsql_queue_init: Forced number of DB connections to %d", (int)n);
}
info(0, "pgsql_queue_init: Number of DB connections set to %d", (int)n);
free_conns = gwlist_create();
gwlist_add_producer(free_conns);
for (i = 0; i<n;i++) {

View File

@ -76,8 +76,10 @@ typedef struct MmsEnvelope {
} MmsEnvelope;
typedef struct MmsQueueHandlerFuncs {
/* Initialise queue module. Must be called at least once on each queue dir. */
int (*mms_init_queue_module)(Octstr *init_data, int max_threads);
/* Initialise queue module. Must be called at least once on each queue dir.
* max_concurrent is a best guess as to number of concurrent queue requests
*/
int (*mms_init_queue_module)(Octstr *init_data, int max_concurrent);
/* initialise a queue directory. There can be multiple directories,
* upperlevel decides what a directory is.

View File

@ -120,10 +120,12 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
if ((qfs = _mms_load_module(cfg, grp, "queue-manager-module", "qfuncs", NULL)) == NULL) {
qfs = &default_qfuncs; /* default queue handler. */
qfs->mms_init_queue_module(gdir, maxthreads);
qfs->mms_init_queue_module(gdir, (2 + 1)*maxthreads); /* We expect 2 each for each mmsbox thread,
* one each for each bearerbox thread.
*/
} else {
Octstr *s = _mms_cfg_getx(cfg, grp, octstr_imm("queue-module-init-data"));
if (qfs->mms_init_queue_module(s, maxthreads) != 0)
if (qfs->mms_init_queue_module(s, (2+1)*maxthreads) != 0)
panic(0, "failed to initialise queue module, with data: %s",
octstr_get_cstr(s));
octstr_destroy(s);

View File

@ -4,10 +4,9 @@ libmmsc = libmmsc.a
noinst_LIBRARIES = libmmsc.a
libmmsc_a_SOURCES = mmsc_cfg.c mms_detokenize.c mms_resolve.c mms_billing.c mms_detokenize_shell.c mms_resolve_shell.c mms_billing_shell.c
bin_PROGRAMS = mmsrelay mmsproxy mmsfromemail mmssend
mmsrelay_SOURCES = mmsglobalsender.c mmsmobilesender.c mmsrelay.c
mmsrelay_LDADD = $(libmmsc) $(libmms)
mmsproxy_LDADD = $(libmmsc) $(libmms)
bin_PROGRAMS = mmsc mmsfromemail mmssend
mmsc_SOURCES = mmsc.c mmsglobalsender.c mmsmobilesender.c mmsrelay.c mmsproxy.c
mmsc_LDADD = $(libmmsc) $(libmms)
mmsfromemail_LDADD = $(libmmsc) $(libmms)
mmssend_LDADD = $(libmmsc) $(libmms)

98
mbuni/mmsc/mmsc.c Normal file
View File

@ -0,0 +1,98 @@
/*
* Mbuni - Open Source MMS Gateway
*
* MMSC: Full MMSC startup
*
* Copyright (C) 2003 - 2008, Digital Solutions Ltd. - http://www.dsmagic.com
*
* Paul Bagyenda <bagyenda@dsmagic.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#include "mmsc.h"
#include "mms_uaprof.h"
static mCfg *cfg;
MmscSettings *settings;
List *proxyrelays;
static void quit_now(int notused)
{
stop_mmsrelay();
stop_mmsproxy();
}
/* manage the SIGHUP signal */
static void relog_now(int notused)
{
warning(0, "SIGHUP received, catching and re-opening logs");
log_reopen();
alog_reopen();
}
int main(int argc, char *argv[])
{
int cfidx;
Octstr *fname;
long r_thread = 0;
mms_lib_init();
srandom(time(NULL));
cfidx = get_and_set_debugs(argc, argv, NULL);
if (argv[cfidx] == NULL)
fname = octstr_imm("mbuni.conf");
else
fname = octstr_create(argv[cfidx]);
cfg = mms_cfg_read(fname);
if (cfg == NULL)
panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname));
octstr_destroy(fname);
info(0, "----------------------------------------");
info(0, " " MM_NAME " MMSC version %s starting", MMSC_VERSION);
settings = mms_load_mmsc_settings(cfg,&proxyrelays);
mms_cfg_destroy(cfg);
if (!settings)
panic(0, "No global MMSC configuration!");
signal(SIGHUP, relog_now);
signal(SIGTERM, quit_now);
signal(SIGPIPE,SIG_IGN); /* Ignore pipe errors. They kill us sometimes for nothing*/
if ((r_thread = gwthread_create((gwthread_func_t *)mmsrelay, NULL)) < 0)
panic(0, "Failed to start MMSC Relay component!");
if (mmsproxy() < 0)
panic(0, "Failed to start MMSC Relay component!");
/* We are done. Cleanup. */
info(0, "MMSC shutdown commenced.");
gwthread_join(r_thread);
sleep(2); /* Wait for them to die. */
info(0, "Final cleanup...");
mms_cleanup_mmsc_settings(settings); /* Stop settings stuff and so on. */
info(0, "Shutdown complete...");
mms_lib_shutdown();
return 0;
}

View File

@ -1,9 +1,7 @@
#ifndef __MMSRELAY_INCLUDED__
#define __MMSRELAY_INCLUDED__
/*
* Mbuni - Open Source MMS Gateway
*
* MMS Relay, implements message routing
* MMSC: Full MMSC startup
*
* Copyright (C) 2003 - 2008, Digital Solutions Ltd. - http://www.dsmagic.com
*
@ -12,17 +10,21 @@
* This program is free software, distributed under the terms of
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#include <signal.h>
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
#include "mms_queue.h"
#include "mms_uaprof.h"
#ifndef __MBUNI_MMSC_INCLUDED__
#define __MBUNI_MMSC_INCLUDED__
#include "mmsc_cfg.h"
#include "mms_mm7soap.h"
int mmsproxy(void);
void stop_mmsproxy(void);
int mmsrelay(void);
int stop_mmsrelay(void);
extern void mbuni_global_queue_runner(int *stopflag);
extern void mbuni_mm1_queue_runner(int *stopflag);
extern MmscSettings *settings;
extern List *proxyrelays;
#endif

View File

@ -94,10 +94,12 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
if ((m->qfs = _mms_load_module(cfg, grp, "queue-manager-module", "qfuncs", NULL)) == NULL) {
m->qfs = &default_qfuncs; /* default queue handler. */
m->qfs->mms_init_queue_module(qdir, m->maxthreads);
m->qfs->mms_init_queue_module(qdir, (2 + 2 + 2)*m->maxthreads); /* We expect 2 max for each mmsrelay component (= 4)
* + 2 for mmsproxy (on for mm1proxy, one for mm7proxy
*/
} else {
Octstr *s = _mms_cfg_getx(cfg, grp, octstr_imm("queue-module-init-data"));
if (m->qfs->mms_init_queue_module(s, m->maxthreads) != 0)
if (m->qfs->mms_init_queue_module(s, (2 + 2 + 2)*m->maxthreads) != 0)
panic(0, "failed to initialise queue module, with data: %s",
octstr_get_cstr(s));
octstr_destroy(s);

View File

@ -11,7 +11,7 @@
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#include "mmsrelay.h"
#include "mmsc.h"
#define NMAX 256
static char mobile_qdir[NMAX];

View File

@ -11,7 +11,7 @@
* This program is free software, distributed under the terms of
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#include "mmsrelay.h"
#include "mmsc.h"
#include <errno.h>
#include <strings.h>

View File

@ -21,6 +21,7 @@
#include "mms_uaprof.h"
#include "mmsc_cfg.h"
#include "mms_mm7soap.h"
#include "mmsc.h"
#define MAX_MESSAGE_SIZE 100*1024
@ -28,115 +29,41 @@ typedef struct MmsHTTPClientInfo {
HTTPClient *client;
Octstr *ua;
Octstr *ip;
List *headers;
List *headers;
Octstr *url;
Octstr *body;
List *cgivars;
List *cgivars;
Octstr *profile_url;
Octstr *base_client_addr;
Octstr *client_addr;
MmsVasp *vasp;
} MmsHTTPClientInfo;
static mCfg *cfg;
static List *proxyrelays;
static MmscSettings *settings;
static long mm7_thread = -1;
static int rstop = 0;
static void quit_now(int notused)
{
rstop = 1;
if (settings) {
http_close_port(settings->port);
http_close_port(settings->mm7port);
}
}
/* manage the SIGHUP signal */
static void relog_now(int notused)
{
warning(0, "SIGHUP received, catching and re-opening logs");
log_reopen();
alog_reopen();
}
static void free_clientInfo(MmsHTTPClientInfo *h, int freeh);
static void fetchmms_proxy(MmsHTTPClientInfo *h);
static void sendmms_proxy(MmsHTTPClientInfo *h);
static void mm7proxy(void *unused);
int main(int argc, char *argv[])
{
int cfidx;
Octstr *fname;
static void mm1proxy(void)
{
MmsHTTPClientInfo h = {NULL};
long mm7_thread = -1;
mms_lib_init();
srandom(time(NULL));
cfidx = get_and_set_debugs(argc, argv, NULL);
if (argv[cfidx] == NULL)
fname = octstr_imm("mmsc.conf");
else
fname = octstr_create(argv[cfidx]);
cfg = mms_cfg_read(fname);
if (cfg == NULL)
panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname));
octstr_destroy(fname);
info(0, "----------------------------------------");
info(0, " " MM_NAME " MMSC Proxy version %s starting", MMSC_VERSION);
/* Load settings. */
settings = mms_load_mmsc_settings(cfg, &proxyrelays);
mms_cfg_destroy(cfg);
if (!settings)
panic(0, "No global MMSC configuration!");
signal(SIGHUP, relog_now);
signal(SIGTERM, quit_now);
/* Start cache engine. */
mms_start_profile_engine(octstr_get_cstr(settings->ua_profile_cache_dir));
/* If we have mm7 port, start thread for it. */
/* Now open port and start dispatching requests. */
if (http_open_port(settings->port, 0) < 0) {
error(0, "MMS Proxy: Failed to start http server: %d => %s!",
errno, strerror(errno));
goto done;
}
if (settings->mm7port > 0 &&
http_open_port(settings->mm7port, 0) >= 0)
mm7_thread = gwthread_create((gwthread_func_t *)mm7proxy, NULL);
else
warning(0, "MMS Proxy: MM7 interface not open, port=%ld",
settings->mm7port);
while(rstop == 0 && (h.client = http_accept_request(settings->port,
&h.ip, &h.url, &h.headers,
&h.body, &h.cgivars)) != NULL)
&h.ip, &h.url, &h.headers,
&h.body, &h.cgivars)) != NULL)
if (is_allowed_ip(settings->allow_ip, settings->deny_ip, h.ip)) {
MmsHTTPClientInfo *hx = gw_malloc(sizeof *hx);
h.vasp = NULL;
h.profile_url = NULL;
h.ua = http_header_value(h.headers, octstr_imm("User-Agent"));
/* Get the profile URL and store it. Has effect of fetching if missing. */
if ((h.profile_url = http_header_value(h.headers,
octstr_imm("X-Wap-Profile"))) == NULL)
@ -227,26 +154,56 @@ int main(int argc, char *argv[])
free_clientInfo(&h, 0);
}
done:
debug("proxy", 0, "MM1 Shutting down...");
info(0, "Mmsproxy [mm1]: Shutdown commenced...");
}
http_close_all_ports();
debug("proxy", 0, "Port closed");
int mmsproxy(void)
{
mms_stop_profile_engine();
info(0, " " MM_NAME " MMSC Proxy version %s starting", MMSC_VERSION);
mms_start_profile_engine(octstr_get_cstr(settings->ua_profile_cache_dir));
/* If we have mm7 port, start thread for it. */
/* Now open port and start dispatching requests. */
mms_cleanup_mmsc_settings(settings);
sleep(2); /* Give them time to shut down. */
if (http_open_port(settings->port, 0) < 0) {
error(0, "MMS Proxy: Failed to start http server: %d => %s!",
errno, strerror(errno));
return -1;
}
if (mm7_thread >= 0)
if (settings->mm7port > 0 &&
http_open_port(settings->mm7port, 0) >= 0)
mm7_thread = gwthread_create((gwthread_func_t *)mm7proxy, NULL);
else
warning(0, "MMS Proxy: MM7 interface not open, port=%ld",
settings->mm7port);
mm1proxy(); /* run mm1 proxy in current thread. */
if (mm7_thread >0)
gwthread_join(mm7_thread);
info(0, "mmsproxy: Shutdown complete");
mms_lib_shutdown();
info(0, "Stopping profile engine...");
mms_stop_profile_engine(); /* Stop profile stuff. */
info(0, "Mmsproxy: Shutdown complete.");
return 0;
}
void stop_mmsproxy(void)
{
info(0, "Mmsproxy: Shutdown commenced...");
rstop = 1;
http_close_port(settings->port);
http_close_port(settings->mm7port);
info(0, "Mmsproxy: Signalling shutdown complete.");
}
void fetchmms_proxy(MmsHTTPClientInfo *h)
{
Octstr *dlr_flag = NULL;
@ -1896,8 +1853,7 @@ static void mm7eaif_dispatch(MmsHTTPClientInfo *h)
static void mm7proxy(void *unused)
{
MmsHTTPClientInfo h = {NULL};
while(rstop == 0 &&
(h.client = http_accept_request(settings->mm7port,
while(rstop == 0 && (h.client = http_accept_request(settings->mm7port,
&h.ip, &h.url, &h.headers,
&h.body, &h.cgivars)) != NULL)
if (is_allowed_ip(settings->allow_ip, settings->deny_ip, h.ip)) {

View File

@ -10,99 +10,40 @@
* This program is free software, distributed under the terms of
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#include "mmsrelay.h"
#include "mmsc.h"
static mCfg *cfg;
MmscSettings *settings;
List *proxyrelays;
static long qthread = -1;
static int rstop = 0; /* Set to 1 to stop relay. */
static void quit_now(int notused)
int mmsrelay()
{
rstop = 1;
}
/* manage the SIGHUP signal */
static void relog_now(int notused)
{
warning(0, "SIGHUP received, catching and re-opening logs");
log_reopen();
alog_reopen();
}
int main(int argc, char *argv[])
{
int cfidx;
Octstr *fname;
long qthread = 0;
mms_lib_init();
srandom(time(NULL));
cfidx = get_and_set_debugs(argc, argv, NULL);
if (argv[cfidx] == NULL)
fname = octstr_imm("mbuni.conf");
else
fname = octstr_create(argv[cfidx]);
cfg = mms_cfg_read(fname);
if (cfg == NULL)
panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname));
octstr_destroy(fname);
info(0, "----------------------------------------");
info(0, " " MM_NAME " MMSC Relay version %s starting", MMSC_VERSION);
settings = mms_load_mmsc_settings(cfg,&proxyrelays);
mms_cfg_destroy(cfg);
if (!settings)
panic(0, "No global MMSC configuration!");
#if 0
mms_start_profile_engine(octstr_get_cstr(settings->ua_profile_cache_dir));
#endif
signal(SIGHUP, relog_now);
signal(SIGTERM, quit_now);
signal(SIGPIPE,SIG_IGN); /* Ignore pipe errors. They kill us sometimes for nothing*/
/* Start global queue runner. */
info(0, "Starting Global Queue Runner...");
qthread = gwthread_create((gwthread_func_t *)mbuni_global_queue_runner, &rstop);
/* Start the local queue runner. */
info(0, "Starting Local Queue Runner...");
mbuni_mm1_queue_runner(&rstop);
/* gwthread_cancel(qthread); force it to die if not yet dead. */
/* It terminates, so start dying... */
info(0, "Stopping profile engine...");
mms_stop_profile_engine(); /* Stop profile stuff. */
sleep(2); /* Wait for them to die. */
info(0, "Final cleanup...");
mms_cleanup_mmsc_settings(settings); /* Stop settings stuff and so on. */
info(0, "Queue runners shutdown, cleanup commenced...");
gwthread_join(qthread); /* Wait for it to die... */
info(0, "MMSC Relay MM1 queue runner terminates...");
return 0;
}
info(0, "Shutdown complete...");
mms_lib_shutdown();
int stop_mmsrelay(void)
{
rstop = 1;
info(0, "Mmsrelay: Queue runners shutdown, cleanup commenced...");
return 0;
};