[asterisk-dev] new feature

陈帆 jeffery9 at gmail.com
Sun Apr 30 19:38:48 MST 2006


hi,Radael..

This code have add to CVS ?

thanks...



On 3/5/06, Rafael Vidal Aroca <rafael at 3wt.com.br> wrote:
>
>
>    Hi guys,
>
>    some days ago i was asking in this list how we could avoid 2 users
> from simultaneosly connecting. Well, after some discussion, i decided to
> implement a general solution, that should  work for other problems too.
>
>    The idea is to execute an exeternal program every time a user
> registers or unregisters, so we can setup scripts to insert data in
> databases, or take some actions.
>
>    I made it for IAX2, but will implement that for SIP too, if needed.
>
>    An working example is:
>
>    Configure iax.conf
>
>    - In the section [general] add a parameter
>    exec=/tmp/script.sh
>
>    Then, create the /tmp/script.sh
>    #!/bin/sh
>    #Sun Mar  5 09:56:53 BRT 2006
>    #Rafael Aroca <rafael at 3wt.com.br>
>    #Test script executed by asterisk on registering and unregistering
> peers
>
>    echo "[`date`] Received from asterisk parameters $*" >> /tmp/output
>
>    Apply the patch, compile, copy the new channel_iax2.so, and run
> asterisk.
>
>    Everytime asterisk receives an IAX2 message of REGISTER or a clients
> gets UNREGISTERED, /tmp/output receives a new line. My output now after
> some tests is:
>
> root at gemini:/home/rafael/voip# cat /tmp/output
> [Sun Mar  5 11:03:43 BRT 2006] Received from asterisk parameters
> register 2005
> [Sun Mar  5 11:03:51 BRT 2006] Received from asterisk parameters
> unregister 2004
> [Sun Mar  5 11:44:14 BRT 2006] Received from asterisk parameters
> register 2005
> [Sun Mar  5 11:44:40 BRT 2006] Received from asterisk parameters
> register 2005
> [Sun Mar  5 11:45:14 BRT 2006] Received from asterisk parameters
> register 2005
> [Sun Mar  5 11:45:40 BRT 2006] Received from asterisk parameters
> register 2005
> [Sun Mar  5 11:46:14 BRT 2006] Received from asterisk parameters
> register 2005
> [Sun Mar  5 11:47:24 BRT 2006] Received from asterisk parameters
> unregister 2005
>
>
>    Based on that, we can connect to database, or do some other
> interesting actions.
>
>    The patch for this feature follows attached. By the way, would it be
> possible (if my code is safe and verified by someone else) to add this
> to asterisk SVN?
>
> thanks
>
> [] Rafael.
>
>
>
>
>
>
>
>
>
> --- asterisk-1.2.4/channels/chan_iax2.c 2006-01-19 23:00:46.000000000-0200
> +++ asterisk-1.2.4-tmp/channels/chan_iax2.c     2006-03-05 10:55:
> 58.000000000 -0300
> @@ -145,6 +145,7 @@
>
> static char language[MAX_LANGUAGE] = "";
> static char regcontext[AST_MAX_CONTEXT] = "";
> +static char execOnRegister[100] = "";
>
> static int max_retries = 4;
> static int ping_time = 20;
> @@ -5552,8 +5553,31 @@
> static int expire_registry(void *data)
> {
>        struct iax2_peer *p = data;
> +       int res_fork, res_exec;
>
>        ast_log(LOG_DEBUG, "Expiring registration for peer '%s'\n",
> p->name);
> +
> +       res_fork = fork();
> +       if (res_fork < 0) {
> +               ast_log(LOG_NOTICE, "Could not fork");
> +       }
> +
> +       if (res_fork == 0) {
> +               //Example: works fine
> +               //res_exec = execlp("ls", "ls", "-la", NULL);
> +               res_exec = execlp(execOnRegister, execOnRegister,
> "unregister", p->name, NULL);
> +                       } else {
> +                               res_exec = -1;
> +                       }
> +
> +                       if (res_exec < 0) {
> +                               ast_log(LOG_NOTICE, "Could not exec %s",
> execOnRegister);
> +                       } else {
> +                               ast_log(LOG_NOTICE, "Process spawned with
> PID %d", res_fork);
> +                       }
> +
> +
> +
>        /* Reset the address */
>        memset(&p->addr, 0, sizeof(p->addr));
>        /* Reset expire notice */
> @@ -5626,6 +5650,7 @@
>        char data[80];
>        char iabuf[INET_ADDRSTRLEN];
>        int version;
> +       int res_fork, res_exec;
>
>        memset(&ied, 0, sizeof(ied));
>
> @@ -5645,9 +5670,33 @@
>                snprintf(data, sizeof(data), "%s:%d:%d",
> ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port),
> p->expiry);
>                if (!ast_test_flag(p, IAX_TEMPONLY) &&
> sin->sin_addr.s_addr) {
>                        ast_db_put("IAX/Registry", p->name, data);
> +
> +
> +                       ast_log(LOG_NOTICE, "Running %s for peer '%s'\n",
> execOnRegister, p->name);
> +
> +                       res_fork = fork();
> +                       if (res_fork < 0) {
> +                               ast_log(LOG_NOTICE, "Could not fork");
> +                       }
> +
> +                       if (res_fork == 0) {
> +                               //Example: works fine
> +                               //res_exec = execlp("ls", "ls", "-la",
> NULL);
> +                               res_exec = execlp(execOnRegister,
> execOnRegister, "register", p->name, NULL);
> +                       } else {
> +                               res_exec = -1;
> +                       }
> +
> +                       if (res_exec < 0) {
> +                               ast_log(LOG_NOTICE, "Could not exec %s",
> execOnRegister);
> +                       } else {
> +                               ast_log(LOG_NOTICE, "Process spawned with
> PID %d", res_fork);
> +                       }
> +
>                        if  (option_verbose > 2)
>                                ast_verbose(VERBOSE_PREFIX_3 "Registered
> IAX2 '%s' (%s) at %s:%d\n", p->name,
>
> ast_test_flag(&iaxs[callno]->state, IAX_STATE_AUTHENTICATED) ?
> "AUTHENTICATED" : "UNAUTHENTICATED", ast_inet_ntoa(iabuf, sizeof(iabuf),
> sin->sin_addr), ntohs(sin->sin_port));
> +
>                        manager_event(EVENT_FLAG_SYSTEM, "PeerStatus",
> "Peer: IAX2/%s\r\nPeerStatus: Registered\r\n", p->name);
>                        register_peer_exten(p, 1);
>                        ast_device_state_changed("IAX2/%s", p->name); /*
> Activate notification */
> @@ -8624,6 +8673,8 @@
>                                portno = atoi(v->value);
>                } else if (!strcasecmp(v->name, "pingtime"))
>                        ping_time = atoi(v->value);
> +               else if (!strcasecmp(v->name, "exec"))
> +                       ast_copy_string(execOnRegister, v->value,
> sizeof(execOnRegister));
>                else if (!strcasecmp(v->name, "nochecksums")) {
> #ifdef SO_NO_CHECK
>                        if (ast_true(v->value))
>
>
> _______________________________________________
> --Bandwidth and Colocation provided by Easynews.com --
>
> asterisk-dev mailing list
> To UNSUBSCRIBE or update options visit:
>   http://lists.digium.com/mailman/listinfo/asterisk-dev
>
>
>


--
Jeffery

iaxtel Num: 1-700-576-1311
fwdnet Num: 728150
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.digium.com/pipermail/asterisk-dev/attachments/20060430/721454f6/attachment.htm


More information about the asterisk-dev mailing list