X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-watch;h=b6c6b2022bb7ae64e6aae5e4cccaa73b68866e59;hb=03c9119ec613fa43dcf0a50b5f35754f13228bc8;hp=42ae55ae9b760567e4238738329a7457a59994b5;hpb=619b9d46b91cdf0f523b3804ec9a07b0f1ba4efe;p=public-inbox.git diff --git a/script/public-inbox-watch b/script/public-inbox-watch index 42ae55ae..b6c6b202 100755 --- a/script/public-inbox-watch +++ b/script/public-inbox-watch @@ -1,16 +1,57 @@ #!/usr/bin/perl -w -# Copyright (C) 2016 all contributors +# Copyright (C) 2016-2020 all contributors # License: AGPL-3.0+ use strict; -use warnings; -use PublicInbox::WatchMaildir; +use IO::Handle; +use PublicInbox::Watch; use PublicInbox::Config; -my $config = PublicInbox::Config->new; -my $watch_md = PublicInbox::WatchMaildir->new($config); -if ($watch_md) { - my $scan = sub { $watch_md->scan }; - $SIG{USR1} = $scan; - $SIG{ALRM} = sub { $SIG{ALRM} = 'DEFAULT'; $scan->() }; - alarm(1); - $watch_md->watch; +use PublicInbox::DS; +use PublicInbox::Sigfd; +use PublicInbox::Syscall qw($SFD_NONBLOCK); +my $oldset = PublicInbox::Sigfd::block_signals(); +STDOUT->autoflush(1); +STDERR->autoflush(1); +local $0 = $0; # local since this script may be eval-ed +my $watch = PublicInbox::Watch->new(PublicInbox::Config->new); +my $reload = sub { + my $prev = $watch or return; # SIGQUIT issued + $watch->quit; + $watch = PublicInbox::Watch->new(PublicInbox::Config->new); + if ($watch) { + warn("I: reloaded\n"); + } else { + warn("E: reloading failed\n"); + $watch = $prev; + } +}; + +if ($watch) { + my $scan = sub { + return if !$watch; + warn "I: scanning\n"; + $watch->trigger_scan('full'); + }; + my $quit = sub { + $watch->quit if $watch; + $watch = undef; + $0 .= ' quitting'; + }; + my $sig = { + HUP => $reload, + USR1 => $scan, + CHLD => \&PublicInbox::DS::enqueue_reap, + }; + $sig->{QUIT} = $sig->{TERM} = $sig->{INT} = $quit; + + # --no-scan is only intended for testing atm, undocumented. + unless (grep(/\A--no-scan\z/, @ARGV)) { + PublicInbox::DS::requeue($scan); + } + my $sigfd = PublicInbox::Sigfd->new($sig, $SFD_NONBLOCK); + local %SIG = (%SIG, %$sig) if !$sigfd; + if (!$sigfd) { + PublicInbox::Sigfd::set_sigmask($oldset); + PublicInbox::DS->SetLoopTimeout(1000); + } + $watch->watch($sig, $oldset) while ($watch); }