* [PATCH] [2/5] put xen console message into syslog
@ 2006-10-20 12:48 MINAI Katsuhito
2006-10-20 16:52 ` Daniel P. Berrange
2006-10-20 16:59 ` Anthony Liguori
0 siblings, 2 replies; 6+ messages in thread
From: MINAI Katsuhito @ 2006-10-20 12:48 UTC (permalink / raw)
To: xen-devel
[-- Attachment #1: Type: text/plain, Size: 140 bytes --]
Hi,
[2/5] add xenlogd daemon for xen console logging
Signed-off-by: Katsuhito Minai <minai@jp.fujitsu.com>
Best Regards,
Katsuhito Minai
[-- Attachment #2: 2.xenlogd.patch --]
[-- Type: application/octet-stream, Size: 7654 bytes --]
diff -r 6ed4368b4a9e tools/misc/Makefile
--- a/tools/misc/Makefile Sun Oct 15 09:53:20 2006 +0100
+++ b/tools/misc/Makefile Wed Oct 11 11:37:34 2006 +0900
@@ -13,10 +13,10 @@ CFLAGS += $(INCLUDES)
HDRS = $(wildcard *.h)
-TARGETS = xenperf xc_shadow
+TARGETS = xenperf xc_shadow xenlogd
INSTALL_BIN = $(TARGETS) xencons
-INSTALL_SBIN = netfix xm xen-bugtool xend xenperf
+INSTALL_SBIN = netfix xm xen-bugtool xend xenperf xenlogd
.PHONY: all
all: build
diff -r 6ed4368b4a9e tools/misc/xenlogd.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/misc/xenlogd.c Fri Oct 20 21:05:43 2006 +0900
@@ -0,0 +1,307 @@
+/*
+ * xenlogd: daemon to put the xen message to syslog
+ */
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+
+#define XCDSIZE (32*1024)
+#define XENHEAD "(XEN) "
+#define PIDFILE "/var/run/xenlogd.pid"
+
+extern int xc_interface_open(void);
+extern int xc_readconsolering_index(int, unsigned int *, char **, int *);
+static char *cmdname;
+
+void
+quit(int xc, char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsyslog(LOG_KERN|LOG_ALERT, fmt, ap);
+ va_end(ap);
+ exit(xc);
+}
+
+int
+putsyslog(char *bp, int size)
+{
+ static char *prsvp = NULL;
+ static int prsvc = 0;
+ char *endp;
+ int offset;
+
+ if ((prsvp == NULL) && ((prsvp = malloc(XCDSIZE)) == NULL))
+ {
+ quit(1, "allocate buffer failed");
+ }
+
+ bp[size] = '\0';
+
+ for (endp = bp + size; bp < endp; bp++)
+ {
+ if (*bp == '\n')
+ {
+ prsvp[prsvc] = '\0';
+ if ((strncmp(prsvp, XENHEAD, strlen(XENHEAD)) == 0))
+ {
+ offset = strlen(XENHEAD);
+ }
+ else
+ {
+ offset = 0;
+ }
+ syslog(LOG_KERN|LOG_ALERT, "%s", prsvp + offset);
+ prsvc = 0;
+ }
+ else
+ {
+ prsvp[prsvc] = *bp;
+ prsvc++;
+ }
+ }
+ return(prsvc);
+}
+
+static void child_exit(int sig)
+{
+ while (waitpid(-1, NULL, WNOHANG) > 0);
+}
+
+static void term_daemon(int sig)
+{
+ unlink(PIDFILE);
+ exit(0);
+}
+
+void
+daemonize(void)
+{
+ pid_t pid;
+ int fd;
+ int len;
+ int i;
+ int pfd[2];
+ struct sigaction siga;
+ char buf[1024];
+
+ if (getppid() == 1)
+ return;
+
+ signal(SIGPIPE, SIG_IGN);
+
+ if (pipe(pfd) < 0)
+ quit(1, "open pipe failed");
+
+ if ((pid = fork()) > 0)
+ exit(0);
+
+ if (pid < 0)
+ quit(1, "fork failed: errno = %d", errno);
+
+ setsid();
+
+ if ((pid = fork()) > 0)
+ exit(0);
+
+ if (pid < 0)
+ quit(1, "fork failed: errno = %d", errno);
+
+ if ((fd = open("/dev/null",O_RDWR)) == -1)
+ quit(1, "open /dev/null failed: errno = %d", errno);
+
+ for (i = 0; i <= 2; i++)
+ {
+ close(i);
+ dup2(fd, i);
+ }
+
+ close(fd);
+ umask(027);
+
+ if (chdir("/") < 0)
+ quit(1, "change to root dir failed: errno = %d", errno);
+
+ pid = getpid();
+ snprintf(buf, sizeof(buf), "%s.%d", PIDFILE, pid);
+
+ fd = open(buf, O_RDWR | O_CREAT | O_EXCL);
+ if (fd < 0)
+ quit(1, "open %s failed: errno = %d", buf, errno);
+
+ if (link(buf, PIDFILE) < 0)
+ {
+ unlink(buf);
+ quit(1, "other logging daemon may keep alive");
+ }
+ unlink(buf);
+
+ len = sprintf(buf, "%d\n", pid);
+ if (write(fd, buf, len) < 0)
+ quit(1, "write %s failed: errno = %d", PIDFILE, errno);
+
+ siga.sa_handler = term_daemon;
+ sigemptyset(&siga.sa_mask);
+ sigaddset(&siga.sa_mask, SIGTERM);
+ siga.sa_flags = 0;
+
+ signal(SIGCHLD, child_exit);
+ signal(SIGTSTP, SIG_IGN);
+ signal(SIGTTOU, SIG_IGN);
+ signal(SIGTTIN, SIG_IGN);
+ sigaction(SIGTERM, &siga, NULL);
+
+ close(pfd[1]);
+ read(pfd[0], buf, sizeof(buf));
+ close(pfd[0]);
+}
+
+void
+kill_daemon(void)
+{
+ int fd, pid, len;
+ char buf[1024];
+ char *comm;
+
+ fd = open(PIDFILE, O_RDWR);
+ if (fd < 0)
+ {
+ if (errno == ENOENT)
+ {
+ fprintf(stderr,"%s: no other daemon exist\n", cmdname);
+ }
+ else
+ {
+ perror("open error: ");
+ }
+ goto delpidfile;
+ }
+ len = read(fd, buf, sizeof(buf));
+ if (len < 0)
+ {
+ perror("read error: ");
+ goto delpidfile;
+ }
+ close(fd);
+ buf[len] = '\0';
+ pid = atoi(buf);
+
+ if (pid)
+ {
+ snprintf(buf, sizeof(buf), "/proc/%d/stat", pid);
+ if ((fd = open(buf, O_RDONLY)) >= 0)
+ {
+ len = read(fd, buf, sizeof(buf));
+ strtok(buf, " ");
+ if (((comm = strtok(NULL, " ")) != NULL)
+ && (strcmp(comm, "(xenlogd)") == 0))
+ {
+ if (kill(pid, SIGTERM) < 0)
+ {
+ perror("kill error: ");
+ goto delpidfile;
+ }
+ while (kill(pid, SIGTERM) == 0);
+ if (errno != ESRCH)
+ perror("kill error: ");
+ }
+ }
+ }
+
+ delpidfile:
+ if ((fd = open(PIDFILE, O_RDWR)) >= 0) {
+ close(fd);
+ unlink(PIDFILE);
+ fprintf(stderr, "%s: lockfile existed but no daemon alive. it was deleted.\n", cmdname);
+ }
+}
+
+void usage(void)
+{
+ fprintf(stderr, "usage: %s [-h] [-n] [-k] [-r]\n", cmdname);
+ fprintf(stderr, " -h: print help\n");
+ fprintf(stderr, " -n: no daemonize\n");
+ fprintf(stderr, " -k: kill alive logging daemon\n");
+ fprintf(stderr, " -r: restart logging daemon after kill alive one\n");
+ exit(0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ uint indexc;
+ int rc, bufsize, opt, xcfd;
+ char *bufaddr;
+ int no_daemonize = 0;
+ int kill_d = 0;
+ int restart_d = 0;
+
+ cmdname = argv[0];
+
+ while ((opt = getopt(argc, argv, "hnkr")) != -1)
+ {
+ switch (opt)
+ {
+ case 'h':
+ case '?':
+ default:
+ usage();
+ break;
+ case 'n':
+ no_daemonize = 1;
+ break;
+ case 'r':
+ restart_d = 1;
+ /* fall through */
+ case 'k':
+ kill_d = 1;
+ break;
+ }
+ }
+
+ openlog(XENHEAD, LOG_NDELAY|LOG_CONS, LOG_KERN);
+
+ xcfd = xc_interface_open();
+ if (xcfd < 0)
+ quit(1, "failed to open xen interface");
+
+ if ((bufaddr = malloc(XCDSIZE)) ==NULL)
+ quit(1, "allocate buffer failed");
+
+ if (kill_d)
+ {
+ kill_daemon();
+ if (!restart_d)
+ exit(0);
+ }
+
+ if (!no_daemonize)
+ daemonize();
+
+ indexc = 0;
+
+ for (;;)
+ {
+ bufsize = XCDSIZE;
+
+ rc = xc_readconsolering_index(xcfd, &indexc, &bufaddr, &bufsize);
+ if (rc < 0)
+ quit(1, "error: read console ring: %d: errno %d", rc, errno);
+
+ putsyslog(bufaddr, bufsize);
+ if (bufsize)
+ continue;
+ sleep(1);
+ }
+}
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] [2/5] put xen console message into syslog
2006-10-20 12:48 [PATCH] [2/5] put xen console message into syslog MINAI Katsuhito
@ 2006-10-20 16:52 ` Daniel P. Berrange
2006-10-20 19:07 ` Keir Fraser
2006-10-20 16:59 ` Anthony Liguori
1 sibling, 1 reply; 6+ messages in thread
From: Daniel P. Berrange @ 2006-10-20 16:52 UTC (permalink / raw)
To: MINAI Katsuhito; +Cc: xen-devel
On Fri, Oct 20, 2006 at 09:48:48PM +0900, MINAI Katsuhito wrote:
> Hi,
>
> [2/5] add xenlogd daemon for xen console logging
Why have yet another daemon running in Dom0? We've already got xenconsoled
reading this data from the guest ring buffers, so it strikes me it'd be
better to just add a command line flag to that existing daemon to make
it log stuff to syslog directly.
Regards,
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] [2/5] put xen console message into syslog
2006-10-20 12:48 [PATCH] [2/5] put xen console message into syslog MINAI Katsuhito
2006-10-20 16:52 ` Daniel P. Berrange
@ 2006-10-20 16:59 ` Anthony Liguori
2006-10-21 7:51 ` Keir Fraser
1 sibling, 1 reply; 6+ messages in thread
From: Anthony Liguori @ 2006-10-20 16:59 UTC (permalink / raw)
To: MINAI Katsuhito, xen-devel
MINAI Katsuhito wrote:
> Hi,
>
> [2/5] add xenlogd daemon for xen console logging
Instead of adding yet another daemon to Xen, why not just add this
functionality to xenconsoled?
Seems like an appropriate place for it.
Regards,
Anthony Liguori
> Signed-off-by: Katsuhito Minai <minai@jp.fujitsu.com>
>
> Best Regards,
> Katsuhito Minai
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] [2/5] put xen console message into syslog
2006-10-20 16:52 ` Daniel P. Berrange
@ 2006-10-20 19:07 ` Keir Fraser
2006-10-20 19:29 ` Daniel P. Berrange
0 siblings, 1 reply; 6+ messages in thread
From: Keir Fraser @ 2006-10-20 19:07 UTC (permalink / raw)
To: Daniel P. Berrange, MINAI Katsuhito; +Cc: xen-devel
On 20/10/06 5:52 pm, "Daniel P. Berrange" <berrange@redhat.com> wrote:
>>
>> [2/5] add xenlogd daemon for xen console logging
>
> Why have yet another daemon running in Dom0? We've already got xenconsoled
> reading this data from the guest ring buffers, so it strikes me it'd be
> better to just add a command line flag to that existing daemon to make
> it log stuff to syslog directly.
I assume this is for Xen's own logging output ('xm dmesg'). Still, it would
fairly natural to extend xenconsoled with a new 'backend type' that can read
the logging data from Xen.
-- Keir
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] [2/5] put xen console message into syslog
2006-10-20 19:07 ` Keir Fraser
@ 2006-10-20 19:29 ` Daniel P. Berrange
0 siblings, 0 replies; 6+ messages in thread
From: Daniel P. Berrange @ 2006-10-20 19:29 UTC (permalink / raw)
To: Keir Fraser; +Cc: xen-devel, MINAI Katsuhito
On Fri, Oct 20, 2006 at 08:07:28PM +0100, Keir Fraser wrote:
>
>
>
> On 20/10/06 5:52 pm, "Daniel P. Berrange" <berrange@redhat.com> wrote:
>
> >>
> >> [2/5] add xenlogd daemon for xen console logging
> >
> > Why have yet another daemon running in Dom0? We've already got xenconsoled
> > reading this data from the guest ring buffers, so it strikes me it'd be
> > better to just add a command line flag to that existing daemon to make
> > it log stuff to syslog directly.
>
> I assume this is for Xen's own logging output ('xm dmesg'). Still, it would
> fairly natural to extend xenconsoled with a new 'backend type' that can read
> the logging data from Xen.
Ah yes, I didn't look closely enough to see it was the hypervisor logs
rather than guest logs. We certainly could also benefit from having the
guest consoles persistently logged in the host too.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: [PATCH] [2/5] put xen console message into syslog
2006-10-20 16:59 ` Anthony Liguori
@ 2006-10-21 7:51 ` Keir Fraser
0 siblings, 0 replies; 6+ messages in thread
From: Keir Fraser @ 2006-10-21 7:51 UTC (permalink / raw)
To: Anthony Liguori, MINAI Katsuhito, xen-devel
On 20/10/06 5:59 pm, "Anthony Liguori" <anthony@codemonkey.ws> wrote:
>> [2/5] add xenlogd daemon for xen console logging
>
> Instead of adding yet another daemon to Xen, why not just add this
> functionality to xenconsoled?
>
> Seems like an appropriate place for it.
Yes, I'm going to sort through the patches and apply the useful hypervisor
and library pieces, but we don't want another daemon. Adding xen-console and
persistent-logging support to xenconsoled is the way to go. The only
question then is what is the right way to configure it (e.g., to tell it
what to log to syslogd, or to a file, or send via a socket)? I think
configuration via xenbus nodes written by xend would be reasonable -- allows
dynamic configuration changes e.g., as domains come and go.
-- Keir
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2006-10-21 7:51 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-20 12:48 [PATCH] [2/5] put xen console message into syslog MINAI Katsuhito
2006-10-20 16:52 ` Daniel P. Berrange
2006-10-20 19:07 ` Keir Fraser
2006-10-20 19:29 ` Daniel P. Berrange
2006-10-20 16:59 ` Anthony Liguori
2006-10-21 7:51 ` Keir Fraser
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.