#!/usr/bin/perl -w # Copyright (C) 2015 all contributors # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) use strict; use warnings; require PublicInbox::Daemon; require PublicInbox::NewsGroup; require PublicInbox::NNTP; require PublicInbox::Config; my $nntpd = PublicInbox::NNTPD->new; daemon_run('0.0.0.0:119', sub { $nntpd->refresh_groups }, sub ($) { PublicInbox::NNTP->new($_[0], $nntpd) }); 1; package PublicInbox::NNTPD; use strict; use warnings; sub new { my ($class) = @_; bless { groups => {}, err => \*STDERR, out => \*STDOUT, grouplist => [], }, $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"}; if (defined $ngname) { next if ($ngname eq ''); # disabled $g = $ngname; } my $ng = PublicInbox::NewsGroup->new($g, $git_dir, $addr); 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 works if ($ng->mm(1)) { $new->{$g} = $ng; push @list, $ng; } } @list = sort { $a->{name} cmp $b->{name} } @list; $self->{grouplist} = \@list; # this will destroy old groups that got deleted %{$self->{groups}} = %$new; } 1;