From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 6787E1F8C7 for ; Fri, 3 Sep 2021 08:54:27 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 1/8] lei: dump errors to syslog, and not to CLI Date: Fri, 3 Sep 2021 08:54:20 +0000 Message-Id: <20210903085427.5541-2-e@80x24.org> In-Reply-To: <20210903085427.5541-1-e@80x24.org> References: <20210903085427.5541-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Dumping errors from the previous run can often get lost, so just spew to syslog since it's a standard place to put errors that don't make it to a client. Note: we don't rely on $SIG{__WARN__} since some of the Net:: stuff will write directly to STDERR (as will external processes). --- lib/PublicInbox/LEI.pm | 16 +++++++++------- lib/PublicInbox/LeiStoreErr.pm | 4 ++-- t/lei-daemon.t | 5 ----- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 41e811ca..9e9aa165 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -27,6 +27,7 @@ use PublicInbox::Eml; use Time::HiRes qw(stat); # ctime comparisons for config cache use File::Path qw(mkpath); use File::Spec; +use Sys::Syslog qw(openlog syslog closelog); our $quit = \&CORE::exit; our ($current_lei, $errors_log, $listener, $oldset, $dir_idle, $recv_cmd, $send_cmd); @@ -464,7 +465,6 @@ sub x_it ($$) { my ($self, $code) = @_; # make sure client sees stdout before exit $self->{1}->autoflush(1) if $self->{1}; - dump_and_clear_log(); stop_pager($self); if ($self->{pkt_op_p}) { # to top lei-daemon $self->{pkt_op_p}->pkt_do('x_it', $code); @@ -765,7 +765,6 @@ sub dispatch { my ($self, $cmd, @argv) = @_; local $current_lei = $self; # for __WARN__ $self->{2}->autoflush(1); # keep stdout buffered until x_it|DESTROY - dump_and_clear_log("from previous run\n"); return _help($self, 'no command given') unless defined($cmd); # do not support Getopt bundling for this while ($cmd eq '-C' || $cmd eq '-c') { @@ -1147,10 +1146,12 @@ sub oldset { $oldset } sub dump_and_clear_log { if (defined($errors_log) && -s STDIN && seek(STDIN, 0, SEEK_SET)) { - my @pfx = @_; - unshift(@pfx, "$errors_log ") if @pfx; - warn @pfx, do { local $/; }; - truncate(STDIN, 0) or warn "ftruncate ($errors_log): $!"; + openlog('lei-daemon', 'pid,nowait,nofatal,ndelay', 'user'); + chomp(my @lines = ); + truncate(STDIN, 0) or + syslog('warning', "ftruncate (%s): %m", $errors_log); + for my $l (@lines) { syslog('warning', '%s', $l) } + closelog(); # don't share across fork } } @@ -1243,7 +1244,7 @@ sub lazy_start { (-p STDOUT) or die "E: stdout must be a pipe\n"; open(STDIN, '+>>', $errors_log) or die "open($errors_log): $!"; STDIN->autoflush(1); - dump_and_clear_log("from previous daemon process:\n"); + dump_and_clear_log(); POSIX::setsid() > 0 or die "setsid: $!"; my $pid = fork // die "fork: $!"; return if $pid; @@ -1345,6 +1346,7 @@ sub DESTROY { } $self->{1}->autoflush(1) if $self->{1}; stop_pager($self); + dump_and_clear_log(); # preserve $? for ->fail or ->x_it code } diff --git a/lib/PublicInbox/LeiStoreErr.pm b/lib/PublicInbox/LeiStoreErr.pm index 5f9ba24d..cc085fdc 100644 --- a/lib/PublicInbox/LeiStoreErr.pm +++ b/lib/PublicInbox/LeiStoreErr.pm @@ -2,7 +2,7 @@ # License: AGPL-3.0+ # forwards stderr from lei/store process to any lei clients using -# the same store +# the same store, falls back to syslog if no matching clients exist. package PublicInbox::LeiStoreErr; use strict; use v5.10.1; @@ -31,7 +31,7 @@ sub event_step { print $err $$rbuf and $printed = 1; } if (!$printed) { - openlog('lei-store', 'pid,nowait,nofatal,ndelay', 'user'); + openlog('lei/store', 'pid,nowait,nofatal,ndelay', 'user'); for my $l (split(/\n/, $$rbuf)) { syslog('warning', '%s', $l) } closelog(); # don't share across fork } diff --git a/t/lei-daemon.t b/t/lei-daemon.t index a7c4b799..b0c94a87 100644 --- a/t/lei-daemon.t +++ b/t/lei-daemon.t @@ -21,14 +21,9 @@ test_lei({ daemon_only => 1 }, sub { ok(kill(0, $pid), 'pid is valid'); ok(-S $sock, 'sock created'); is(-s $err_log, 0, 'nothing in errors.log'); - open my $efh, '>>', $err_log or BAIL_OUT $!; - print $efh "phail\n" or BAIL_OUT $!; - close $efh or BAIL_OUT $!; - lei_ok('daemon-pid'); chomp(my $pid_again = $lei_out); is($pid, $pid_again, 'daemon-pid idempotent'); - like($lei_err, qr/phail/, 'got mock "phail" error previous run'); SKIP: { skip 'only testing open files on Linux', 1 if $^O ne 'linux';