From owner-freebsd-current@FreeBSD.ORG Mon Jun 19 13:13:02 2006 Return-Path: X-Original-To: freebsd-current@freebsd.org Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6F72316A47D; Mon, 19 Jun 2006 13:13:02 +0000 (UTC) (envelope-from dsh@vlink.ru) Received: from vlink.ru (rigel.internal.vlink.ru [85.172.168.9]) by mx1.FreeBSD.org (Postfix) with ESMTP id 84D9143D53; Mon, 19 Jun 2006 13:13:00 +0000 (GMT) (envelope-from dsh@vlink.ru) Received: from smtp.smtp.vlink.ru (clamav.smtp.vlink.ru [192.168.4.1]) by deliver.smtp.vlink.ru (Postfix) with ESMTP id 497FFFED6BA; Mon, 19 Jun 2006 17:12:59 +0400 (MSD) Received: from neva.vlink.ru (neva.vlink.ru [85.172.168.66]) by smtp.smtp.vlink.ru (Postfix) with ESMTP id 1F5C410098BB; Mon, 19 Jun 2006 17:12:58 +0400 (MSD) Received: from neva.vlink.ru (localhost [127.0.0.1]) by neva.vlink.ru (8.13.6/8.13.6) with ESMTP id k5JDCwH9034395; Mon, 19 Jun 2006 17:12:58 +0400 (MSD) (envelope-from dsh@vlink.ru) Received: (from dsh@localhost) by neva.vlink.ru (8.13.6/8.13.6/Submit) id k5JDCwJt034392; Mon, 19 Jun 2006 17:12:58 +0400 (MSD) (envelope-from dsh@vlink.ru) To: freebsd-current@freebsd.org From: Denis Shaposhnikov Date: Mon, 19 Jun 2006 17:12:58 +0400 Message-ID: <87bqspwap1.fsf@neva.vlink.ru> User-Agent: Gnus/5.1007 (Gnus v5.10.7) XEmacs/21.4.19 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-Virus-Scanned: ClamAV using ClamSMTP Cc: gad@freebsd.org Subject: patch to newsyslog: run command instead of to sent signal X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Jun 2006 13:13:02 -0000 Hi all! What do you think about this patch? The patch adds new flag "R" to newsyslog.conf which means execute programm specified in path_to_pid_file field after rotating instead of to send signal. This behavior usefull for software like ejabberd/mysql/asterisk which can't reload logfiles on signal. They use external programms for it, like asterisk -rx 'logger reload'. diff -Nru usr.sbin/newsyslog.orig/newsyslog.c usr.sbin/newsyslog/newsyslog.c --- usr.sbin/newsyslog.orig/newsyslog.c Mon Jan 23 17:02:31 2006 +++ usr.sbin/newsyslog/newsyslog.c Mon Jun 19 15:43:34 2006 @@ -111,6 +111,8 @@ /* process when trimming this file. */ #define CE_CREATE 0x0100 /* Create the log file if it does not exist. */ #define CE_NODUMP 0x0200 /* Set 'nodump' on newly created log file. */ +#define CE_RUNCMD 0x0400 /* Execute program on rotate instead */ + /* of signal. */ #define MIN_PID 5 /* Don't touch pids lower than this */ #define MAX_PID 99999 /* was lower, see /usr/include/sys/proc.h */ @@ -147,6 +149,7 @@ pid_t sw_pid; /* the process id from the PID file */ const char *sw_pidtype; /* "daemon" or "process group" */ char sw_fname[1]; /* file the PID was read from */ + int sw_runcmd; /* true if we going to run prog. */ }; struct zipwork_entry { @@ -1348,6 +1351,9 @@ case 'n': working->flags |= CE_NOSIGNAL; break; + case 'r': + working->flags |= CE_RUNCMD; + break; case 'u': working->flags |= CE_SIGNALGROUP; break; @@ -1702,7 +1708,7 @@ struct sigwork_entry *nextsig; int kres, secs; - if (!(swork->sw_pidok) || swork->sw_pid == 0) + if (!(swork->sw_pidok) || (swork->sw_pid == 0 && !swork->sw_runcmd)) return; /* no work to do... */ /* @@ -1743,7 +1749,11 @@ return; } - kres = kill(swork->sw_pid, swork->sw_signum); + if (swork->sw_runcmd) + kres = system(swork->sw_fname); + else + kres = kill(swork->sw_pid, swork->sw_signum); + if (kres != 0) { /* * Assume that "no such process" (ESRCH) is something @@ -1754,12 +1764,22 @@ */ if (errno != ESRCH) swork->sw_pidok = 0; - warn("can't notify %s, pid %d", swork->sw_pidtype, - (int)swork->sw_pid); + if (swork->sw_runcmd) + warn("can't notify %s by %s", swork->sw_pidtype, + swork->sw_fname); + else + warn("can't notify %s, pid %d", swork->sw_pidtype, + (int)swork->sw_pid); } else { - if (verbose) - printf("Notified %s pid %d = %s\n", swork->sw_pidtype, - (int)swork->sw_pid, swork->sw_fname); + if (verbose) { + if (swork->sw_runcmd) + printf("Notified %s by %s\n", + swork->sw_pidtype, swork->sw_fname); + else + printf("Notified %s pid %d = %s\n", + swork->sw_pidtype, (int)swork->sw_pid, + swork->sw_fname); + } if (secs > 0) { if (verbose) printf("Pause %d second(s) between signals\n", @@ -1956,6 +1976,12 @@ swork->sw_pidok = 0; swork->sw_pid = 0; swork->sw_pidtype = "daemon"; + swork->sw_runcmd = 0; + if (ent->flags & CE_RUNCMD) { + swork->sw_pidok = swork->sw_runcmd = 1; + return; + } + if (ent->flags & CE_SIGNALGROUP) { /* * If we are expected to signal a process-group when diff -Nru usr.sbin/newsyslog.orig/newsyslog.conf.5 usr.sbin/newsyslog/newsyslog.conf.5 --- usr.sbin/newsyslog.orig/newsyslog.conf.5 Fri Jan 28 01:41:06 2005 +++ usr.sbin/newsyslog/newsyslog.conf.5 Mon Jun 19 15:43:34 2006 @@ -290,6 +290,11 @@ .It Cm N indicates that there is no process which needs to be signaled when this log file is rotated. +.It Cm R +indicates that the file specified by +.Ar path_to_pid_file +should be executed when this log file is rotated instead of to send +signal. .It Cm U indicates that the file specified by .Ar path_to_pid_file -- DSS5-RIPE DSS-RIPN 2:550/5068@fidonet 2:550/5069@fidonet xmpp:dsh@vlink.ru mailto:dsh@vlink.ru http://neva.vlink.ru/~dsh/