[Freeswitch-svn] [commit] r5524 - freeswitch/trunk/scripts/contrib/trixter/vile
Freeswitch SVN
trixter at freeswitch.org
Tue Jul 10 05:05:41 EDT 2007
Author: trixter
Date: Tue Jul 10 05:05:41 2007
New Revision: 5524
Added:
freeswitch/trunk/scripts/contrib/trixter/vile/
freeswitch/trunk/scripts/contrib/trixter/vile/fsconsole.c
Log:
added for vile until he gets his own contrib dir
Added: freeswitch/trunk/scripts/contrib/trixter/vile/fsconsole.c
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/trixter/vile/fsconsole.c Tue Jul 10 05:05:41 2007
@@ -0,0 +1,496 @@
+/*
+ * FreeSWITCH Console
+ */
+
+#include <ctype.h>
+#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 4096
+#define NUL '\0'
+
+char *app = "fsconsole";
+
+/* Defaults according to current (12-06-06) freeswitch.xml */
+char *hostname = "localhost";
+char *secret = "ClueCon";
+u_short port = 8021;
+
+/* Debug Level */
+int debug = 0;
+
+char *intro = "Welcome to the FreeSWITCH Console.\n";
+
+char buffer[buflen], *command;
+#ifdef WIN32
+SOCKET sd;
+#else
+int sd;
+#endif
+int flag, prompt, display;
+
+char *trim(char *str);
+void print_tokens(char *line);
+
+
+#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[])
+{
+
+ int len;
+ char contents[4096];
+
+ 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];
+
+ struct sockaddr_in sin = {0};
+
+ char cmd[256];
+
+ if (argv[1] && !strcmp(argv[1], "--help")) {
+ fprintf(stderr,"usage %s hostname port secret\n", argv[0]);
+ exit(0);
+ }
+
+ /* 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];
+ }
+
+ /* Init socket descriptor */
+ sd = socket(AF_INET, SOCK_STREAM, 0);
+
+ /* Put Data intoN sockaddr_in struct */
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(port);
+ sin.sin_addr.s_addr = getaddr(hostname);
+
+ /* 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("\n%s@%s> ", app, hostname);
+ prompt = 0;
+ }
+
+ memset(contents, 0, sizeof(buffer));
+ memset(buffer, 0, sizeof(buffer));
+ memset(cmd, 0, sizeof(cmd));
+
+ 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);
+
+ if (debug > 2)
+ display = 1;
+
+ memset(contents, 0, sizeof(contents));
+ strncpy(contents, buffer, len);
+
+ /* Print Incoming input to screen if debug enabled or display is set */
+ if (debug > 0 || display == 1)
+ {
+ write(1,contents,len);
+
+ /* If not debugging, Prevent Display of Response */
+ if (debug < 2)
+ display = 0;
+
+ /* Response received -- Set the prompt */
+ prompt = 1;
+
+
+ }
+
+ /* print_tokens(contents); */
+ for (token=strtok(contents,whitespace); token !=NULL; token=strtok(NULL,whitespace))
+ {
+
+ /* Multiline requires \r, set back to \r
+ to properly execute the display of responses! UNF */
+ strcpy(whitespace, "\r");
+
+ 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");
+
+ token = strtok(NULL, "\n\n");
+
+ trim(token_val);
+
+ if (debug > 2)
+ printf("\nkey: '%s', val: '%s'\n", token_key, token_val);
+
+ if (strcmp(token_key, "Content-Type") == 0)
+ {
+ display = 1;
+
+ if (strcmp(token_val, "auth/request") == 0)
+ {
+
+ printf("\nAuthenticating...\n");
+
+ command = "auth";
+ sprintf(buffer, "auth %s\n\n", secret);
+ write((int)sd, buffer, (unsigned int)strlen(buffer));
+
+ /* If not debugging, Prevent Display of Response */
+ if (debug < 2)
+ display = 0;
+
+ } else if (strcmp(token_val, "command/reply") == 0) {
+
+ /* 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");
+
+ trim(subtoken_val);
+
+ if (debug > 2)
+ 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("Authentication Successful\n");
+ command = "authenticated";
+
+ /* Auth Command received -- Prompt and Display handled elsewhere */
+ prompt = 0;
+ display = 0;
+
+ /* Authentication required a \r, set back to \n
+ to properly execute the display of responses! */
+ strcpy(whitespace, "\n");
+
+ }
+ } else if (strncmp(subtoken_val, "-", 1) == 0) {
+ /* Received an error, print */
+
+ printf("\n%s\n", subtoken_val);
+ /* Since we received a response, set the prompt */
+ prompt = 1;
+
+ } else if (strncmp(subtoken_val, "+", 1) == 0) {
+ /* Received an uncoded OK, print */
+
+ printf("\n%s\n", subtoken_val);
+ /* Since we received a response, set the prompt */
+ prompt = 1;
+
+ }
+
+ /* || "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);
+
+ /* Received a Command */
+ if (strlen(cmd))
+ {
+
+ /* Received an Enter Only - Reset Prompt*/
+ if (strcmp(cmd, "\n") == 0) {
+ prompt = 1;
+ }
+
+ /* Drop the \n */
+ cmd[strlen(cmd) - 1] = 0;
+
+ /* 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;
+
+ /*
+ ** Trap NULL
+ */
+
+ if (str)
+ {
+ /* Remove leading spaces */
+ for (ibuf = str; *ibuf && isspace(*ibuf); ++ibuf)
+ ;
+ if (str != ibuf)
+ memmove(str, ibuf, ibuf - str);
+
+ /* Collapse embedded spaces */
+
+ while (*ibuf)
+ {
+ if (isspace(*ibuf) && cnt) {
+ ibuf++;
+ } else {
+
+ if (!isspace(*ibuf)) {
+ cnt = 0;
+ } else {
+ *ibuf = ' ';
+ cnt = 1;
+ }
+
+ obuf[i++] = *ibuf++;
+ }
+ }
+
+ obuf[i] = NUL;
+
+ /* Remove trailing spaces */
+ while (--i >= 0)
+ {
+ if (!isspace(obuf[i]))
+ break;
+ }
+
+ obuf[++i] = NUL;
+ }
+
+ return str;
+
+}
+
+
More information about the Freeswitch-svn
mailing list