]> sourceware.org Git - systemtap.git/commitdiff
The logger pmda now asks for a logfile to monitor.
authorDavid Smith <dsmith@redhat.com>
Fri, 11 Feb 2011 17:16:57 +0000 (11:16 -0600)
committerDavid Smith <dsmith@redhat.com>
Fri, 11 Feb 2011 17:16:57 +0000 (11:16 -0600)
* pcp/src/pmdas/logger/logger.h: New file.
* pcp/src/pmdas/logger/loggerMain.c: New custom main loop.
* pcp/src/pmdas/logger/logger.c (main): Added option for logfile to
  monitor and calls new custom main loop.
* pcp/src/pmdas/logger/Install: Asks for logfile name to monitor.
* pcp/src/pmdas/logger/GNUmakefile: Added loggerMain.c and logger.h.

pcp/src/pmdas/logger/GNUmakefile
pcp/src/pmdas/logger/Install
pcp/src/pmdas/logger/logger.c
pcp/src/pmdas/logger/logger.h [new file with mode: 0644]
pcp/src/pmdas/logger/loggerMain.c [new file with mode: 0644]

index 71f23fe28a78eb77f0a2209ebae3e68b1c376d31..4e500e3f199241baa9c6b163f61f95971df86234 100644 (file)
@@ -26,8 +26,8 @@ LIBTARGET = pmda_logger.$(DSOSUFFIX)
 TARGETS = $(CMDTARGET) $(LIBTARGET)
 
 DFILES         = README
-CFILES = logger.c percontext.c
-HFILES = percontext.h
+CFILES = logger.c percontext.c loggerMain.c
+HFILES = percontext.h logger.h
 LLDLIBS = -lpcp -lpcp_pmda
 LCFLAGS = -I.
 LSRCFILES = Install Remove pmns help $(DFILES) root GNUmakefile.install
@@ -43,6 +43,7 @@ LDIRT = domain.h *.o $(IAM).log pmda$(IAM) pmda_$(IAM).so
 default_pcp default:   domain.h $(TARGETS)
 
 logger.o percontext.o: percontext.h
+logger.o loggerMain.o: logger.h
 
 include $(BUILDRULES)
 
index c2dbd667cff79ecd5a89ddd2ddadfaddc9eb5c9e..53270b76b4ac1fe1cba85721bfe525ab984710d5 100644 (file)
@@ -38,6 +38,28 @@ pmda_interface=4
 # Do it
 #
 pmdaSetup
+
+# Get logfile to monitor
+if $do_pmda
+then
+    args=""
+
+    $PCP_ECHO_PROG $PCP_ECHO_N "Logfile path to monintor? ""$PCP_ECHO_C"
+    read value
+
+    if [ -z "$value" ]
+    then
+       echo "Error: logfile path must be specifed." >&2
+       exit 1
+    else
+       if [ ! -e $value ]
+       then
+           echo "Warning: logfile $value doesn't exist!  Reinstall to change."
+       fi
+       args="$args -m $value"
+    fi
+fi
+
 pmdaInstall
 
 exit 0
index 8bb14dba26b2cd10b21eaaf4f2167159e9475fc3..6a41cde0f7be76c0c83dd7783738791c01a9447d 100644 (file)
@@ -23,6 +23,7 @@
 #include <pcp/impl.h>
 #include <pcp/pmda.h>
 #include "domain.h"
+#include "logger.h"
 #include "percontext.h"
 
 /*
@@ -51,6 +52,7 @@ static pmdaMetric metrictab[] = {
 
 static char    mypath[MAXPATHLEN];
 static int     isDSO = 1;              /* ==0 if I am a daemon */
+char          *monitor_path = NULL;
 
 void
 logger_end_contextCallBack(int ctx)
@@ -123,7 +125,8 @@ usage(void)
     fprintf(stderr, "Usage: %s [options]\n\n", pmProgname);
     fputs("Options:\n"
          "  -d domain    use domain (numeric) for metrics domain of PMDA\n"
-         "  -l logfile   write log into logfile rather than using default log name\n",
+         "  -l logfile   write log into logfile rather than using default log name\n"
+         "  -m logfile   logfile to monitor (required)\n",
              stderr);          
     exit(1);
 }
@@ -134,6 +137,7 @@ usage(void)
 int
 main(int argc, char **argv)
 {
+    int                        c;
     int                        err = 0;
     int                        sep = __pmPathSeparator();
     pmdaInterface      desc;
@@ -146,9 +150,17 @@ main(int argc, char **argv)
     pmdaDaemon(&desc, PMDA_INTERFACE_5, pmProgname, LOGGER,
                "logger.log", mypath);
 
-    if (pmdaGetOpt(argc, argv, "D:d:l:?", &desc, &err) != EOF)
-       err++;
-    if (err)
+    while ((c = pmdaGetOpt(argc, argv, "D:d:l:m:?", &desc, &err)) != EOF) {
+       switch (c) {
+         case 'm':
+           monitor_path = optarg;
+           break;
+         default:
+           err++;
+           break;
+       }
+    }
+    if (err || monitor_path == NULL)
        usage();
 
     pmdaOpenLog(&desc);
@@ -163,7 +175,8 @@ main(int argc, char **argv)
     signal(SIGHUP, SIG_IGN);
 #endif
 
-    pmdaMain(&desc);
+    // We use our custom main.
+    loggerMain(&desc);
 
     exit(0);
 }
diff --git a/pcp/src/pmdas/logger/logger.h b/pcp/src/pmdas/logger/logger.h
new file mode 100644 (file)
index 0000000..a70c8d9
--- /dev/null
@@ -0,0 +1,3 @@
+extern char *monitor_path;
+
+extern void loggerMain(pmdaInterface *dispatch);
diff --git a/pcp/src/pmdas/logger/loggerMain.c b/pcp/src/pmdas/logger/loggerMain.c
new file mode 100644 (file)
index 0000000..7eb4113
--- /dev/null
@@ -0,0 +1,59 @@
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+#include <pcp/pmda.h>
+#include <sys/select.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "logger.h"
+
+void
+loggerMain(pmdaInterface *dispatch)
+{
+    int pmcdfd = __pmdaInFd(dispatch);
+    int maxfd;
+    fd_set fds;
+    fd_set readyfds;
+    int nready;
+    int monitorfd;
+
+    /* Try to open logfile to monitor */
+    monitorfd = open(monitor_path, O_RDONLY);
+    if (monitorfd < 0) {
+       __pmNotifyErr(LOG_ERR, "open failure on %s", monitor_path);
+       exit(1);
+    }
+
+    FD_ZERO(&fds);
+    FD_SET(monitorfd, &fds);
+    FD_SET(pmcdfd, &fds);
+    maxfd = (monitorfd > pmcdfd) ? monitorfd : pmcdfd;
+
+    for (;;) {
+       memcpy(&readyfds, &fds, sizeof(readyfds));
+       nready = select(maxfd+1, &readyfds, NULL, NULL, NULL);
+
+       if (nready == 0)
+           continue;
+       else if (nready < 0) {
+           if (errno != EINTR) {
+               __pmNotifyErr(LOG_ERR, "select failure");
+               exit(1);
+           }
+           continue;
+       }
+
+       if (FD_ISSET(pmcdfd, &readyfds)) {
+#ifdef PCP_DEBUG
+           if (pmDebug & DBG_TRACE_APPL0)
+               __pmNotifyErr(LOG_DEBUG, "processing pmcd request [fd=%d]", pmcdfd);
+#endif
+           if (__pmdaMainPDU(dispatch) < 0) {
+               exit(1);        /* fatal if we lose pmcd */
+           }
+       }
+       if (FD_ISSET(monitorfd, &readyfds)) {
+           /* do something with logfile input */
+       }
+    }
+}
This page took 0.032748 seconds and 5 git commands to generate.