Add execiftime, remove duplicate agent logoff CLI
authorMark Spencer <markster@digium.com>
Fri, 25 Feb 2005 00:25:28 +0000 (00:25 +0000)
committerMark Spencer <markster@digium.com>
Fri, 25 Feb 2005 00:25:28 +0000 (00:25 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5074 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_agent.c
pbx.c

index 8473b13..481485c 100755 (executable)
@@ -1422,55 +1422,6 @@ static int agents_show(int fd, int argc, char **argv)
        return RESULT_SUCCESS;
 }
 
-static int agent_logoff(int fd, int argc, char **argv)
-{
-       struct agent_pvt *p = NULL;
-       char *line = NULL;
-       int res = 0;
-
-       /* Check args */
-       if (argc != 3)
-               return RESULT_SHOWUSAGE;
-       
-       line = argv[2];
-
-       ast_mutex_lock(&agentlock);
-       p = agents;
-       while (p) {
-               ast_mutex_lock(&p->lock);
-               res = strcmp(p->agent, line);
-
-               if (!res) {
-                       /* Found him! Now we're going to kill him. */
-                       
-                       if (ast_strlen_zero(p->loginchan)) {
-                               ast_cli(fd, "Agent %s already logged off the system.\n", line);
-                               ast_mutex_unlock(&p->lock);
-                               break;
-                       }
-                               
-                       strcpy(p->loginchan, ""); /* Bang! Killed him */
-                       ast_cli(fd, "Agent %s successfully logged off.\n", line);
-                       ast_mutex_unlock(&p->lock);
-                       break;
-               }
-               
-               ast_mutex_unlock(&p->lock);
-               p = p->next;
-       }
-       ast_mutex_unlock(&agentlock);
-       if (res) ast_cli(fd, "Unable to find agent %s.\n", line);
-       return RESULT_SUCCESS;
-}
-
-static char agent_logoff_usage[] =
-"Usage: agent logoff <agentnum>\n"
-"      Log an agent off the system that maybe forgot to log off, etc....\n";
-
-static struct ast_cli_entry cli_agent_logoff = {
-       { "agent", "logoff", NULL }, agent_logoff,
-       "Log an agent off of the system", agent_logoff_usage, NULL};
-
 static char show_agents_usage[] = 
 "Usage: show agents\n"
 "       Provides summary information on agents.\n";
diff --git a/pbx.c b/pbx.c
index 7b87603..77fdfc4 100755 (executable)
--- a/pbx.c
+++ b/pbx.c
@@ -182,6 +182,7 @@ static int pbx_builtin_setglobalvar(struct ast_channel *, void *);
 static int pbx_builtin_noop(struct ast_channel *, void *);
 static int pbx_builtin_gotoif(struct ast_channel *, void *);
 static int pbx_builtin_gotoiftime(struct ast_channel *, void *);
+static int pbx_builtin_execiftime(struct ast_channel *, void *);
 static int pbx_builtin_saynumber(struct ast_channel *, void *);
 static int pbx_builtin_saydigits(struct ast_channel *, void *);
 static int pbx_builtin_saycharacters(struct ast_channel *, void *);
@@ -289,6 +290,14 @@ static struct pbx_builtin {
        "extension. Each of the elements may be specified either as '*' (for always)\n"
        "or as a range. See the 'include' syntax for details." 
        },
+
+       { "ExecIfTime", pbx_builtin_execiftime,
+       "Conditional application execution on current time",
+       "  ExecIfTime(<times>|<weekdays>|<mdays>|<months>?<appname>[|<appdata>]):\n"
+       "If the current time matches the specified time, then execute the specified\n"
+       "application. Each of the elements may be specified either as '*' (for always)\n"
+       "or as a range. See the 'include' syntax for details." 
+       },
        
        { "Hangup", pbx_builtin_hangup,
        "Unconditional hangup",
@@ -5004,21 +5013,65 @@ static int pbx_builtin_gotoiftime(struct ast_channel *chan, void *data)
        char *s, *ts;
        struct ast_timing timing;
 
-       if (!data) {
+       if (!data || ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "GotoIfTime requires an argument:\n  <time range>|<days of week>|<days of month>|<months>?[[context|]extension|]priority\n");
                return -1;
        }
 
-       s = strdup((char *) data);
-       ts = s;
+       if ((s = ast_strdupa((char *) data))) {
+               ts = s;
+
+               /* Separate the Goto path */
+               strsep(&ts,"?");
+
+               /* struct ast_include include contained garbage here, fixed by zeroing it on get_timerange */
+               if (ast_build_timing(&timing, s) && ast_check_timing(&timing))
+                       res = pbx_builtin_goto(chan, (void *)ts);
+       } else {
+               ast_log(LOG_ERROR, "Memory Error!\n");
+       }
+       return res;
+}
+
+static int pbx_builtin_execiftime(struct ast_channel *chan, void *data)
+{
+       int res = 0;
+       char *ptr1, *ptr2;
+       struct ast_timing timing;
+       const char *usage = "ExecIfTime requires an argument:\n  <time range>|<days of week>|<days of month>|<months>?<appname>[|<ptr1>]";
 
-       /* Separate the Goto path */
-       strsep(&ts,"?");
+       if (!data || ast_strlen_zero(data)) {
+               ast_log(LOG_WARNING, "%s\n", usage);
+               return -1;
+       }
 
-       /* struct ast_include include contained garbage here, fixed by zeroing it on get_timerange */
-       if (ast_build_timing(&timing, s) && ast_check_timing(&timing))
-               res = pbx_builtin_goto(chan, (void *)ts);
-       free(s);
+       if ((ptr1 = ast_strdupa((char *) data))) {
+               ptr2 = ptr1;
+               /* Separate the Application data ptr1 is the time spec ptr2 is the app|data*/
+               strsep(&ptr2,"?");
+               if (ast_build_timing(&timing, ptr1) && ast_check_timing(&timing)) {
+                       if (ptr2) {
+                               /* ptr2 is now the app name 
+                                  we're done with ptr1 now so recycle it and use it to point to the app args*/
+                               struct ast_app *app;
+                               if((ptr1 = strchr(ptr2, '|'))) {
+                                       *ptr1 = '\0';
+                                       ptr1++;
+                               }
+                               if ((app = pbx_findapp(ptr2))) {
+                                       pbx_exec(chan, app, ptr1 ? ptr1 : "", 1);
+                               } else {
+                                       ast_log(LOG_WARNING, "Cannot locate application %s\n", ptr2);
+                               }
+                       } else {
+                               ast_log(LOG_WARNING, "%s\n", usage);
+                       }
+               } else {
+                       ast_log(LOG_WARNING, "Invalid Time Spec: %s\n%s\n", ptr1, usage);
+               }
+       } else {
+               ast_log(LOG_ERROR, "Memory Error!\n");
+       }
        return res;
 }