1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
|
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Cyrus NNTP — Cyrus IMAP 3.10.2 documentation</title>
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/graphviz.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/cyrus.css" type="text/css" />
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/sphinx_highlight.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="next" title="Cyrus Prot Layer" href="protlayer.html" />
<link rel="prev" title="Cyrus Backups" href="backups.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home">
Cyrus IMAP
</a>
<div class="version">
3.10.2
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Cyrus IMAP</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../download.html">Download</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../quickstart.html">Quickstart Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../overview.html">Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../setup.html">Setup</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../../operations.html">Operations</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../manpages/index.html">Man pages</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../admin.html">Administrator Guide</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../admin.html#architecture">Architecture</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="../admin.html#management">Management</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="locations.html">File & Directory Locations</a></li>
<li class="toctree-l4"><a class="reference internal" href="ports-sockets.html">Ports and Sockets</a></li>
<li class="toctree-l4"><a class="reference internal" href="access-control.html">Access Control</a></li>
<li class="toctree-l4"><a class="reference internal" href="quotas.html">Quotas</a></li>
<li class="toctree-l4"><a class="reference internal" href="sieve.html">Cyrus Sieve</a></li>
<li class="toctree-l4"><a class="reference internal" href="backups.html">Cyrus Backups</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">Cyrus NNTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="protlayer.html">Cyrus Prot Layer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sop.html">Standard Operating Procedures</a></li>
<li class="toctree-l4"><a class="reference internal" href="eventsource.html">Cyrus Event Source</a></li>
<li class="toctree-l4"><a class="reference internal" href="monitoring.html">Monitoring</a></li>
<li class="toctree-l4"><a class="reference internal" href="config-mailboxdistribution.html">Mailbox Distribution</a></li>
<li class="toctree-l4"><a class="reference internal" href="murder/murder.html">Cyrus Murder</a></li>
<li class="toctree-l4"><a class="reference internal" href="nginx-proxy.html">HOWTO: Using an NGINX IMAP Proxy</a></li>
<li class="toctree-l4"><a class="reference internal" href="tweaking.html">Tweaking Cyrus IMAP</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../faq.html">Frequently Asked Questions</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../developers.html">Developers</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../support.html">Support/Community</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Cyrus SASL</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org/sasl">Cyrus SASL</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">Cyrus IMAP</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../../../operations.html">Operations</a></li>
<li class="breadcrumb-item"><a href="../admin.html">Administrator Guide</a></li>
<li class="breadcrumb-item active">Cyrus NNTP</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/cyrusimap/cyrus-imapd/blob/master/docsrc/imap/reference/admin/nntp.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="cyrus-nntp">
<span id="id1"></span><h1>Cyrus NNTP<a class="headerlink" href="#cyrus-nntp" title="Permalink to this heading"></a></h1>
<section id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading"></a></h2>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The NNTP support in Cyrus is still relatively young in the grand scheme of things, and has not been tested under a heavy Usenet load. That being said, the code appears to be stable and is currently running in production serving 50-60 newsgroups with a volume of about 6000 messages per day.</p>
</div>
<p>Cyrus includes a NNTP server. The NNTP works a lot like the IMAP server, it uses the same authentication and authorization. It also stores messages like IMAP. This means the messages are stored in one file per post.</p>
<p>Cyrus has the ability to export Usenet via IMAP and/or export shared IMAP mailboxes via NNTP.</p>
<p>This <a class="reference download internal" download="" href="../../../_downloads/f801c38f1857536dd11df837f858aaee/netnews.png"><code class="xref download docutils literal notranslate"><span class="pre">diagram</span></code></a> shows how the various NNTP components interact.</p>
</section>
<section id="nntp-setup">
<h2>NNTP Setup<a class="headerlink" href="#nntp-setup" title="Permalink to this heading"></a></h2>
<p>Decide where the newsgroup mailboxes will reside: either at the toplevel of the hierarchy (eg, comp.mail.imap) or rooted elsewhere (eg, netnews.comp.mail.imap). If the newsgroup mailboxes are not at the toplevel of the hierarchy, then the parent must be specified using <strong>newsprefix</strong> in <a class="reference internal" href="../manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a>.</p>
<ol class="arabic">
<li><p>Make sure that Cyrus is built with NNTP support using the <code class="docutils literal notranslate"><span class="pre">--enable-nntp</span></code> switch. This builds nntpd and the associated utilities.</p>
<blockquote>
<div><p>In many pre-packaged versions of Cyrus, the NNTP server is in its own package (Example: Debian has a cyrus-nntpd-2.2 package that must be installed in addition to the rest of Cyrus).</p>
</div></blockquote>
</li>
<li><p>Edit <code class="docutils literal notranslate"><span class="pre">/etc/cyrus.conf</span></code>.</p>
<blockquote>
<div><p>In order to receive usenet articles, make sure that the Cyrus nntpd service is enabled in cyrus.conf. The master/conf/normal.conf and master/conf/prefork.conf sample configs both include entries for nntpd (disabled by default).</p>
<p>Add a new line in the SERVICES section with something like this:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">nntp</span><span class="p">:</span> <span class="n">cmd</span><span class="o">=</span><span class="s2">"nntpd"</span> <span class="n">listen</span><span class="o">=</span><span class="s2">"nntp"</span> <span class="n">prefork</span><span class="o">=</span><span class="s2">"0"</span>
</pre></div>
</div>
<p>This defines a new service that will run the nntpd command (man nntpd for more info) on the nntp port (defined in /etc/services). Since the prefork is listed as 0, Cyrus will not start a new process for this.</p>
</div></blockquote>
</li>
<li><p>Edit <code class="docutils literal notranslate"><span class="pre">/etc/imapd.conf</span></code>.</p>
<blockquote>
<div><p>There are many directives for news that can be placed in /etc/imapd.conf. Check out <a class="reference internal" href="../manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a> to learn more.</p>
<p>At minimum, something like this:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># News:</span>
<span class="n">partition</span><span class="o">-</span><span class="n">news</span><span class="p">:</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">spool</span><span class="o">/</span><span class="n">cyrus</span><span class="o">/</span><span class="n">news</span>
<span class="n">newsprefix</span><span class="p">:</span> <span class="n">ournews</span>
</pre></div>
</div>
<p>This tells Cyrus:</p>
<ul class="simple">
<li><p>Where the news partition should be stored (should be similar to the value in <strong>partition-default</strong>)</p></li>
<li><p>What part of the Cyrus tree should be treated as the location for news groups.</p></li>
</ul>
<p>The <strong>newsprefix</strong> is a path in the IMAP directory hierarchy (that is, the hierarchy used with cyradm). User accounts, for instance, are often in the <code class="docutils literal notranslate"><span class="pre">users</span></code> hierarchy. Here, we are telling it to put the news in the <code class="docutils literal notranslate"><span class="pre">ournews</span></code> hierarchy.</p>
</div></blockquote>
</li>
<li><p>Restart your server.</p></li>
</ol>
</section>
<section id="defining-newsgroups">
<h2>Defining Newsgroups<a class="headerlink" href="#defining-newsgroups" title="Permalink to this heading"></a></h2>
<p>Create a mailbox for each newsgroup to receive/export. If some groups are private, be sure to set the ACLs accordingly. The <a class="reference internal" href="../manpages/systemcommands/mknewsgroups.html#std-cyrusman-mknewsgroups-8">mknewsgroups(8)</a> script can be used to help facilitate mass creation of newsgroup mailboxes. When using this script, be sure to add posting rights for 'anyone' (eg. <code class="docutils literal notranslate"><span class="pre">mknewsgroups</span> <span class="pre">-a</span> <span class="pre">'anyone</span> <span class="pre">+p'</span> <span class="pre">...</span></code>) so that articles can be fed/posted.</p>
<p>News groups can be defined in two ways:</p>
<ol class="arabic simple">
<li><p>Use <a class="reference internal" href="../manpages/systemcommands/mknewsgroups.html#std-cyrusman-mknewsgroups-8">mknewsgroups(8)</a>, which is a very simple wrapper for creating groups</p></li>
<li><p>Use <a class="reference internal" href="../manpages/systemcommands/cyradm.html#std-cyrusman-cyradm-8">cyradm(8)</a>, and create a new mailbox for news.</p></li>
</ol>
<p>Some distributions such as debian do not include mknewsgroups.</p>
<section id="using-cyradm">
<h3>Using Cyradm<a class="headerlink" href="#using-cyradm" title="Permalink to this heading"></a></h3>
<p>Create a new group like creating a new mailbox:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cm ournews/mynewsgroup
</pre></div>
</div>
<p>Next, set some permissions. (See <a class="reference internal" href="../manpages/systemcommands/cyradm.html#std-cyrusman-cyradm-8">cyradm(8)</a> for more info on the cm and sam commands.)</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sam ournews/mynewsgroup anyone lrsp
</pre></div>
</div>
<p>The above gives <strong>L</strong> Lookup, <strong>R</strong> Read, <strong>S</strong> Seen, and <strong>P</strong> Post permissions (basically read/write -- see the man page for more) to anyone logged into the server. More restrictive permissions are possible. (Note: This example assumes <em>unixhierarchysep</em> is being used in <a class="reference internal" href="../manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a>)</p>
</section>
</section>
<section id="configuration">
<h2>Configuration<a class="headerlink" href="#configuration" title="Permalink to this heading"></a></h2>
<section id="push-traditional-feeds">
<h3>Push (traditional) feeds<a class="headerlink" href="#push-traditional-feeds" title="Permalink to this heading"></a></h3>
<p>If the usenet peer will be pushing articles to the server, no further configuration is necessary, beyond providing peer access to the Cyrus server on port 119 (nntp).</p>
</section>
<section id="pull-suck-feeds">
<h3>Pull (suck) feeds<a class="headerlink" href="#pull-suck-feeds" title="Permalink to this heading"></a></h3>
<p>If pulling articles from the peer is preferred (and the provider allows it), then use the <code class="docutils literal notranslate"><span class="pre">fetchnews</span></code> utility which will retrieve articles from the peer and feed them to the Cyrus server. If supported by the peer, fetchnews will use the NEWNEWS command, otherwise it will fallback to keeping track of the high water mark of each group. Configure fetchnews as an EVENT in <a class="reference internal" href="../manpages/configs/cyrus.conf.html#std-cyrusman-cyrus.conf-5">cyrus.conf(5)</a> to be called periodically (eg, once an hour, every 15 minutes, etc).</p>
</section>
<section id="imapfeed">
<h3>imapfeed<a class="headerlink" href="#imapfeed" title="Permalink to this heading"></a></h3>
<p>Alternatively, if there is an INN v2.3 server in-house use the included <code class="docutils literal notranslate"><span class="pre">imapfeed</span></code> utility (written by the authors of Cyrus) to feed articles to the Cyrus server via LMTP. Consult the INN documentation for further details.</p>
</section>
<section id="control-messages">
<h3>Control Messages<a class="headerlink" href="#control-messages" title="Permalink to this heading"></a></h3>
<p>Control messages are accepted, parsed and delivered to the corresponding <code class="docutils literal notranslate"><span class="pre">control.*</span></code> pseudo-group (eg, control.newgroup, control.cancel, etc) if it exists, so that they may be reviewed by an administrator.</p>
<p>Automatic execution of control messages is only performed if the newsmaster (default = "news") user has the proper access control for the given mailbox. For example, to allow cancel control messages to be performed for <code class="docutils literal notranslate"><span class="pre">misc.test</span></code> articles, give the "news" user the 'd' right on "misc.test". To allow newgroup, rmgroup and mvgroup control messages to be performed on the "misc" hierarchy, give the "news" user the 'c' right on "misc".</p>
<p>NOTE: No sender or PGP verification of control messages is currently implemented.</p>
</section>
<section id="reading-posting-articles">
<h3>Reading/Posting articles<a class="headerlink" href="#reading-posting-articles" title="Permalink to this heading"></a></h3>
<p>In order to have articles posted by your local users propagate to the outside world, you must specify the name of your usenet peer(s) with the newspeer option in <a class="reference internal" href="../manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a>. This is the host(s) that nntpd contacts to feed outgoing articles. Depending on the configuration of the newspeer option, articles will be fed to the upstream server(s) using either the POST or IHAVE command. Also note that you may specify an optional wildmat to filter which groups will be fed (see <a class="reference internal" href="../manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a> for details).</p>
<p>Newsgroups can also be gatewayed to email by setting <code class="docutils literal notranslate"><span class="pre">/vendor/cmu/cyrus-imapd/news2mail</span></code> mailbox <a class="reference internal" href="../faqs/o-annotations.html#faqs-o-annotations"><span class="std std-ref">annotations</span></a> to the corresponding email addresses.</p>
</section>
<section id="news-clients">
<h3>News clients<a class="headerlink" href="#news-clients" title="Permalink to this heading"></a></h3>
<p>If anonymous logins are disabled (default) in <a class="reference internal" href="../manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a>, then your news clients will have to be configured to login with a username and password, otherwise they will not be allowed to post. Furthermore, if plaintext logins are disabled in imapd.conf, then you might have to configure your news clients to use SSL/TLS and enable the nntps service in <a class="reference internal" href="../manpages/configs/cyrus.conf.html#std-cyrusman-cyrus.conf-5">cyrus.conf(5)</a>.</p>
<p>If you want to allow your news clients to use the NNTP NEWNEWS command, you will have to enable the <strong>allownewnews</strong> option in imapd.conf.</p>
</section>
<section id="email-clients">
<h3>Email clients<a class="headerlink" href="#email-clients" title="Permalink to this heading"></a></h3>
<p>If you are exporting Usenet via IMAP, and your users' messaging clients are not savvy enough to reply to and post articles via NNTP, then you will have to configure your server so your users can reply to and post articles via SMTP.</p>
<p>To help facilitate this, you can set the <strong>newspostuser</strong> option to a pseudo user which will be used to construct email delivery addresses for each incoming article. These addresses are inserted into a Reply-To: in the article. For example, if set to "post", an article posted to comp.mail.imap will have an address of "post+comp.mail.imap" inserted into the Reply-To: header. This will allow a user to easily reply to an article via email. Otherwise, the users will have to learn the correct email address format for posting and replying to articles.</p>
<p>In order for these email messages to be fed into your news server (and subsequently to the outside world) you need to use an email to news gateway, such as lmtp2nntp. You need to configure your MTA (Sendmail, Postfix, etc) so that lmtp2nntp is used as the local mailer whenever it receives a news article. A simple rule for doing this in Sendmail is shown below:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span># mail addressed to post+ goes to lmtp2nntp@localhost
LOCAL_RULE_0
Rpost + $+ < @ $=w . > $#lmtp2nntp $@ localhost $: $1
</pre></div>
</div>
<p>For other configurations, consult the lmtp2nntp and documentation and your MTA documentation.</p>
<p>NOTE: If anonymous logins are disabled (default) in <a class="reference internal" href="../manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a>, then you should configure lmtp2nntp to use its "feed" operation mode.</p>
</section>
<section id="expiring-articles">
<h3>Expiring articles<a class="headerlink" href="#expiring-articles" title="Permalink to this heading"></a></h3>
<p>Expiration of articles is done by the <a class="reference internal" href="../manpages/systemcommands/cyr_expire.html#std-cyrusman-cyr_expire-8">cyr_expire(8)</a> utility. Control over when articles are expunged is accomplished with the <code class="docutils literal notranslate"><span class="pre">/vendor/cmu/cyrus-imapd/expire</span></code> mailbox <a class="reference internal" href="../faqs/o-annotations.html#faqs-o-annotations"><span class="std std-ref">annotation</span></a>. This annotation sets the number of days that messages should be kept in the mailbox before they expire. All entries in the duplicate deliver database that correspond to these messages are also kept for the same number of days before they are purged (overriding the <code class="docutils literal notranslate"><span class="pre">cyr_expire</span> <span class="pre">-E</span></code> option).</p>
<p>Setting the expire time to 0 (zero) for a mailbox will ensure that neither the messages nor the corresponding database entries will ever be expired. This can be useful for shared mailboxes (e.g. mailing list archives) which are being exported via NNTP. Note that this will cause the duplicate delivery database to consistently grow in proportion to the number of messages in such mailboxes.</p>
<p>If a mailbox does not have an expire time set on it, then the messages will never be expunged, but the corresponding database entries WILL be expired after the default number of days (<code class="docutils literal notranslate"><span class="pre">cyr_expire</span> <span class="pre">-E</span></code> option).</p>
<p>Note that the <code class="docutils literal notranslate"><span class="pre">/vendor/cmu/cyrus-imapd/expire</span></code> mailbox <a class="reference internal" href="../faqs/o-annotations.html#faqs-o-annotations"><span class="std std-ref">annotation</span></a> is inherited by child mailboxes, so that you may control expiration on an entire mailbox/newsgroup hierarchy simply by setting the annotation on the root of the hierarchy. For example, if you set the annotation on <code class="docutils literal notranslate"><span class="pre">comp</span></code>, then ALL of the newsgroups in the <code class="docutils literal notranslate"><span class="pre">comp</span></code> hierarchy will be expired at the same time. Similarly, if you set the annotation on <code class="docutils literal notranslate"><span class="pre">alt.binaries</span></code>, all of the binary newsgroups under <code class="docutils literal notranslate"><span class="pre">alt</span></code> will be expired at the same time (independently from <code class="docutils literal notranslate"><span class="pre">comp</span></code>).</p>
</section>
</section>
<section id="further-information">
<h2>Further information<a class="headerlink" href="#further-information" title="Permalink to this heading"></a></h2>
<p>This thread from the info-cyrus <a class="reference internal" href="../../support/feedback-mailing-lists.html#feedback-mailing-lists"><span class="std std-ref">mailing list</span></a> may be of use: <a class="reference external" href="http://www.mail-archive.com/info-cyrus%40lists.andrew.cmu.edu/msg22725.html">Cyrus and Usenet</a></p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="backups.html" class="btn btn-neutral float-left" title="Cyrus Backups" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="protlayer.html" class="btn btn-neutral float-right" title="Cyrus Prot Layer" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>© Copyright 1993–2025, The Cyrus Team.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
|