[commit] r3757 - freeswitch/branches/igorneves/scripts/socket
Author: igorneves Date: Wed Dec 20 12:30:25 2006 New Revision: 3757 Modified: freeswitch/branches/igorneves/scripts/socket/fsconsole.c Log: new version, dont know the changes yet Modified: freeswitch/branches/igorneves/scripts/socket/fsconsole.c ============================================================================== --- freeswitch/branches/igorneves/scripts/socket/fsconsole.c (original) +++ freeswitch/branches/igorneves/scripts/socket/fsconsole.c Wed Dec 20 12:30:25 2006 @@ -6,301 +6,491 @@ #include <fcntl.h> #include <stdio.h> #include <string.h> + +#ifdef WIN32 +#include <winsock2.h> +#else +#define closesocket close +#endif + +#ifdef _MSC_VER +#include <io.h> +#define write _write +#else #include <netdb.h> #include <netinet/in.h> #include <sys/socket.h> +#include <sys/errno.h> #include <unistd.h> +#endif -#define buflen 38 + +#define buflen 4096 #define NUL '\0' -char *app = "freeswitch"; -char *version = "0.1"; -char *hostname = "127.0.0.1"; +char *app = "fsconsole"; + +/* Defaults according to current (12-06-06) freeswitch.xml */ +char *hostname = "localhost"; char *secret = "ClueCon"; -unsigned int port = 8021; +u_short port = 8021; -char *intro = "Welcome to FreeSWITCH Console.\n\n"; +/* Debug Level */ +int debug = 0; +char *intro = "Welcome to the FreeSWITCH Console.\n"; + char buffer[buflen], *command; -int sd, flag, prompt; +#ifdef WIN32 +SOCKET sd; +#else +int sd; +#endif +int flag, prompt, display; char *trim(char *str); void print_tokens(char *line); -int fs_switch_read(); -// Debug level -int debug = 3; +#ifdef WIN32 +typedef SOCKET socket_t; +#else +typedef int socket_t; +#endif + +typedef enum { + STATUS_SUCCESS +} status_t; + +static int socket_set_nonblock(socket_t sd) +{ +#ifdef WIN32 + u_long argp = 1; + if (ioctlsocket(sd, FIONBIO, &argp) == SOCKET_ERROR) { + return ((WSAGetLastError() == 0) ? STATUS_SUCCESS : WSAGetLastError()); + } +#else + flag = fcntl(sd, F_GETFL, 0); + flag |= O_NONBLOCK; + if (fcntl(sd, F_SETFL, flag) == -1) { + return errno; + } +#endif + return STATUS_SUCCESS; +} + +unsigned long getaddr(char *host_name) +{ + struct hostent *host; + unsigned long addr = 0; + struct in_addr address; + + if (isalpha(host_name[0])) { /* host address is a name */ + host = gethostbyname(host_name); + if(!host) { + return 0; + } else { + address = *(struct in_addr*)host->h_addr_list[0]; + addr = address.s_addr; + } + } + else { + addr = inet_addr(host_name); + } + + return addr; +} + int main(int argc, char *argv[]) { - if (argv[1] == "--help") { - fprintf(stderr,"usage %s hostname port\n", argv[0]); - exit(0); - } - /* Hostname and Port defined on command line */ - if (argc > 1) { - strncpy(hostname, argv[1], sizeof(hostname)); - hostname = argv[1]; - port = atoi(argv[2]); - } + int len; + char contents[4096]; - sd = socket(AF_INET, SOCK_STREAM, 0); /* init socket descriptor */ - struct sockaddr_in sin; - struct hostent *host = gethostbyname(hostname); + char whitespace[] = "\r"; + char *token, *token_split, *subtoken_split; + char token_key[32], token_val[32], token_contents[4096], subtoken_contents[4096]; + char subtoken_key[32], subtoken_val[32]; - //char buffer[buflen]; - int len; - char *p; - char cmd[38]; - int i, n, out; + struct sockaddr_in sin = {0}; - /*** PLACE DATA IN sockaddr_in struct ***/ - memcpy(&sin.sin_addr.s_addr, host->h_addr, host->h_length); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); + char cmd[256]; - /*** CONNECT SOCKET TO THE SERVICE DESCRIBED BY sockaddr_in struct ***/ - if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) < 0) - { - perror("connecting"); - exit(1); - } + if (argv[1] && !strcmp(argv[1], "--help")) { + fprintf(stderr,"usage %s hostname port secret\n", argv[0]); + exit(0); + } - flag = fcntl(sd, F_GETFL, 0); - flag |= O_NONBLOCK; - fcntl(sd, F_SETFL, flag); + /* Hostname, Port and Secret defined on command line */ + if (argc > 1) { + hostname = argv[1]; + } else if (argc > 2) { + port = (u_short)atoi(argv[2]); + } else if (argc > 3) { + secret = argv[3]; + } - printf(intro); + /* Init socket descriptor */ + sd = socket(AF_INET, SOCK_STREAM, 0); - /* Setup the prompt */ - prompt = 1; + /* Put Data intoN sockaddr_in struct */ + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sin.sin_addr.s_addr = getaddr(hostname); - while(1) + /* Connect Socket */ + if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) < 0) + { + perror("connecting"); + exit(1); + } + + /* Set Socket Descriptor to Non-Blocking */ + socket_set_nonblock(sd); + + /* Set the prompt to non-blocking */ + socket_set_nonblock(0); + + /* Print the Introduction */ + printf(intro); + + /* First Prompt = No, would show before authentication.... */ + prompt = 0; + + /* While Program is Running... */ + for(;;) { + /* If Authenticated -- print the current version */ + if (command) + { + if(!strcmp(command,"authenticated")) + { + /* Print the version */ + printf("\nRunning Version:\n"); + sprintf(buffer, "api version\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + /* Authentication Complete -- set current command to blank */ + command = ""; + } + } + /* Prompt */ if (prompt) { - printf("%s %s> ", app, version); + printf("\n%s@%s> ", app, hostname); prompt = 0; } + memset(contents, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer)); memset(cmd, 0, sizeof(cmd)); - /* Setup the first read */ - fs_switch_read(sd, buffer); + len = atoi(buffer); + if (len <= 0) len += buflen; + len = recv(sd, buffer, len, 0); + + if (len > 0) + { + if (debug > 1) + printf("Received a response: len %d.\n", len); - flag = fcntl(0, F_GETFL, 0); - flag |= O_NONBLOCK; - fcntl(0, F_SETFL, flag); + if (debug > 2) + display = 1; - fgets(cmd, 36, stdin); - cmd[strlen(cmd) - 1] = 0; + memset(contents, 0, sizeof(contents)); + strncpy(contents, buffer, len); - if (!strcmp(cmd, "exit")) { - printf("Exiting.. goodbye\n"); - exit(0); - } + /* Print Incoming input to screen if debug enabled or display is set */ + if (debug > 0 || display == 1) + { + write(1,contents,len); - if (!strcmp(cmd, "version")) { - printf("Version %s\n", version); - prompt = 1; - } - - if (!strcmp(cmd, "\n")) { - prompt = 1; - } + /* If not debugging, Prevent Display of Response */ + if (debug < 2) + display = 0; - if (fs_switch_read() > 0) { - // Do nothing - } else { - // Sleep - sleep(1); - } - } + /* Response received -- Set the prompt */ + prompt = 1; - close(sd); -} + } + /* print_tokens(contents); */ + for (token=strtok(contents,whitespace); token !=NULL; token=strtok(NULL,whitespace)) + { -int fs_switch_read() - { + /* Multiline requires \r, set back to \r + to properly execute the display of responses! UNF */ + strcpy(whitespace, "\r"); - int len; - char buf[4096], reply[4096], tmp[255], contents[4096]; + sprintf(token_contents, "%s", token); + + token_split = strtok(token_contents, ":"); + sprintf(token_key, "%s", token_split); + token_split = strtok(NULL, "\n"); + sprintf(token_val, "%s", token_split); + token_split = strtok(NULL, "\n"); - char content[32]; - char content_type[32]; - char content_following[32]; - char content_after[32]; - char junk[32]; + token = strtok(NULL, "\n\n"); - len = atoi(tmp); - if (len <= 0) len += 255; - len = recv(sd, buffer, len, 0); - - if (len > 0) - { - memset(contents, 0, sizeof(contents)); - strncpy(contents, buffer, len); + trim(token_val); - // Print Incoming input to screen - if (debug > 0) - write(1,contents,len); + if (debug > 2) + printf("\nkey: '%s', val: '%s'\n", token_key, token_val); - char whitespace[] = "\r"; - char *token, *token_split, *subtoken_split; - char token_key[32], token_val[32], token_contents[4096], subtoken_contents[4096]; - char subtoken_key[32], subtoken_val[32]; + if (strcmp(token_key, "Content-Type") == 0) + { + display = 1; - //print_tokens(contents); + if (strcmp(token_val, "auth/request") == 0) + { - for (token=strtok(contents,whitespace); token !=NULL; token=strtok(NULL,whitespace)) - { + printf("\nAuthenticating...\n"); + + command = "auth"; + sprintf(buffer, "auth %s\n\n", secret); + write((int)sd, buffer, (unsigned int)strlen(buffer)); - //printf("Next token is %s\n", token); + /* If not debugging, Prevent Display of Response */ + if (debug < 2) + display = 0; - sprintf(token_contents, "%s", token); + } else if (strcmp(token_val, "command/reply") == 0) { - token_split = strtok(token_contents, ":"); - sprintf(token_key, "%s", token_split); - token_split = strtok(NULL, "\n"); - sprintf(token_val, "%s", token_split); - token_split = strtok(NULL, "\n"); + /* Parse the reply */ + sprintf(subtoken_contents, "%s", token_split); + + subtoken_split = strtok(subtoken_contents, ":"); + sprintf(subtoken_key, "%s", subtoken_split); + subtoken_split = strtok(NULL, "\n"); + sprintf(subtoken_val, "%s", subtoken_split); + subtoken_split = strtok(NULL, "\n"); - token = strtok(NULL, "\n\n"); + trim(subtoken_val); - trim(token_val); + if (debug > 2) + printf("subkey: '%s', subval: '%s'\n", subtoken_key, subtoken_val); - if (debug > 1) - printf("\nkey: '%s', val: '%s'\n", token_key, token_val); + if (strcmp(subtoken_key, "Reply-Text") == 0) + { + if (strcmp(subtoken_val, "+OK accepted") == 0) + { + if (strcmp(command, "auth") == 0) + { + printf("Authentication Successful\n"); + command = "authenticated"; + /* Auth Command received -- Prompt and Display handled elsewhere */ + prompt = 0; + display = 0; - if (strcmp(token_key, "Content-Type") == 0) - { + /* Authentication required a \r, set back to \n + to properly execute the display of responses! */ + strcpy(whitespace, "\n"); - if (strcmp(token_val, "auth/request") == 0) - { - printf("\nAuthenticating...\n"); - - command = "auth"; - sprintf(buf, "auth %s\n\n", secret); - write(sd, buf, strlen(buf)); + } + } else if (strncmp(subtoken_val, "-", 1) == 0) { + /* Received an error, print */ - } else if (strcmp(token_val, "command/reply") == 0) { + printf("\n%s\n", subtoken_val); + /* Since we received a response, set the prompt */ + prompt = 1; - /* Parse the reply */ - sprintf(subtoken_contents, "%s", token_split); - - subtoken_split = strtok(subtoken_contents, ":"); - sprintf(subtoken_key, "%s", subtoken_split); - subtoken_split = strtok(NULL, "\n"); - sprintf(subtoken_val, "%s", subtoken_split); - subtoken_split = strtok(NULL, "\n"); + } else if (strncmp(subtoken_val, "+", 1) == 0) { + /* Received an uncoded OK, print */ - trim(subtoken_val); + printf("\n%s\n", subtoken_val); + /* Since we received a response, set the prompt */ + prompt = 1; - if (debug > 1) - printf("subkey: '%s', subval: '%s'\n", subtoken_key, subtoken_val); - - if (strcmp(subtoken_key, "Reply-Text") == 0) - { - if (strcmp(subtoken_val, "+OK accepted") == 0) - { - if (strcmp(command, "auth") == 0) - { - printf("\nAuthentication Successful\n"); - command = ""; + } + + /* || "ts" is a hack -- why? */ + } else if (strcmp(subtoken_key, "") == 0 || strcmp(subtoken_key, "ts") == 0) { + printf("\n%s\n", subtoken_val); + /* Since we received a response, set the prompt */ + prompt = 1; + } + + } else if (strcmp(token_val, "api/response") == 0) { + + /* Since we received an api response, display results */ + if (command && strcmp(command,"authenticated")) + { + display = 1; + } + } - } + } + } } - } + /* Get the command */ + fgets(cmd, 254, stdin); - } - /* Set the prompt */ - prompt = 1; + /* Received a Command */ + if (strlen(cmd)) + { - return 1; - } else { - return 0; - } - -} + /* Received an Enter Only - Reset Prompt*/ + if (strcmp(cmd, "\n") == 0) { + prompt = 1; + } + /* Drop the \n */ + cmd[strlen(cmd) - 1] = 0; -void print_tokens(char *line) -{ - char whitespace[] = "\n"; - char *token; - - for (token=strtok(line,whitespace); token !=NULL; token=strtok(NULL,whitespace)) - { - printf("Next token is %s\n", token); + /* If not debugging, Prevent Display of Response */ + if (debug < 2) + display = 0; + + if (strcmp(cmd, "exit") == 0 || strcmp(cmd, "quit") == 0) { + printf("Exiting.. goodbye.\n"); + break; + } else if (strncmp(cmd, "event", 5) == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strcmp(cmd, "noevents") == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strncmp(cmd, "log", 3) == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strcmp(cmd, "nolog") == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strncmp(cmd, "api", 3) == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strncmp(cmd, "bgapi", 5) == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strncmp(cmd, "sendevent", 9) == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strncmp(cmd, "sendmsg", 7) == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + sprintf(buffer, "%s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else if (strncmp(cmd, "help", 4) == 0 || strncmp(cmd, "?", 1) == 0) { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + printf("\n- Console -\n"); + printf("Valid Commands:\n\n"); + printf("event [xml|plain] <list of events to log or all for all> - enable or disable events by class or all\n"); + printf("noevents - disable all events that were previously enabled w/ event\n"); + printf("nixevent <some_event> - command to allow 'events all' followed by 'nixevent <some_event>' to do all but <some_event>\n"); + printf("log <level> - enable log output. Levels same as the console.conf values\n"); + printf("nolog - disable log output previously enabled by the log command\n"); + printf("api <command> <arg> - send an api command (blocking mode)\n"); + printf("bgapi <command> <arg> - send an api command (non-blocking mode) this will let you execute a job in the background\n"); + printf("sendevent <event-name> - send an event into the event system (multi line input for headers)\n"); + printf("exit - close the fsconsole\n"); + + printf("\n- API - "); + + /* Print the additional api commands available from console... */ + sprintf(buffer, "api help\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + } else { + if (debug > 2) + printf("Received Command: %s\n", cmd); + + + sprintf(buffer, "api %s\n\n", cmd); + write((int)sd, buffer, (unsigned int)strlen(buffer)); + + printf("\n"); + + } + + } + + /* 100% CPU fix */ + usleep(1); + } + + closesocket(sd); } - char *trim(char *str) { - char *ibuf = str, *obuf = str; - int i = 0, cnt = 0; + char *ibuf = str, *obuf = str; + int i = 0, cnt = 0; - /* - ** Trap NULL - */ + /* + ** Trap NULL + */ - if (str) - { - /* - ** Remove leading spaces (from RMLEAD.C) - */ + if (str) + { + /* Remove leading spaces */ + for (ibuf = str; *ibuf && isspace(*ibuf); ++ibuf) + ; + if (str != ibuf) + memmove(str, ibuf, ibuf - str); - for (ibuf = str; *ibuf && isspace(*ibuf); ++ibuf) - ; - if (str != ibuf) - memmove(str, ibuf, ibuf - str); + /* Collapse embedded spaces */ - /* - ** Collapse embedded spaces (from LV1WS.C) - */ + while (*ibuf) + { + if (isspace(*ibuf) && cnt) { + ibuf++; + } else { - while (*ibuf) - { - if (isspace(*ibuf) && cnt) - ibuf++; - else - { - if (!isspace(*ibuf)) - cnt = 0; - else - { - *ibuf = ' '; - cnt = 1; - } - obuf[i++] = *ibuf++; - } - } - obuf[i] = NUL; + if (!isspace(*ibuf)) { + cnt = 0; + } else { + *ibuf = ' '; + cnt = 1; + } - /* - ** Remove trailing spaces (from RMTRAIL.C) - */ + obuf[i++] = *ibuf++; + } + } - while (--i >= 0) - { - if (!isspace(obuf[i])) - break; - } - obuf[++i] = NUL; - } - return str; + obuf[i] = NUL; + + /* Remove trailing spaces */ + while (--i >= 0) + { + if (!isspace(obuf[i])) + break; + } + + obuf[++i] = NUL; + } + + return str; + }
participants (1)
-
Freeswitch SVN