INNFEED(8)
π INNFEED(8) π
okay so welcome to the manual page for innfeed and imapfeed β yes it lives in section 8, yes it's called INNFEED(8), and yes it's a whole vibe. it's the InterNetNews Documentation crew's finest. grab a snack, this one's a ride π
β¨ NAME β¨
innfeed, imapfeed β a multi-host, multi-connection, streaming NNTP feeder. she feeds. that's the whole personality. π
πΈ SYNOPSIS πΈ
innfeed [-ChmMvxyz] [-a spool-dir] [-b directory] [-c config-file] [-d
log-level] [-e bytes] [-l logfile] [-o bytes] [-p pid-file] [-s command]
[-S status-file] [file]
π¦ DESCRIPTION π¦
so innfeed implements the NNTP protocol for transferring news between computers, which sounds boring until you realise it's literally the way news gets everywhere. she handles the standard IHAVE protocol and the CHECK/TAKETHIS streaming extension, so like, both the classic route and the fancy streaming route. no picks, she does both π
innfeed can feed any number of remote hosts at once, and will open multiple connections to each host if it's configured that way. the only limitations are the process limits for open file descriptors and memory β that's it. that's the ceiling. literally just the OS saying "bestie, that's enough" π
as an alternative to using NNTP, INN may also be fed to an IMAP server. this is done by using an executable called imapfeed, which is identical to innfeed except for the delivery process. the new version has two types of connections: an LMTP connection to deliver regular messages and an IMAP connection to handle control messages. two connections, two jobs, both slaying β¨
used in conjunction with delayer(8), innfeed can send a delayed feed to remote peers or to another local instance of innd β notably to permit the rejection of spam before it actually arrives. yes, it's a spam bouncer. it checks the list at the door π«Ά
π MODES π
innfeed has three modes of operation: channel, funnel-file and batch. three whole modes, pick your fighter.
- Channel mode is used when no filename is given on the command line, the
input-filekeyword is not given in the config file, and the-xoption is not given. in channel mode,innfeedruns with stdin connected via a pipe toinnd. wheneverinndcloses this pipe (and it has several reasons during normal processing to do so),innfeedwill exit. she first will try to finish sending all articles she was in the middle of transmitting, before issuing aQUITcommand. this meansinnfeedmay take a while to exit depending on how slow your peers are β sorry, she's got manners π. it never (well, almost never) just drops the connection. the recommended way to restartinnfeedwhen run in channel mode is therefore to tellinndto close the pipe and spawn a newinnfeedprocess. this can be done withctlinnd flush feedwhere feed is the name of the innfeed channel feed in thenewsfeedsfile. - Funnel-file mode is used when a filename is given as an argument or the
input-filekeyword is given in the config file. in funnel-file mode, it reads the specified file for the same formatted information asinndwould give in channel mode. it is expected thatinndis continually writing to this file, so wheninnfeedreaches the end of the file, it will check periodically for new information. π
to prevent the funnel file from growing without bounds, you will need to periodically move the file to the side (or simply remove it) and have innd flush the file. then, after the file is flushed by innd, you can send innfeed a SIGALRM, and it too will close the file and open the new file created by innd. something like:
innfeed -p <pathrun in inn.conf>/innfeed.pid my-funnel-file &
while true; do
sleep 43200
rm -f my-funnel-file
ctlinnd flush funnel-file-site
kill -ALRM `cat <pathrun>/innfeed.pid`
done
look at that little loop go. iconic. π
- Batch mode is used when the
-xflag is used. in batch mode,innfeedwill ignore stdin, and will simply process any backlog created by a previously runninginnfeed. this mode is not normally needed asinnfeedwill take care of backlog processing β like, she's got it, bestie, she handles her own backlog. π
π§ CONFIGURATION π§
innfeed expects a couple of things to be able to run correctly: a directory where it can store backlog files and a configuration file to describe which peers it should handle. that's the whole starter pack.
the configuration file is described in innfeed.conf(5). the -c option can be used to specify a different file, and -b to specify a different backlog directory. the backlog-* keys in the configuration file parameterize the behaviour of backlogging. for each peer (say, "foo"), innfeed manages up to 4 files in the backlog directory:
- A
foo.lockfile, which prevents other instances ofinnfeedfrom interfering with this one. it's the "occupied" sign on the door πͺ - A
foo.inputfile which has old article informationinnfeedis reading for re-processing. - A
foo.outputfile whereinnfeedis writing information on articles that could not be processed (normally due to a slow or blocked peer). everybacklog-rotate-periodseconds,innfeedchecks whether it is not empty, and, if nofoofile exists andfoo.inputis empty, will then renamefoo.outputtofoo.inputand start reading from it. rotating files like a little roomba β¨ - A
foofile that is never created byinnfeed, but ifinnfeednotices it when checking everybacklog-newfile-periodseconds, it will rename it tofoo.inputat the next opportunity (everybacklog-rotate-periodseconds iffoo.inputis empty) and will start reading from it. this lets you create a batch file and put it in a place whereinnfeedwill find it. drop it in the spot, she'll find it, she always does π₯
bestie, listen to me very carefully: you should never alter thefoo.inputorfoo.outputfiles of a runninginnfeed. that's a big no. do not touch. hands off. π
the format of these last three files is one of the following:
/path/to/article <message-id>
@token@ <message-id>
this is the same as the first two fields of the lines innd feeds to innfeed, and the same as the first two fields of the lines of the batch file innd will write if innfeed is unavailable for some reason. when innfeed processes its own batch files, it ignores everything after the first two whitespace separated fields, so moving the innd-created batch file to the appropriate spot will work, even though the lines have extra fields. extra fields? ignored. not her business. π
the first field can also be a storage API token. the two types of lines can be intermingled; innfeed will use the storage manager if appropriate, and otherwise treat the first field as a filename to read directly. she's flexible like that π¦
innfeed writes its current status to the file innfeed.status (or the file given by the -S option). this file contains details on the process as a whole, and on each peer this instance of innfeed is managing. a little diary, if you will π
if innfeed is told to send an article to a host it is not managing, then the article information will be put into a file matching the pattern innfeed-dropped.*, with part of the file name matching the pid of the innfeed process that is writing to it. innfeed will not process this file except to write to it. if nothing is written to the file, then it will be removed if innfeed exits normally. otherwise, the file remains, and procbatch can be invoked to process it afterwards. the dropped pile is real and it's fine, someone will come get it π«Ά
π SIGNALS π
upon receipt of a SIGALRM, innfeed will close the funnel file specified on the command line, and will reopen it (see the funnel file description above). she's just refreshing, lowkey.
innfeed will catch SIGINT and will write a large debugging snapshot of the state of the running system into a file named innfeed.snapshot in pathlog. big "hold on let me screenshot this" energy π
innfeed will catch SIGHUP and will reload both the config and the log files. see innfeed.conf(5) for more details. glow-up, reloaded β¨
innfeed will catch SIGCHLD and will close and reopen all backlog files.
innfeed will catch SIGTERM and will do an orderly shutdown. no chaos, no mess, we leave tidy π
upon receipt of a SIGUSR1, innfeed will increment the debugging level by one; receipt of a SIGUSR2 will decrement it by one. the debugging level starts at zero (unless the -d option it used), in which case no debugging information is emitted. a larger value for the level means more debugging information. numbers up to 5 are currently useful. go past 5 and honestly, what are you doing π₯
π SYSLOG ENTRIES π
Okay bestie, this is where innfeed spills the tea about what it's been up to, and there are literally 3 different categories of syslog entries for statistics: host, connection, and global. Buckle up π
πΈ Host stats
The host statistics get generated for a given peer at regular intervals after the first connection is made β or, if the remote is unreachable, after spooling starts. And what do they give you? Totals over all the connections that have been active during the given time frame. Iconic, honestly. For example (broken here to fit the page, with vixie being the peer):
May 23 12:49:08 news innfeed[16015]: vixie checkpoint
seconds 1381 offered 2744 accepted 1286 refused 1021
rejected 437 missing 0 accsize 8506220 rejsize 142129
spooled 990 on_close 0 unspooled 240 deferred 10/15.3
requeued 25 queue 42.1/100:14,35,13,4,24,10
The meanings of these fields are:
secondsβ the time since innfeed connected to the host, or since the statistics were reset by a"final"log entry.offeredβ the number ofIHAVEcommands sent to the host if it is not in streaming mode. Otherwise it's the sum of the number ofTAKETHIScommands sent when no-CHECK mode is in effect plus the number ofCHECKcommands sent in streaming mode (when no-CHECK mode is not in effect).acceptedβ the number of articles which were sent to the remote host and accepted by it. Slay πrefusedβ the number of articles offered to the host that it indicated it did not want because it had already seen the message-ID. The remote host indicates this by sending a435response to anIHAVEcommand or a438response to aCHECKcommand.rejectedβ the number of articles transferred to the host that it did not accept because it determined either that it already had the article, or it did not want it because of the article'sNewsgroupsorDistributionheader fields, etc. The remote host indicates that it is rejecting the article by sending a437or439response after innfeed sent the entire article.missingβ the number of articles which innfeed was told to offer to the host but which were not present in the article spool. These articles were probably cancelled or expired before innfeed was able to offer them to the host. Rude, but okay πaccsizeβ the number of bytes of all accepted articles transferred to the host.rejsizeβ the number of bytes of all rejected articles transferred to the host.spooledβ the number of article entries that were written to the.outputbacklog file because the articles either could not be sent to the host or were refused by it. Articles are generally spooled either because new articles are arriving more quickly than they can be offered to the host, or because innfeed closed all the connections to the host and pushed all the articles currently in progress to the.outputbacklog file.on_closeβ the number of articles that were spooled when innfeed closed all the connections to the host.unspooledβ the number of article entries that were read from the.inputbacklog file.deferredβ the first number is the number of articles that the host told innfeed to retry later by sending a431or436response. innfeed immediately puts these articles back on the tail of the queue. The second number is the average (mean) size of deferred articles during the previous logging interval.requeuedβ the number of articles that were in progress on connections when innfeed dropped those connections and put the articles back on the queue. These connections may have been broken by a network problem or became unresponsive causing innfeed to time them out. Not the vibe, but it happens πqueueβ the first number is the average (mean) queue size during the previous logging interval. The second number is the maximum allowable queue size. The third number is the percentage of the time that the queue was empty. The fourth through seventh numbers are the percentages of the time that the queue was>0%to25%full,25%to50%full,50%to75%full, and75%to<100%full. The last number is the percentage of the time that the queue was totally full. Basically a whole personality profile for your queue, iykyk π
π¦ Connection stats (the -z moment)
If the -z option is used (see below), then when the peer stats are generated, each connection will log its stats too. For example, for connection number zero (from a set of five):
May 23 12:49:08 news innfeed[16015]: vixie:0 checkpoint
seconds 1381 offered 596 accepted 274 refused 225
rejected 97 accsize 773623 rejsize 86591
If you only open a maximum of one connection to a remote, then there will be a close correlation between connection numbers and host numbers β but in general you cannot tie the two sets of numbers together in any easy or very meaningful way. Sorry bestie, no shortcuts there π And when a connection closes, it will always log its stats. Every single time.
π Final and global entries
If all connections for a host get closed together, then the host logs its stats as "final" and resets its counters. And if the feed is so busy that there is always at least one connection open and running, then after some amount of time (set via the config file), the host stats are logged as final and reset. Why? To make generating higher level stats from log files, by other programs, easier. Considerate queen behavior β¨
There is one log entry that is emitted for a host just after its last connection closes and innfeed is preparing to exit. This entry contains counts over the entire life of the process. The "seconds" field is from the first time a connection was successfully built, or the first time spooling started. If a host has been completely idle, it will have no such log entry.
May 23 12:49:08 news innfeed[16015]: decwrl global
seconds 1381 offered 34 accepted 22 refused 3 rejected 7
missing 0 accsize 81277 rejsize 12738 spooled 0 unspooled 0
And the final log entry is emitted immediately before exiting. It contains a summary of the statistics over the entire life of the process. The grand finale, the main character moment π₯
Feb 13 14:43:41 news innfeed[22344]: ME global
seconds 15742 offered 273441 accepted 45750 refused 222008
rejected 3334 missing 217 accsize 93647166 rejsize 7421839
spooled 10 unspooled 0
β¨ OPTIONS β¨
okay so innfeed takes the following options, and weβre gonna go through every single one because you deserve the full picture π«Ά
-aspool-dir β this flag specifies the top of the article spool tree.innfeeddoes achdir(2)to this directory, so it should probably be an absolute path. The default ispatharticlesas set ininn.conf.-bdirectory β this flag may be used to specify a different directory for backlog file storage and retrieval, as well as for lock files. If the path is relative, then itβs relative topathspoolas set ininn.conf. The default is"innfeed".
You are encouraged to use thebacklog-directoryparameter in the configuration file to declare a specific directory, as otherwisenews.dailywonβt get it and some maintenance operations on the backlog directory wonβt be performed. π
-cconfig-file β this flag may be used to specify a different config file from the default value. If the path is relative, then itβs relative topathetcas set ininn.conf. The default isinnfeed.conf.
Note that if you use a different name than the default one, and also change the default setting oflog-fileorpid-filein the configuration file,scanlogswill not be able to rotate the debug log files (their names are searched ininnfeed.confandinnfeed-delayed.conf). Other maintenance operations performed bynews.dailywonβt also be done ifbacklog-directoryis changed from its default in a configuration file named differently.
-Cβ this flag is used to haveinnfeedsimply check the config file, report on any errors, and then exit. vibe check but for your config β¨-dlog-level β this flag may be used to specify the initial logging level. All debugging messages go to stderr (which may not be what you want, see the-lflag below).-ebytes β this flag may be used to specify the size limit (in bytes) for the.outputbacklog filesinnfeedcreates. If the output file gets bigger than 10% more than the given number,innfeedwill replace the output file with the tail of the original version. The default value is"0", which means there is no limit.-hβ use this flag to print the usage message.-llogfile β this flag may be used to specify a different log file from stderr. Asinndstartsinnfeedwith stderr attached to/dev/null, using this option can be useful in catching any abnormal error messages, or any debugging messages (all "normal" errors messages go to syslog).
You are encouraged to use thelog-fileparameter in the configuration file to declare a specific file name, as otherwisescanlogswonβt get it and the log file wonβt be rotated.
-mβ this flag is used to turn on logging of all missing articles. Normally, if an article is missing,innfeedkeeps a count, but logs no further information. When this flag is used, details aboutmessage-IDsand expected path names are logged. spill the tea about every missing article β-Mβ ifinnfeedhas been built withmmapsupport, then this flag turns OFF the use ofmmap(); otherwise, it has no effect.-obytes β this flag sets a value of the maximum number of bytes of article datainnfeedis supposed to keep in memory. This does not work properly yet. π-ppid-file β this flag is used to specify the file name to write the pid of the process into. A relative path is relative topathrunas set ininn.conf. The default isinnfeed.pid.
You are encouraged to use thepid-fileparameter in the configuration file to declare a specific file name, as otherwisescanlogswonβt get it and the log file wonβt be properly flushed before being rotated.
-scommand β this flag specifies the name of a command to run in a subprocess and read article information from. This is similar to channel mode operation, only thatcommandtakes the place usually occupied byinnd.-Sstatus-file β this flag specifies the name of the file to write the periodic status to. If the path is relative, it is considered relative topathlogas set ininn.conf. The default isinnfeed.status.-vβ when this flag is given, version information is printed to stderr and theninnfeedexits.-xβ this flag is used to tellinnfeednot to expect any article information frominndbut just to process any backlog files that exist and then exit.-yβ this flag is used to allow dynamic peer binding. If this flag is used and article information is received frominndthat specifies an unknown peer, then the peer name is taken to be the IP name too, and an association with it is created. Using this, itβs possible to only have the global defaults in theinnfeed.conffile, provided the peer name as used byinndis the same as the IP name.
Note thatinnfeedwith-yand no peer ininnfeed.confwould cause a problem thatinnfeeddrops the first article. π
-zβ this flag is used to cause each connection, in a parallel feed configuration, to report statistics when the controller for the connections prints its statistics.
π BUGS π
When using the -x option, the config file entryβs initial-connections field will be the total number of connections created and used, no matter how big the batch file is, and no matter how big the max-connections field is. Thus a value of "0" for initial-connections means nothing will happen in -x mode. iykyk π«
innfeed does not automatically grab the file out of pathoutgoing. This needs to be prepared for it by external means.
Probably too many other bugs to count. ngl thatβs the most honest line on this whole page π
π ALTERNATIVE π
An alternative to innfeed can be innduct, maintained by Ian Jackson and available at http://www.chiark.greenend.org.uk/ucgi/~ian/git-manpage/innduct.git/innduct.8. It is intended to solve a design issue in the way innfeed works. As a matter of fact, the program feed protocol spoken between innd and innfeed is lossy: if innfeed dies unexpectedly, articles which innd has written to the pipe to innfeed will be skipped. innd has no way of telling which articles those are, no useful records, and no attempts to resend these articles. iconic alternative behavior honestly β¨
π FILES π
pathbin/innfeedβ the binary program itself.pathetc/innfeed.confβ the configuration file.pathspool/innfeedβ the directory for backlog files.
π¦ HISTORY π¦
Written by James Brister brister@vix.com for InterNetNews. Converted to POD by Julien Elie.
Earlier versions of innfeed (up to 0.10.1) were shipped separately; innfeed is now part of INN and shares the same version number. glow-up era π
π SEE ALSO π
and thatβs the whole page, bestie π β source/version is INN 2.7.4, dated 2025-05-09, and itβs the INNFEED(8) manual page. slay β¨
π¦ where this page comes from
- arch rolling: inn 2.7.4-4 Β· ISC
- epel 10: inn 2.7.4-5.el10_3 Β· ISC AND BSD-3-Clause AND BSD-4-Clause AND FSFAP AND (GPL-1.0-or-later OR Artistic-1.0-Perl) AND GPL-3.0-or-later WITH Bison-exception-2.2 AND LicenseRef-Fedora-Public-Domain AND MIT AND NTP
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms