# 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 v5.10.1; use Sys::Hostname; use PublicInbox::Config; use PublicInbox::InboxIdle; use PublicInbox::NNTP; sub new { my ($class) = @_; bless { err => \*STDERR, out => \*STDOUT, # pi_cfg => $pi_cfg, # ssl_ctx_opt => { SSL_cert_file => ..., SSL_key_file => ... } # idler => PublicInbox::InboxIdle }, $class; } sub refresh_groups { my ($self, $sig) = @_; 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]; } if ($name ne ($self->{servername} // '')) { $self->{servername} = $name; $self->{greet} = \"201 $name ready - post via email\r\n"; } 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; } else { delete $groups->{$ngname}; # 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. } }); @{$self->{groupnames}} = sort(keys %$groups); # this will destroy old groups that got deleted $self->{pi_cfg} = $pi_cfg; } sub idler_start { $_[0]->{idler} //= PublicInbox::InboxIdle->new($_[0]->{pi_cfg}); } 1;