]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2004-02-18 14:45:42 by nicowallmeier]
authornicowallmeier <nicowallmeier@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Wed, 18 Feb 2004 14:45:43 +0000 (14:45 +0000)
committernicowallmeier <nicowallmeier@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Wed, 18 Feb 2004 14:45:43 +0000 (14:45 +0000)
Imon/Telmon plugin ported

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@372 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

Makefile.am
plugin.c
plugin_imon.c [new file with mode: 0755]

index b76b57f9f96a372865d4dbe3b59ef9008634a060..d5aad064f4a08c0cb6a489b7e9325ab61fd1a43e 100644 (file)
@@ -46,6 +46,7 @@ plugin_netdev.c             \
 plugin_ppp.c                \
 plugin_dvb.c                \
 plugin_i2c_sensors.c        \
+plugin_imon.c               \
 plugin_xmms.c               
 
 #liblcd4linux_la_DEPENDENCIES = @DRIVERS@
index 4591b6c54e1b01b25cf991d451ceee9ca8eae0de..7e1c36b7c54088dc7fac3f9ece9d1d978747a7d8 100644 (file)
--- a/plugin.c
+++ b/plugin.c
@@ -1,4 +1,4 @@
-/* $Id: plugin.c,v 1.18 2004/02/10 07:42:35 reinelt Exp $
+/* $Id: plugin.c,v 1.19 2004/02/18 14:45:42 nicowallmeier Exp $
  *
  * plugin handler for the Evaluator
  *
@@ -22,6 +22,9 @@
  *
  *
  * $Log: plugin.c,v $
+ * Revision 1.19  2004/02/18 14:45:42  nicowallmeier
+ * Imon/Telmon plugin ported
+ *
  * Revision 1.18  2004/02/10 07:42:35  reinelt
  * cut off all old-style files which are no longer used with NextGeneration
  *
@@ -145,6 +148,7 @@ int plugin_init_ppp (void);
 int plugin_init_dvb (void);
 int plugin_init_i2c_sensors (void);
 int plugin_init_xmms (void);
+int plugin_init_imon(void);
 
 
 int plugin_init (void)
@@ -162,6 +166,7 @@ int plugin_init (void)
   plugin_init_dvb();
   plugin_init_i2c_sensors();
   plugin_init_xmms();
+  plugin_init_imon();
   
   return 0;
 }
diff --git a/plugin_imon.c b/plugin_imon.c
new file mode 100755 (executable)
index 0000000..fc49a96
--- /dev/null
@@ -0,0 +1,428 @@
+/* $Id: plugin_imon.c,v 1.1 2004/02/18 14:45:43 nicowallmeier Exp $\r
+ *\r
+ * imond/telmond data processing\r
+ *\r
+ * Copyright 2003 Nico Wallmeier <nico.wallmeier@post.rwth-aachen.de>\r
+ *\r
+ * This file is part of LCD4Linux.\r
+ *\r
+ * LCD4Linux is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2, or (at your option)\r
+ * any later version.\r
+ *\r
+ * LCD4Linux is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
+ *\r
+ *\r
+ * $Log: plugin_imon.c,v $
+ * Revision 1.1  2004/02/18 14:45:43  nicowallmeier
+ * Imon/Telmon plugin ported
+ *\r
+ */\r
\r
+#include "config.h"\r
+#include "debug.h"\r
+#include "plugin.h"\r
+#include "cfg.h"\r
+#include "hash.h"\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+#include <stdlib.h>\r
+#include <sys/types.h>\r
+#include <sys/fcntl.h>\r
+#include <sys/ioctl.h>\r
+#include <sys/time.h>\r
+#include <linux/errno.h>\r
+#include <sys/stat.h>\r
+#include <string.h>\r
+#include <time.h>\r
+\r
+#include <netdb.h>\r
+#include <netinet/in.h>\r
+#include <netinet/tcp.h>\r
+#include <arpa/inet.h>                          /* decl of inet_addr()      */\r
+#include <sys/socket.h>\r
+\r
+static HASH TELMON = { 0, };\r
+static HASH IMON = { 0, };\r
+\r
+static char thost[256];\r
+static int tport;\r
+static char phoneb[256];\r
+\r
+static char ihost[256];\r
+static char ipass[256];\r
+static int iport;\r
+\r
+static int fd=0;\r
+static int err=0;\r
+\r
+/*----------------------------------------------------------------------------\r
+ *  service_connect (host_name, port)       - connect to tcp-service\r
+ *----------------------------------------------------------------------------\r
+ */\r
+static int service_connect (char * host_name, int port){\r
+    struct sockaddr_in  addr;\r
+    struct hostent *    host_p;\r
+    int                 fd;\r
+    int                 opt = 1;\r
+\r
+    (void) memset ((char *) &addr, 0, sizeof (addr));\r
+\r
+    if ((addr.sin_addr.s_addr = inet_addr ((char *) host_name)) == INADDR_NONE)\r
+    {\r
+        host_p = gethostbyname (host_name);\r
+\r
+        if (! host_p)\r
+        {\r
+            error ("%s: host not found\n", host_name);\r
+            return (-1);\r
+        }\r
+\r
+        (void) memcpy ((char *) (&addr.sin_addr), host_p->h_addr,\r
+                        host_p->h_length);\r
+    }\r
+\r
+    addr.sin_family  = AF_INET;\r
+    addr.sin_port    = htons ((unsigned short) port);\r
+\r
+    if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0)\r
+    {                                           /* open socket              */\r
+        perror ("socket");\r
+        return (-1);\r
+    }\r
+    \r
+    (void) setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,\r
+                       (char *) &opt, sizeof (opt));\r
+\r
+    if (connect (fd, (struct sockaddr *) &addr, sizeof (addr)) != 0)\r
+    {\r
+        (void) close (fd);\r
+        perror (host_name);\r
+        return (-1);\r
+    }\r
+\r
+    return (fd);\r
+} /* service_connect (char * host_name, int port) */\r
+\r
+/*----------------------------------------------------------------------------\r
+ *  send_command (int fd, char * str)       - send command to imond\r
+ *----------------------------------------------------------------------------\r
+ */\r
+static void\r
+send_command (int fd, char * str)\r
+{\r
+    char    buf[256];\r
+    int     len = strlen (str);\r
+\r
+    sprintf (buf, "%s\r\n", str);\r
+    write (fd, buf, len + 2);\r
+\r
+    return;\r
+} /* send_command (int fd, char * str) */\r
+\r
+\r
+/*----------------------------------------------------------------------------\r
+ *  get_answer (int fd)                     - get answer from imond\r
+ *----------------------------------------------------------------------------\r
+ */\r
+static char *\r
+get_answer (int fd)\r
+{\r
+    static char buf[8192];\r
+    int         len;\r
+\r
+    len = read (fd, buf, 8192);\r
+\r
+    if (len <= 0)\r
+    {\r
+        return ((char *) NULL);\r
+    }\r
+\r
+    while (len > 1 && (buf[len - 1] == '\n' || buf[len - 1] == '\r'))\r
+    {\r
+        buf[len - 1] = '\0';\r
+        len--;\r
+    }\r
+\r
+    if (! strncmp (buf, "OK ", 3))                      /* OK xxxx          */\r
+    {\r
+        return (buf + 3);\r
+    }\r
+    else if (len > 2 && ! strcmp (buf + len - 2, "OK"))\r
+    {\r
+        *(buf + len - 2) = '\0';\r
+        return (buf);\r
+    }\r
+    else if (len == 2 && ! strcmp (buf + len - 2, "OK"))\r
+    {\r
+        return (buf);\r
+    }\r
+\r
+    return ((char *) NULL);                             /* ERR xxxx         */\r
+} /* get_answer (int fd) */\r
+\r
+/*----------------------------------------------------------------------------\r
+ *  get_value (char * cmd)         - send command, get value\r
+ *----------------------------------------------------------------------------\r
+ */\r
+static char *\r
+get_value (char * cmd)\r
+{\r
+    char *  answer;\r
+\r
+    send_command (fd, cmd);\r
+\r
+    answer = get_answer (fd);\r
+\r
+    if (answer)\r
+    {\r
+        return (answer);\r
+    }\r
+\r
+    return ("");\r
+} /* get_value (char * cmd, int arg) */\r
+\r
+static void phonebook(char *number){\r
+  FILE *  fp;\r
+  char line[256];\r
+  \r
+  fp = fopen (phoneb, "r");\r
+  \r
+  if (! fp) return;\r
+  \r
+  while (fgets (line, 128, fp)){\r
+       if (*line == '#') continue;\r
+       if (!strncmp(line,number,strlen(number))){\r
+         char *komma=strchr(line,',');\r
+         char *beginn=strchr(line,'=');\r
+         if (!beginn) return;\r
+         while (strrchr(line,'\r')) strrchr(line,'\r')[0]='\0';\r
+         while (strrchr(line,'\n')) strrchr(line,'\n')[0]='\0';\r
+         if (komma) komma[0]='\0';\r
+         strcpy(number,beginn+1);\r
+         break;\r
+       }       \r
+  }\r
+  \r
+  fclose(fp);\r
+}\r
+\r
+\r
+static int parse_telmon(){\r
+ static int telmond_fd=-2;\r
+ static char oldanswer[128];\r
+ int age;\r
+   \r
+ // reread every 1 sec only\r
+ age=hash_age(&TELMON, NULL, NULL);\r
+ if (age>0 && age<=1000) return 0;\r
+\r
+ if (telmond_fd != -1){\r
+  char    telbuf[128];\r
+\r
+  telmond_fd = service_connect (thost, tport);\r
+  if (telmond_fd >= 0){\r
+   int l = read (telmond_fd, telbuf, 127);\r
+   if ((l > 0) && (strcmp(telbuf,oldanswer))){\r
+       char date[11]; \r
+       char time[11];\r
+       char number[256];\r
+       char msn[256];\r
+       sscanf(telbuf,"%s %s %s %s",date,time,number,msn);\r
+       hash_set (&TELMON, "time", time);\r
+       date[4]='\0';\r
+       date[7]='\0';\r
+       snprintf(time, sizeof(time), "%s.%s.%s",date+8,date+5,date);\r
+       hash_set (&TELMON, "number", number);\r
+       hash_set (&TELMON, "msn", msn);\r
+       hash_set (&TELMON, "date", time);\r
+       phonebook(number);\r
+       phonebook(msn);\r
+       hash_set (&TELMON, "name", number);\r
+       hash_set (&TELMON, "msnname", msn);\r
+   }\r
+   close (telmond_fd);\r
+   strcpy(oldanswer,telbuf);\r
+  }\r
+ }\r
+ return 0;\r
+}\r
+\r
+static void my_telmon (RESULT *result, RESULT *arg1){\r
+ char *val=NULL;\r
+ if (parse_telmon()<0) {\r
+  SetResult(&result, R_STRING, ""); \r
+  return;\r
+ }\r
+  \r
+ val=hash_get(&TELMON, R2S(arg1));\r
+ if (val==NULL) val="";\r
+ SetResult(&result, R_STRING, val); \r
+}\r
+\r
+void init(){\r
+ if (fd!=0) return;\r
\r
+ fd=service_connect(ihost,iport);\r
+\r
+ if (fd<0){\r
+  err++;\r
+ } else if ((ipass!=NULL) && (*ipass!='\0')) { // Passwort senden\r
+  char buf[40];\r
+  snprintf(buf,sizeof(buf),"pass %s",ipass);\r
+  send_command(fd,buf);\r
+  get_answer(fd); \r
+ }\r
+}\r
+\r
+static int parse_imon(char *cmd){\r
+ // reread every half sec only\r
+ int age=hash_age(&IMON, cmd, NULL);\r
+ if (age>0 && age<=500) return 0;\r
+\r
+ init(); // establish connection\r
+\r
+ if (err) return -1;\r
\r
+ hash_set (&IMON, cmd , get_value(cmd));\r
\r
+ return 0;\r
+}\r
+\r
+static void my_imon_version (RESULT *result){\r
+ char *val;\r
+ // read only ones\r
+ int age=hash_age(&IMON, "version", NULL);\r
+ if (age<0){\r
+  char *s;\r
+  init();\r
+  if (err){\r
+   SetResult(&result, R_STRING, ""); \r
+   return;\r
+  }\r
+  s=get_value("version");\r
+  for (;;){ // interne Versionsnummer killen\r
+   if (s[0]==' '){\r
+    s=s+1;\r
+    break;\r
+   }\r
+   s=s+1;              \r
+  }\r
+  hash_set (&IMON, "version", s);\r
+ }\r
+       \r
+ val=hash_get(&IMON, "version");\r
+ if (val==NULL) val="";\r
+ SetResult(&result, R_STRING, val); \r
+}\r
+\r
+static int parse_imon_rates(char *channel){\r
+ char buf[128],in[25],out[25];\r
+ char *s;\r
+ int age;\r
+  \r
+ snprintf(buf,sizeof(buf),"rate %s in",channel);\r
\r
+ // reread every half sec only\r
+ age=hash_age(&IMON, buf, NULL);\r
+ if (age>0 && age<=500) return 0;\r
+\r
+ init(); // establish connection\r
+\r
+ if (err) return -1;\r
+\r
+ snprintf(buf, sizeof(buf), "rate %s", channel);\r
+ s=get_value(buf);\r
\r
+ if (sscanf(s,"%s %s",in, out)!=2) return -1;\r
+\r
+ snprintf(buf, sizeof(buf), "rate %s in", channel);\r
+ hash_set (&IMON, buf , in);\r
+ snprintf(buf, sizeof(buf), "rate %s out", channel);\r
+ hash_set (&IMON, buf , out);\r
\r
+ return 0;\r
+}\r
+\r
+\r
+static void my_imon_rates (RESULT *result, RESULT *arg1, RESULT *arg2){\r
+ char *val;\r
+ char buf[128];\r
\r
+ if (parse_imon_rates(R2S(arg1))<0) {\r
+  SetResult(&result, R_STRING, ""); \r
+  return;\r
+ }\r
\r
+ snprintf(buf,sizeof(buf),"rate %s %s",R2S(arg1),R2S(arg2));\r
+\r
+ val=hash_get(&IMON, buf);\r
+ if (val==NULL) val="";\r
+ SetResult(&result, R_STRING, val); \r
+}\r
+\r
+static void my_imon (RESULT *result, RESULT *arg1){\r
+ char *val=NULL,*cmd=R2S(arg1);\r
\r
+ if (parse_imon(cmd)<0) {\r
+  SetResult(&result, R_STRING, ""); \r
+  return;\r
+ }\r
+  \r
+ val=hash_get(&IMON, cmd);\r
+ if (val==NULL) val="";\r
+ SetResult(&result, R_STRING, val); \r
+}\r
+\r
+int plugin_init_imon (void){\r
+ char telmon='\1',imon='\1';   \r
+\r
+ char *s=cfg_get ("Telmon", "Host","127.0.0.1");\r
+ if (*s=='\0') {\r
+  error ("[Telmon] no 'Host' entry in %s", cfg_source());\r
+  telmon='\0';\r
+ } \r
+ strcpy(thost,s);\r
+  \r
+ if ((telmon=='\01') && (cfg_number("Telmon", "Port",5001,1,65536,&tport)<0)){\r
+  error ("[Telmon] no valid port definition");\r
+  telmon='\0'; \r
+ }\r
\r
+ s=cfg_get ("Telmon", "Phonebook","/etc/phonebook");\r
+ strcpy(phoneb,s);\r
\r
+ s=cfg_get ("Imon", "Host", "127.0.0.1");\r
+ if (*s=='\0') {\r
+  error ("[Imon] no 'Host' entry in %s", cfg_source());\r
+  imon='\0';\r
+ }\r
+ strcpy(ihost,s); \r
\r
+ if ((imon=='\01') && (cfg_number("Imon", "Port",5000,1,65536,&iport)<0)){\r
+  error ("[Imon] no valid port definition");\r
+  imon='\0';   \r
+ }\r
\r
+ s=cfg_get ("Imon", "Pass", "");\r
+ strcpy(ipass,s);\r
+       \r
+ if (telmon=='\1') AddFunction ("telmon", 1, my_telmon);\r
+ if (imon=='\1'){\r
+  AddFunction ("imon", 1, my_imon);\r
+  AddFunction ("version", 0, my_imon_version);\r
+  AddFunction ("rates", 2, my_imon_rates);\r
+ }\r
+\r
+ return 0;\r
+}
\ No newline at end of file