X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=blobdiff_plain;f=lib%2FPublicInbox%2FNNTPD.pm;h=6e79f0be697fc909ac49ad301b54a4447eebfdc6;hp=fc26c5c0b812c18875ae2370b3efbb701b31dc98;hb=9b0c238f887475d920a8589b492ec15c63770152;hpb=84b2f63cea98eeed16ce75fa031fb8d7c2a2b66c diff --git a/lib/PublicInbox/NNTPD.pm b/lib/PublicInbox/NNTPD.pm index fc26c5c0..6e79f0be 100644 --- a/lib/PublicInbox/NNTPD.pm +++ b/lib/PublicInbox/NNTPD.pm @@ -1,60 +1,67 @@ -# Copyright (C) 2016 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # represents an NNTPD (currently a singleton), # see script/public-inbox-nntpd for how it is used package PublicInbox::NNTPD; use strict; -use warnings; -require PublicInbox::NewsGroup; -require PublicInbox::Config; +use v5.10.1; +use Sys::Hostname; +use PublicInbox::Config; +use PublicInbox::InboxIdle; +use PublicInbox::NNTPdeflate; # loads PublicInbox::NNTP sub new { my ($class) = @_; + my $pi_cfg = PublicInbox::Config->new; + my $name = $pi_cfg->{'publicinbox.nntpserver'}; + if (!defined($name) or $name eq '') { + $name = hostname; + } elsif (ref($name) eq 'ARRAY') { + $name = $name->[0]; + } + bless { groups => {}, err => \*STDERR, out => \*STDOUT, - grouplist => [], + pi_cfg => $pi_cfg, + servername => $name, + greet => \"201 $name ready - post via email\r\n", + # accept_tls => { SSL_server => 1, ..., SSL_reuse_ctx => ... } + # idler => PublicInbox::InboxIdle }, $class; } -sub refresh_groups () { - my ($self) = @_; - my $pi_config = PublicInbox::Config->new; - my $new = {}; - my @list; - foreach my $k (keys %$pi_config) { - $k =~ /\Apublicinbox\.([^\.]+)\.mainrepo\z/ or next; - my $g = $1; - my $git_dir = $pi_config->{$k}; - my $addr = $pi_config->{"publicinbox.$g.address"}; - my $ngname = $pi_config->{"publicinbox.$g.newsgroup"}; - my $url = $pi_config->{"publicinbox.$g.url"}; - if (defined $ngname) { - next if ($ngname eq ''); # disabled - $g = $ngname; +sub refresh_groups { + my ($self, $sig) = @_; + my $pi_cfg = $sig ? PublicInbox::Config->new : $self->{pi_cfg}; + my $groups = $pi_cfg->{-by_newsgroup}; # filled during each_inbox + my $cache = eval { $pi_cfg->ALL->misc->nntpd_cache_load } // {}; + $pi_cfg->each_inbox(sub { + my ($ibx) = @_; + my $ngname = $ibx->{newsgroup} // return; + my $ce = $cache->{$ngname}; + if (($ce and (%$ibx = (%$ibx, %$ce))) || $ibx->nntp_usable) { + # only valid if msgmap and over works + # preload to avoid fragmentation: + $ibx->description; + $ibx->base_url; + } else { + delete $groups->{$ngname}; + delete $ibx->{newsgroup}; + # Note: don't be tempted to delete more for memory + # savings just yet: NNTP, IMAP, and WWW may all + # run in the same process someday. } - my $ng = PublicInbox::NewsGroup->new($g, $git_dir, $addr, $url); - my $old_ng = $self->{groups}->{$g}; - - # Reuse the old one if possible since it can hold - # references to valid mm and gcf objects - if ($old_ng) { - $old_ng->update($ng); - $ng = $old_ng; - } - - # Only valid if msgmap and search works - if ($ng->usable) { - $new->{$g} = $ng; - push @list, $ng; - } - } - @list = sort { $a->{newsgroup} cmp $b->{newsgroup} } @list; - $self->{grouplist} = \@list; + }); + @{$self->{groupnames}} = sort(keys %$groups); # this will destroy old groups that got deleted - %{$self->{groups}} = %$new; + $self->{pi_cfg} = $pi_cfg; +} + +sub idler_start { + $_[0]->{idler} //= PublicInbox::InboxIdle->new($_[0]->{pi_cfg}); } 1;