]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Protocolary updates for release 1.5.1 v1.5.1
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 6 Aug 2021 20:55:00 +0000 (15:55 -0500)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 6 Aug 2021 20:55:00 +0000 (15:55 -0500)
22 files changed:
.gitignore
Makefile.am
configure.ac
docs/_config.yml
docs/index.md
docs/installation.md
docs/intro-fort.md
docs/intro-rpki.md
docs/logging.md
docs/run.md
docs/usage.md
examples/tal/README.md
examples/tal/afrinic.tal
examples/tal/apnic.tal
examples/tal/lacnic.tal
examples/tal/ripe-ncc.tal [moved from examples/tal/ripe.tal with 100% similarity]
fort_setup.sh
man/fort.8
src/Makefile.am
src/config.c
src/rtr/rtr.c
test/Makefile.am

index dd5dd6a71ee632966cf54e41b74acf7231434e22..584ce7fb541a07e453db56ae0baf8691e89d6432 100644 (file)
@@ -97,6 +97,7 @@ test-driver
 *~
 tmp
 docs/_site
+docs/.jekyll-metadata
 
 # Files we're sorta contractually obligated to exclude.
 # Can't include ARIN's TAL because of their Relying Party Agreement
index f467fe140fdc3b7ccb0ddf95c189cb5e7669f36f..457aa7cb5e440d87f04578657c17d538de87f729 100644 (file)
@@ -19,6 +19,6 @@ EXTRA_DIST += src/asn1/asn1c/LICENSE
 EXTRA_DIST += examples/tal/afrinic.tal
 EXTRA_DIST += examples/tal/apnic.tal
 EXTRA_DIST += examples/tal/lacnic.tal
-EXTRA_DIST += examples/tal/ripe.tal
+EXTRA_DIST += examples/tal/ripe-ncc.tal
 EXTRA_DIST += examples/config.json
 EXTRA_DIST += examples/demo.slurm
index 31f92167910a59a42f15ef202934c05c9fda75f0..3850f5467b28c3257ba5229f81a93552a25dbf37 100644 (file)
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.69])
-AC_INIT([fort], [1.5.0], [fort-validator@nic.mx])
+AC_INIT([fort], [1.5.1], [fort-validator@nic.mx])
 AC_CONFIG_SRCDIR([src/main.c])
 AM_INIT_AUTOMAKE([subdir-objects])
 
index f1f3948fb0c7c18e5eac2f0d4ac7a691b05b5177..0730e67c68803358e52bd0af8e4409a23e4b95b8 100644 (file)
@@ -8,7 +8,7 @@ defaults:
       layout: "default"
       image: "/img/logo_validador_og.png"
 
-fort-latest-version: 1.5.0
+fort-latest-version: 1.5.1
 plugins:
   - jekyll-seo-tag
   - jekyll-sitemap
index 5c143f24933415b827f57b9ae26c25e5b027f901..0b2507e3a6c38604869e8b1bff3e8854002f25ef 100644 (file)
@@ -11,7 +11,7 @@ FORT validator is an MIT-licensed RPKI Relying Party, this is a tool offered as
 
 ## Status
 
-> Due to a temporary resource shortage, the project's development has slowed down to essential maintenance. No new features are expected to be developed during the first half of 2021 (at least), but bugfixing and support will remain active.
+> Due to a temporary resource shortage, the project's development has slowed down to essential maintenance. No new features are expected to be developed during 2021 (at least), but bugfixing and support will remain active.
 
 Version **{{ site.fort-latest-version }}** is the latest official release. To fetch or review it, visit the [GitHub release](https://github.com/NICMx/FORT-validator/releases/tag/v{{ site.fort-latest-version }}){:target="_blank"}.
 
index 6de323d907738bfad2ed5f2ffef7bd19d06a43ce..9fe761220de9a2664501f5b9605b9a3dcd8c3119 100644 (file)
@@ -30,7 +30,7 @@ description: Guide to compile and install FORT Validator.
 
 ## Dependencies
 
-> Note: This section is included in case you intend to install Fort in an unlisted OS (and therefore need a little research). For: Debians, OpenBSD, RHEL/CentOS, Fedora, openSUSE Leap, FreeBSD, and Slackware just follow the steps in the sections below.
+> Note: This section is included in case you intend to install Fort in an unlisted OS (and therefore need a little research). For Debians, OpenBSD, RHEL/CentOS, Fedora, openSUSE Leap, FreeBSD, and Slackware just follow the steps in the sections below.
 
 The dependencies are
 
@@ -40,7 +40,7 @@ The dependencies are
 4. [libcurl](https://curl.haxx.se/libcurl/)
 5. [libxml2](http://www.xmlsoft.org/)
 
-Fort is currently supported in *64-bit* OS. A 32-bit OS may face the [Year 2038 problem](https://en.wikipedia.org/wiki/Year_2038_problem) when handling dates at certificates, and currently there's no work around for this.
+Fort currently supports *64-bit* Operating Systems. A 32-bit OS may face the [Year 2038 problem](https://en.wikipedia.org/wiki/Year_2038_problem) when handling certificate dates, and there's no workaround for this at the moment.
 
 ## Option 1: Installing the package
 
@@ -470,4 +470,4 @@ Preferably, run this script with the same user what will run FORT validator. It'
 wget https://raw.githubusercontent.com/NICMx/FORT-validator/v{{ site.fort-latest-version }}/fort_setup.sh
 mkdir ~/tal
 ./fort_setup.sh ~/tal
-{% endhighlight %}
\ No newline at end of file
+{% endhighlight %}
index 31b626bede8404709572ea23c10ae98ca1eaf98f..aed6a3e5a65abe0d4a260a2a001801db009e8a8c 100644 (file)
@@ -7,13 +7,13 @@ description: FORT Validator is a command line application intended for UNIX oper
 
 ## Design
 
-Fort is an MIT-licensed RPKI Relying Party. It is a service that performs the validation of the entire RPKI repository, and which serves the resulting ROAs for easy access by your routers.
+Fort is an MIT-licensed RPKI Relying Party. It is a service that downloads the RPKI repositories, validates their entirety and serves the resulting ROAs for easy access by your routers.
 
 ![img/design.svg](img/design.svg)
 
-The Validator is a timer that resynchronizes its [local cache](usage.html#--local-repository), validates the resulting [RPKI trees](intro-rpki.html) and stores the resulting ROAs in memory every [certain amount of time](usage.html#--serverintervalvalidation). The RTR [Server](usage.html#--serveraddress) (which is part of the same binary) delivers these ROAs to any requesting routers.
+The Validator is a timer that, [every once in a while](usage.html#--serverintervalvalidation), resynchronizes its [local cache of the RPKI Repository](usage.html#--local-repository), validates the resulting [certificate chains](intro-rpki.html) and stores the resulting valid ROAs in memory. The RTR [Server](usage.html#--serveraddress) (which is part of the same binary) delivers these ROAs to any requesting routers.
 
-Fort is a command line application intended for UNIX operating systems, written in C. (It requires a compiler that supports `-std=gnu11`.)
+Fort is a command-line application intended for UNIX operating systems, written in C. (It requires a compiler that supports `-std=gnu11`.)
 
 ## Standards Compliance 
 
@@ -49,4 +49,4 @@ The specific validations have been implemented, while the basic ones have not.
 
 - Reach 100% RFC compliance
 - Trigger revalidation and SLURM reload on SIGHUP.
-- Configurable origin address for outgoing requests.
\ No newline at end of file
+- Configurable origin address for outgoing requests.
index 428b74788d750b831b027a676ce45a7edb31e908..4f11707f91adc7eef46f4eaa310668ed2d013a01 100644 (file)
@@ -17,9 +17,9 @@ Basically, the idea is that one should be able to verify the origin of a route b
 
 ![img/chain.svg](img/chain.svg)
 
-The end result is a _Route Origin Attestation_ (ROA), a digitally signed object that provides a means of verifying that an IP address block holder has authorized an Autonomous System (AS) to originate routes to its address block or one of its children's.
+The end result is a _Route Origin Attestation_ (ROA), a digitally signed object that serves as a trustworthy attestation that an IP address block holder has authorized an Autonomous System (AS) to originate routes to its address block (or some of its children).
 
-So the whole infrastructure functions like a tree-shaped trust network (one for each RIR) in which authorities (_Certificate Authority_--CA) attest to their resource suballocations:
+So we end up with a tree-shaped trust network (one for each RIR) in which lots of authorities (_Certificate Authority_--CA) attest to their resource suballocations:
 
 ![img/tree.svg](img/tree.svg)
 
index bac5d34b63f10bdd78381588109952ebd06cfaee..50c6ccc8b65bb5d2a7320c0f103560584b954938 100644 (file)
@@ -23,8 +23,8 @@ url-vlog-tag: "[`--validation-log.tag`](usage.html#--validation-logtag)"
 ## Index
 
 1. [Log types](#log-types)
-       1. [Operation](#operation)
-       2. [Validation](#validation)
+       1. [Operation Log](#operation-log)
+       2. [Validation Log](#validation-log)
 2. [Configuration](#configuration)
        1. [Enabled](#enabled)
        2. [Output](#output)
@@ -36,37 +36,38 @@ url-vlog-tag: "[`--validation-log.tag`](usage.html#--validation-logtag)"
 
 ## Log types
 
-Currently there are two kinds of log messages: those related to the operation, and the ones regarding RPKI objects validation.
+Fort has two different types of log messages: Operation logs and Validation logs.
 
-Each type is described above, as well as how it can be configured.
+They will be described below.
 
-### Operation
+### Operation Log
 
-These type of messages are the ones where the user/operator can be directly involved. Probably these messages are of greater interest to most of the RP operators.
+Operation logs are of likely interest to the operator running Fort; Issues reported here require human intervention. These include
 
-The following messages are included at the operation logs:
-- Configuration information, warnings and errors. E.g. if the location set at [`--tal`](usage.html#--tal) can't be accessed, or a configuration echo at the beginning.
-- RTR information, warnings and errors; such as server binding status, and client connections (accepted, closed or terminated).
-- SLURM information, warnings and errors. E.g. bad SLURM syntax, or SLURM data being applied in case of an error with a newer SLURM file.
-- Out of memory errors.
-- Read/write errors on local files.
-- Persistent communication errors with RPKI repositories (see [`--stale-repository-period`](usage.html#--stale-repository-period)).
-- Start and end of a validation cycle, including: number of valid Prefixes and Router Keys, current RTR serial number (only when [`--mode=server`](usage.html#--mode)), and real execution time.
-- Programming errors (of course, those that could be expected due to an API misuse).
+| Type | INFO example | WARNING example| ERROR example |
+|------|--------------|----------------|---------------|
+| Configuration logs | "And now I'm going to echo my configuration, in case you want to review it." | "This configuration argument is deprecated." | "Bad file syntax." |
+| RTR Server logs | "Accepted connection from client." | "Huh? Peer is not speaking the RTR protocol." | "Cannot bind to address." |
+| Out of memory errors | - | - | "Out of memory." |
+| Read/write errors on local files | - | "The SLURM directory seems to lack SLURM files." | "I don't have permissions to access the repository cache." |
+| Persistent communication errors with RPKI repositories (see [`--stale-repository-period`](usage.html#--stale-repository-period)) | - | - | "Error requesting URL." | 
+| Start and end of a validation cycle | "Validation cycle ended. I got _R_ ROAs, _K_ router keys, my new serial is _S_, and it took _T_ seconds." | - | - |
+| Programming errors | - | - | "Array size is 1, but array is NULL." |
 
-### Validation
+### Validation Log
 
-These type of messages are the ones related to one of the main tasks performed by FORT validator: the RPKI validation. So, they are useful to know the current RPKI state.
+These are messages generated during the RPKI validation cycle, and refer specifically to quirks found in the RPKI objects. (ie. Certificates, CRLs, ROAs, etc.)
 
-All this messages are result of RPKI objects (certificates, CRLs, ROAs, etc.) processing, so probably the operator can't take a direct action trying to solve an error logged here, but it can get to know if something is wrong at the data published at the RPKI repositories.
+These are likely more meaningful to repository administrators, for the sake of reviewing their objects.
 
-Here are some examples of messages included at the validation logs:
-- Validation failures causing an RPKI object rejection (e.g. expired certificate).
-- Suspicious validation outcome, but the RPKI object isn't rejected (e.g. serial numbers duplicated).
-- An [incidence](incidence.html).
-- RRDP file information, warnings and errors.
+They are [disabled by default](usage.html#--validation-logenabled).
 
-> ![img/warn.svg](img/warn.svg) These messages are disabled by default, in order to enable them set [`--validation-log.enabled=true`](usage.html#--validation-logenabled).
+| Type | WARNING example| ERROR example |
+|------|-----------------|---------------|
+| Validation eventualities | "Maximum retries reached; skipping object." | "Certificate is expired." |
+| [Incidences](incidence.html) | "Manifest is stale." | "Manifest is stale." |
+
+(Most informational validation messages have DEBUG priority. Incidence severity is configurable.)
 
 ## Configuration
 
@@ -87,52 +88,49 @@ The following sub-sections describe how each argument works.
 
 ### Enabled
 
-Enables the corresponding log. If disabled (e.g. `--log.enabled=false`) none of the corresponding messages will be logged.
+Sets whether the corresponding log type is printed or suppressed. When `false`, the rest of the corresponding log type's arguments are ignored.
 
-The arguments of each log type are:
 - {{ page.url-log-enabled }}
 - {{ page.url-vlog-enabled }}
 
 ### Output
 
-During the brief period in which configuration has not been completely parsed yet (and therefore, the validator is not yet aware of the desired log output), the standard streams and syslog are used simultaneously.
+Either `syslog` or `console`. The former sends the output to the environment's [syslog](https://en.wikipedia.org/wiki/Syslog) server (using the configured [`*.facility`](#facility)), while the latter employs the standard streams. (DEBUG and INFO are sent to standard output, WARNING and ERROR to standard error.)
 
-Once the configuration has been loaded, all the log messages will be printed at the configured `*.output`, which can have two values:
-- `syslog`: all logging is sent to syslog, using the configured [`*.facility`](#facility).
-- `console`: informational and debug messages are printed in standard output, error and critical messages are thrown to standard error.
+> During the brief period in which configuration has not been completely parsed yet (and therefore, the validator is not yet aware of the desired log output), the standard streams and syslog are used simultaneously.
 
-> Syslog configuration and usage is out of this docs scope, here's a brief introduction from [Wikipedia](https://en.wikipedia.org/wiki/Syslog). You can do some research according to your preferred OS distro to familiarize with syslog, since distinct implementations exists (the most common are: syslog, rsyslog, and syslog-ng).
-
-The arguments of each log type are:
 - {{ page.url-log-output }}
 - {{ page.url-vlog-output }}
 
 ### Level
 
-The `*.level` argument defines which messages will be logged according to its priority. Any log message of equal or higher importance to the one configured, will be logged, e.g. a value of `info` will log messages of equal or higher level (`info`, `warning`, and `error`).
+Only messages of equal or higher priority than `*.level` will be logged. For example, `--log.level=warning` will discard DEBUG and INFO operation messages, and log WARNING and ERROR.
 
-The validator uses exactly five levels of priority (they're just some of all the syslog priority levels), but only four of them can be utilized in the configured [`*.output`](#output). These are their meanings and priority from highest to lowest:
-- `crit`: Programming errors. (These lead to program termination.)
-       - **This level can't be indicated at `level`**, since `error` and `crit` messages are relevant for an adequate operation.
-- `error`: A failure that can stop an internal task (e.g. a certificate has expired so the childs are discarded) or is definitely an operational problem (e.g. no more memory can be allocated).
+The available values are
+
+- `error`: A failure that can stop an internal task (e.g. a certificate has expired so the childs are discarded) or is definitely an operational problem (e.g. no more memory can be allocated). Also detected programming errors.
 - `warning`: Something suspicious, but not a stopper for a task.
-- `info`: Information deemed useful to the user.
-- `debug`: Information deemed useful to the developer. Expect a lot of messages when utilized.
+- `info`: Inoffensive messages that might be of interest to the administrator.
+- `debug`: Information deemed useful to the developer.
+
+Variants:
 
-The arguments of each log type are:
 - {{ page.url-log-level }}
 - {{ page.url-vlog-level }}
 
 ### Color output
 
-The flag `*.color-output` is only meaningful when [`*.output`](#output) is `console` (it doesn't affect to `syslog`). When the flag is enabled, the log messages will have the following colors according to its priority:
-- `crit`: <span style="color:magenta">CYAN</span>
-- `error`: <span style="color:red">RED</span>
+Causes the output to contain ASCII color codes. Meant for human consumption. Only applies when [output](#output) is `console`.
+
+Each color depends on the message's priority:
+
+- `error`: <span style="color:red">RED</span> (Critical errors are <span style="color:magenta">CYAN</span>)
 - `warning`: <span style="color:orange">ORANGE</span>
 - `info`: <span style="color:lightgray">LIGHT GRAY</span>
 - `debug`: <span style="color:cyan">CYAN</span>
 
-These are some examples of how the logs could be displayed when the flag is enabled:
+Examples:
+
 <pre><code class="terminal">$ {{ page.command }} --log.color-output --validation-log.color-output (...)
 <span style="color:cyan">DBG: Manifest '62gPOPXWxxu0sQa4vQZYUBLaMbY.mft' {</span>
 <span style="color:lightgray">INF: Configuration {</span>
@@ -177,19 +175,14 @@ The arguments of each log type are:
 
 ### Facility
 
-Sets the syslog facility, so it's only meaningful when [`*.output`](#output) is `syslog`.
+Sets the syslog [facility](https://en.wikipedia.org/wiki/Syslog#Facility); only meaningful when [`*.output`](#output) is `syslog`.
 
-Currently the supported facilites are:
+The available facilites are
 
---|--|--|--|--|--
 auth | daemon | mail | uucp | local2 | local5
 authpriv | ftp | news | local0 | local3 | local6
 cron | lpr | user | local1 | local4 | local7
 
-
-You could read more about facilites [here](https://en.wikipedia.org/wiki/Syslog#Facility) (since it's out of this docs scope).
-
-The arguments of each log type are:
 - {{ page.url-log-facility }}
 - {{ page.url-vlog-facility }}
 
@@ -197,14 +190,15 @@ The arguments of each log type are:
 
 Text tag that will be added to each message of the corresponding log type. The tag will be added after the message level, inside square brackets.
 
-It's a simple mean to differentiate each message according to its type, probably useful if the [`*.output`](#output) is the same for both log types.
+It's a simple means to differentiate each message according to its type, useful if both log types are [enabled](#enabled), and are printing to the same [`*.output`](#output).
+
+Example:
 
-E.g. If a validation error is found, it could be logged like this:
 {% highlight bash %}
-$ {{ page.command }} --validation-log.tag="Validation" (...)
-ERR [Validation]: rsync://rpki.example.com/foo/bar/baz.cer: Certificate validation failed: certificate has expired
+$ {{ page.command }} --log.tag="!Operation!" --validation-log.tag="!Validation!" (...)
+ERR [!Operation!]: Invalid rsync.enabled: 'tr0ue', must be boolean (true|false)
+ERR [!Validation!]: rsync://rpki.example.com/foo/bar/baz.cer: Certificate validation failed: certificate has expired
 {% endhighlight %}
 
-The arguments of each log type are:
 - {{ page.url-log-tag }}
 - {{ page.url-vlog-tag }}
index df5e74d6299c6a7548d987ab35ae524779fea6d4..d19f77baa3a1cc32ae2a899ac6d861ebf2578681 100644 (file)
@@ -5,13 +5,13 @@ description: This is probably all you need, an RTR server will serve the ROAs re
 
 # {{ page.title }}
 
-First you'll need the TAL files. If you don't have them already, you can execute Fort validator using the argument [`--init-tals`](usage.html#--init-tals):
+First you'll need the Trust Anchor Locator (TAL) files. If you don't have them already, you can download them with [`--init-tals`](usage.html#--init-tals):
 
 {% highlight bash %}
-fort --init-tals --tal <path to store TAL files>
+fort --init-tals --tal <directory in which TALs will be stored>
 {% endhighlight %}
 
-Now, this is probably all you need, an RTR server will serve the ROAs resulting from a validation rooted at the trust anchors defined by the TALs contained at directory [`--tal`](usage.html#--tal):
+Then start the validator and RTR Server with
 
 {% highlight bash %}
 fort \
@@ -21,9 +21,9 @@ fort \
        --server.port <your intended RTR server port>
 {% endhighlight %}
 
-> ![img/warn.svg](img/warn.svg) In case the RTR server will be bound to a privileged port (eg. to default [`--server.port`](usage.html#--serverport)=323) and you don't want to run FORT validator as root, see [Non root port binding](#non-root-port-binding).
+> ![img/warn.svg](img/warn.svg) The RTR Server's default port (323) is privileged. Obviously, you don't want to use root, so either change the port (&ge; 1024), jail Fort, redirect the traffic by way of a NAT, or [grant Fort `CAP_NET_BIND_SERVICE`](#granting-the-cap_net_bind_service-capability-to-fort).
 
-This will run Fort validator as standalone (perform validation and exit) and print ROAs to CSV file:
+Alternatively, this will run Fort in [standalone mode](usage.html#--mode) (ie. single full RPKI validation then exit), while printing the ROAs to a CSV file:
 
 {% highlight bash %}
 fort \
@@ -33,7 +33,7 @@ fort \
        --local-repository <path where you want to keep your local cache>
 {% endhighlight %}
 
-This will run Fort validator using a [SLURM file](https://tools.ietf.org/html/rfc8416):
+Add [SLURM files](https://tools.ietf.org/html/rfc8416) using [`--slurm`](usage.html#--slurm) in either server or standalone modes:
 
 {% highlight bash %}
 fort \
@@ -44,64 +44,53 @@ fort \
        --server.port <your intended RTR server port>
 {% endhighlight %}
 
-These are some examples to run Fort with distinct configurations; see [Program Arguments](usage.html) for more details.
+See [Program Arguments](usage.html) for a more exhaustive option list.
 
-## Non root port binding
-
-By default, RTR server binds to port 323, which is a privileged port (ports lower than 1024 are restricted); so the most simple solutions are:
-- Set [`--server.port`](usage.html#--serverport) to an available port greater than 1024.
-- Leave the default server port and run FORT validator as root.
-
-In case you don't wish to use another port nor execute FORT validator as root, there are other alternatives, such as **capabilities**.
-
-The capability needed is `CAP_NET_BIND_SERVICE`, which allows to bind a socket to "Internet domain privileged ports" (port numbers less than 1024).
+## Granting the `CAP_NET_BIND_SERVICE` capability to Fort
 
 For Linux you need:
 - A recent kernel compiled with POSIX capabilities.
 - The `setcap` and `getcap` utilities.
 
-> **Warnings**:
-> - With the "capabilities" method, any nonprivileged user can run FORT on priviliged ports. You can restrict the execution of the FORT binary using credentials (`chmod`, `chown`).
-> - Everytime you compile the sources, you need to apply this patch for the new binary of FORT validator.
+> ![img/warn.svg](img/warn.svg)
+> 
+> - With the "capabilities" method, any nonprivileged user can run Fort on priviliged ports. You can restrict the execution of the Fort binary using credentials (`chmod`, `chown`).
+> - Every time you compile the sources, you need to apply this patch for the new binary of Fort.
 
 ### Steps
 
-As root, execute this command to add the capability to the installed FORT validator binary:
+As root, execute this command to add the capability to the installed Fort binary:
 
 {% highlight bash %}
 root# setcap cap_net_bind_service=+ep `which fort`
 {% endhighlight %}
 
-You can check if the capability was added by executing `getcap`, it should result in something like this:
+You can check if the capability was added by executing `getcap`:
 
 {% highlight bash %}
 root# getcap `which fort`
 /usr/local/bin/fort = cap_net_bind_service+ep
 {% endhighlight %}
 
-Now FORT validator can be bound to the default port (323) without being executed as root.
+Now Fort can be bound to a priviliged port without needing root.
 
-In case you want to remove the capability to the installed FORT binary, execute the next command (as root):
+If you want to remove the capability from the installed Fort binary, execute the following command (as root):
 
 {% highlight bash %}
 root# setcap cap_net_bind_service=-ep `which fort`
 {% endhighlight %}
 
-### Alternative method (LINUX or BSD)
-
-You can use another method (NAT or firewall) to redirect traffic from port 323 to any other port where FORTR service is bound as RTR server, but such methods are out of the scope of these documents.
-
 ## Tuning memory (Linux & glibc)
 
 > ![img/warn.svg](img/warn.svg) This quirk applies to glibc, you can check if your OS has it by running (from a command line): `$ ldd --version`
 
-FORT validator is currently a multithreaded program (it spawns a thread to validate each configured TAL), and there's a known behavior in GNU C Library (glibc) regarding multithreading and the memory usage growth. This is not precisely an issue nor something to be concerned about, unless the host machine has quite a limited memory (as of today, this isn't probably a common scenario). 
+Fort is currently a multithreaded program (it spawns a thread to validate each configured TAL), and there's a known behavior in GNU C Library (glibc) regarding multithreading and the memory usage growth. This is not precisely an issue nor something to be concerned about, unless the host machine has quite a limited memory (as of today, this isn't probably a common scenario). 
 
 When a new thread is spawned it has its own "arena" available to handle the memory allocations; so, when multiple threads are created, is likely to have the same amount of arenas. Every `malloc`'d and `free`'d block at each thread, will be done in a memory space (a.k.a "arena") reserved for the thread.
 
 Once a memory block is released using `free`, there's no warranty that such memory be returned to the OS, thus the program's memory usage isn't necessarily decreased (in this case, the "arena" size isn't decreased). See more about [glibc `free`](https://www.gnu.org/software/libc/manual/html_node/Freeing-after-Malloc.html).
 
-Most of FORT Validator allocations are temporary since they're needed at the validation cycles, this causes a logarithmic growth on the program memory usage. Only a part of that memory is really allocated, the other part consist of free space that hasn't been returned to the OS yet.
+Most of Fort's allocations are temporary since they're needed at the validation cycles, this causes a logarithmic growth on the program memory usage. Only a part of that memory is really allocated, the other part consist of free space that hasn't been returned to the OS yet.
 
 glibc has the _[Tunables](https://www.gnu.org/software/libc/manual/html_node/Tunables.html)_ feature. One of the things that can be tuned is precisely the maximum number of "arenas" that the program will use. There are many other things that can be tuned, but they are out of scope of this document.
 
@@ -111,6 +100,6 @@ The recommended value in order to avoid a high performance cost, is `MALLOC_AREN
 
 {% highlight bash %}
 export MALLOC_ARENA_MAX=2
-# Now run fort
+# Now run Fort
 fort --tal=/etc/tals ...
 {% endhighlight %}
index 232d6e7825123f964a2a8375db50a9cfca5d2521..6db5e2769c8da2208f245b67805e3fab55371282 100644 (file)
@@ -13,8 +13,9 @@ description: Guide to use arguments of FORT Validator.
        1. [`--help`](#--help)
        2. [`--usage`](#--usage)
        3. [`--version`](#--version)
-       4. [`--init-tals`](#--init-tals)
        5. [`--tal`](#--tal)
+       4. [`--init-tals`](#--init-tals)
+       4. [`--init-as0-tals`](#--init-as0-tals)
        6. [`--local-repository`](#--local-repository)
        7. [`--work-offline`](#--work-offline)
        8. [`--daemon`](#--daemon)
@@ -28,6 +29,7 @@ description: Guide to use arguments of FORT Validator.
        16. [`--server.interval.refresh`](#--serverintervalrefresh)
        17. [`--server.interval.retry`](#--serverintervalretry)
        18. [`--server.interval.expire`](#--serverintervalexpire)
+       18. [`--server.deltas.lifetime`](#--serverdeltaslifetime)
        19. [`--slurm`](#--slurm)
        20. [`--log.enabled`](#--logenabled)
        21. [`--log.level`](#--loglevel)
@@ -72,81 +74,83 @@ description: Guide to use arguments of FORT Validator.
        57. [`rsync.arguments-recursive`](#rsyncarguments-recursive)
        58. [`rsync.arguments-flat`](#rsyncarguments-flat)
        59. [`incidences`](#incidences)
-       60. [`init-locations`](#init-locations)
 3. [Deprecated arguments](#deprecated-arguments)
        1. [`--sync-strategy`](#--sync-strategy)
        2. [`--rrdp.enabled`](#--rrdpenabled)
        3. [`--rrdp.priority`](#--rrdppriority)
        4. [`--rrdp.retry.count`](#--rrdpretrycount)
        5. [`--rrdp.retry.interval`](#--rrdpretryinterval)
+       60. [`init-locations`](#init-locations)
 
 ## Syntax
 
 ```
 {{ page.command }}
-        [--help]
-        [--usage]
-        [--version]
-        [--init-tals]
-        [--configuration-file=<file>]
-        [--tal=<file>|<directory>]
-        [--local-repository=<directory>]
-        [--sync-strategy=off|strict|root|root-except-ta]
-        [--work-offline]
-        [--daemon]
-        [--shuffle-uris]
-        [--maximum-certificate-depth=<unsigned integer>]
-        [--asn1-decode-max-stack=<unsigned integer>]
-        [--stale-repository-period=<unsigned integer>]
-        [--mode=server|standalone]
-        [--server.address=<sequence of strings>]
-        [--server.port=<string>]
-        [--server.backlog=<unsigned integer>]
-        [--server.interval.validation=<unsigned integer>]
-        [--server.interval.refresh=<unsigned integer>]
-        [--server.interval.retry=<unsigned integer>]
-        [--server.interval.expire=<unsigned integer>]
-        [--slurm=<file>|<directory>]
-        [--log.enabled=true|false]
-        [--log.level=error|warning|info|debug]
-        [--log.output=syslog|console]
-        [--log.color-output]
-        [--log.file-name-format=global-url|local-path|file-name]
-        [--log.facility=auth|authpriv|cron|daemon|ftp|lpr|mail|news|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7]
-        [--log.tag=<string>]
-        [--validation-log.enabled=true|false]
-        [--validation-log.level=error|warning|info|debug]
-        [--validation-log.output=syslog|console]
-        [--validation-log.color-output]
-        [--validation-log.file-name-format=global-url|local-path|file-name]
-        [--validation-log.facility=auth|authpriv|cron|daemon|ftp|lpr|mail|news|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7]
-        [--validation-log.tag=<string>]
-        [--rrdp.enabled=true|false]
-        [--rrdp.priority=<unsigned integer>]
-        [--rrdp.retry.count=<unsigned integer>]
-        [--rrdp.retry.interval=<unsigned integer>]
-        [--rsync.enabled=true|false]
-        [--rsync.priority=<unsigned integer>]
-        [--rsync.strategy=strict|root|root-except-ta]
-        [--rsync.retry.count=<unsigned integer>]
-        [--rsync.retry.interval=<unsigned integer>]
-        [--http.enabled=true|false]
-        [--http.priority=<unsigned integer>]
-        [--http.retry.count=<unsigned integer>]
-        [--http.retry.interval=<unsigned integer>]
-        [--http.user-agent=<string>]
-        [--http.connect-timeout=<unsigned integer>]
-        [--http.transfer-timeout=<unsigned integer>]
-        [--http.idle-timeout=<unsigned integer>]
-        [--http.ca-path=<directory>]
-        [--output.roa=<file>]
-        [--output.bgpsec=<file>]
-        [--output.format=csv|json]
-        [--thread-pool.server.max=<unsigned integer>]
-        [--thread-pool.validation.max=<unsigned integer>]
+       [--help]
+       [--usage]
+       [--version]
+       [--configuration-file=<file>]
+       [--tal=<file>|<directory>]
+       [--local-repository=<directory>]
+       [--sync-strategy=off|root|root-except-ta]
+       [--shuffle-uris=true|false]
+       [--maximum-certificate-depth=<unsigned integer>]
+       [--slurm=<file>|<directory>]
+       [--mode=server|standalone]
+       [--work-offline=true|false]
+       [--daemon=true|false]
+       [--server.address=<sequence of strings>]
+       [--server.port=<string>]
+       [--server.backlog=<unsigned integer>]
+       [--server.interval.validation=<unsigned integer>]
+       [--server.interval.refresh=<unsigned integer>]
+       [--server.interval.retry=<unsigned integer>]
+       [--server.interval.expire=<unsigned integer>]
+       [--server.deltas.lifetime=<unsigned integer>]
+       [--rsync.enabled=true|false]
+       [--rsync.priority=<32-bit unsigned integer>]
+       [--rsync.strategy=root|root-except-ta]
+       [--rsync.retry.count=<unsigned integer>]
+       [--rsync.retry.interval=<unsigned integer>]
+       [--rrdp.enabled=true|false]
+       [--rrdp.priority=<32-bit unsigned integer>]
+       [--rrdp.retry.count=<unsigned integer>]
+       [--rrdp.retry.interval=<unsigned integer>]
+       [--http.enabled=true|false]
+       [--http.priority=<32-bit unsigned integer>]
+       [--http.retry.count=<unsigned integer>]
+       [--http.retry.interval=<unsigned integer>]
+       [--http.user-agent=<string>]
+       [--http.connect-timeout=<unsigned integer>]
+       [--http.transfer-timeout=<unsigned integer>]
+       [--http.idle-timeout=<unsigned integer>]
+       [--http.ca-path=<directory>]
+       [--log.enabled=true|false]
+       [--log.output=syslog|console]
+       [--log.level=error|warning|info|debug]
+       [--log.tag=<string>]
+       [--log.facility=auth|authpriv|cron|daemon|ftp|lpr|mail|news|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7]
+       [--log.file-name-format=global-url|local-path|file-name]
+       [--log.color-output=true|false]
+       [--validation-log.enabled=true|false]
+       [--validation-log.output=syslog|console]
+       [--validation-log.level=error|warning|info|debug]
+       [--validation-log.tag=<string>]
+       [--validation-log.facility=auth|authpriv|cron|daemon|ftp|lpr|mail|news|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7]
+       [--validation-log.file-name-format=global-url|local-path|file-name]
+       [--validation-log.color-output=true|false]
+       [--output.roa=<file>]
+       [--output.bgpsec=<file>]
+       [--output.format=csv|json]
+       [--asn1-decode-max-stack=<unsigned integer>]
+       [--stale-repository-period=<unsigned integer>]
+       [--init-tals=true|false]
+       [--init-as0-tals=true|false]
+       [--thread-pool.server.max=<unsigned integer>]
+       [--thread-pool.validation.max=<unsigned integer>]
 ```
 
-If an argument is declared more than once, the last one takes precedence:
+If an argument is specified more than once, the last one takes precedence:
 
 {% highlight bash %}
 $ {{ page.command }} --tal="foo"                          # tal is "foo"
@@ -154,7 +158,6 @@ $ {{ page.command }} --tal="foo" --tal="bar"              # tal is "bar"
 $ {{ page.command }} --tal="foo" --tal="bar" --tal="qux"  # tal is "qux"
 {% endhighlight %}
 
-
 ## Arguments
 
 ### `--help`
@@ -162,24 +165,24 @@ $ {{ page.command }} --tal="foo" --tal="bar" --tal="qux"  # tal is "qux"
 - **Type:** None
 - **Availability:** `argv` only
 
-Prints medium-sized syntax remainder message.
+Prints a medium-sized description of the command-line syntax, then exits.
 
 {% highlight bash %}
 $ {{ page.command }} --help
 Usage: {{ page.command }}
-        [--help]
-            (Give this help list)
-        [--usage]
-            (Give a short usage message)
-        [--version]
-            (Print program version)
+       [--help]
+               (Give this help list)
+       [--usage]
+               (Give a short usage message)
+       [--version]
+               (Print program version)
        ...
-        [--log.file-name-format=global-url|local-path|file-name]
-            (File name variant to print during debug/error messages)
-        [--output.roa=<file>]
-            (File where ROAs will be stored in CSV format, use '-' to print at console.)
-        [--output.bgpsec=<file>]
-            (File where BGPsec Router Keys will be stored in CSV format, use '-' to print at console.)
+       [--init-as0-tals=true|false]
+               (Fetch the currently-known AS0 TAL files into --tal)
+       [--thread-pool.server.max=<unsigned integer>]
+               (Maximum number of active threads (one thread per RTR client) that can live at the thread pool)
+       [--thread-pool.validation.max=<unsigned integer>]
+               (Maximum number of active threads (one thread per TAL) that can live at the thread pool)
 {% endhighlight %}
 
 The slightly larger usage message is `man {{ page.command }}` and the large usage message is this documentation.
@@ -189,7 +192,7 @@ The slightly larger usage message is `man {{ page.command }}` and the large usag
 - **Type:** None
 - **Availability:** `argv` only
 
-Prints small-sized syntax remainder message.
+Prints a small-sized syntax reminder message, then exits.
 
 {% highlight bash %}
 $ {{ page.command }} --usage
@@ -208,30 +211,13 @@ Usage: {{ page.command }}
 - **Type:** None
 - **Availability:** `argv` only
 
-Prints program version.
+Prints the program's version, then exits.
 
 {% highlight bash %}
 $ {{ page.command }} --version
 fort {{ site.fort-latest-version }}
 {% endhighlight %}
 
-### `--init-tals`
-
-- **Type:** None
-- **Availability:** `argv` only
-
-Download the RIR TALs into the existent local path directory set at [`--tal`](#--tal) argument and exit.
-
-This argument exists merely to have all TALs before running FORT validator, the directory path should be set at the [`--tal`](#--tal) argument.
-
-By default, the 4 TALs that don't require a policy acceptance are downloaded from FORT validator's GitHub repository. ARIN TAL does require an explicit acceptance by the user, so it's downloaded only after the user accepts ARIN's RPA; this message is displayed at the terminal and only if the user accepts, ARIN TAL is also downloaded.
-
-This is an example on how to use this argument (assuming that `/etc/fort/tal` exists and is writable):
-
-{% highlight bash %}
-$ {{ page.command }} --init-tals --tal /etc/fort/tal
-{% endhighlight %}
-
 ### `--tal`
 
 - **Type:** String (Path to file or directory)
@@ -239,19 +225,24 @@ $ {{ page.command }} --init-tals --tal /etc/fort/tal
 
 Path to the _Trust Anchor Locator_ (TAL), or to a directory that contains TALs.
 
-A TAL is a file that points to a _Trust Anchor_ (TA). A TA is a self-signed certificate that serves as root of an RPKI tree you want validated.
+A TAL is a file that points to a _Trust Anchor_ (TA). A TA is an RPKI tree's root certificate.
 
-The reason why you provide locators instead of anchors is to allow the latter to be officially updated without the need to awkwardly redistribute them.
+The reason why you provide locators instead of anchors is to allow the latter to be officially updated without the need to awkwardly redistribute them. (TALs rarely need to change.)
 
-Whichever registry serves as root of the tree you want to validate is responsible for providing you with its TAL. For convenience, Fort currently ships with the TALs of four of the five RIRs. (The exception is ARIN's, since you need to read and accept an [agreement](https://www.arin.net/resources/manage/rpki/tal/) before you can use it.) If you installed the Debian package, they can be found at `/etc/fort/tal/`, otherwise it the `tal/` directory of whatever release tarball you downloaded.
+Registries which own TAs are responsible for providing you with their TALs. For convenience, you can use [`--init-tals`](#--init-tals) and [`--init-as0-tals`](#--init-as0-tals) to speed up and mostly automate this process. Alternatively, you can download the TALs manually. As of 2021-05-26, they can be found by following these links:
 
-If you are paranoid, however, you'd be advised to get your own TALs.
+- [AFRINIC](https://afrinic.net/resource-certification/tal)
+- [APNIC](https://www.apnic.net/community/security/resource-certification/tal-archive/)
+- [ARIN](https://www.arin.net/resources/manage/rpki/tal/)
+- [LACNIC](https://www.lacnic.net/4984/2/lacnic/rpki-rpki-trust-anchor)
+- [RIPE NCC](https://www.ripe.net/manage-ips-and-asns/resource-management/rpki/ripe-ncc-rpki-trust-anchor-structure)
 
 The TAL file format has been standardized in [RFC 8630](https://tools.ietf.org/html/rfc8630). It is a text file that contains zero or more comments (each comment must start with the character "#" and end with a line break), a list of URLs (which serve as alternate access methods for the TA), followed by a blank line, followed by the Base64-encoded public key of the TA.
 
 Just for completeness sake, here's an example on what a typical TAL looks like:
 
 ```
+https://rpki.example.com/repository/root-ca.cer
 rsync://rpki.example.com/repository/root-ca.cer
 
 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsqS+PDB1kArJlBTHeYCu
@@ -263,50 +254,100 @@ SMiU+kLHI3dJhv4nJpjc0F+8+6hokIbF0p79yaCgyk0IGz7W3oSPa13KLN6mIPs6
 LQIDAQAB
 ```
 
+### `--init-tals`
+
+- **Type:** None
+- **Availability:** `argv` only
+
+Downloads the currently known core TALs into the [`--tal`](#--tal) directory, then exits. It's a convenience option, meant for quick TAL retrieval, in case you don't have a more formal means to do it.
+
+ARIN's TAL requires that you accept their _Relying Party Agreement_ before the file can be downloaded. This is done through the standard streams.
+
+{% highlight bash %}
+$ {{ page.command }} --init-tals --tal /etc/fort/tal
+Jul 30 12:00:55 DBG: HTTP GET: https://rpki.afrinic.net/tal/afrinic.tal
+Successfully fetched '/etc/fort/tal/afrinic.tal'!
+
+Jul 30 12:00:57 DBG: HTTP GET: https://tal.apnic.net/apnic.tal
+Successfully fetched '/etc/fort/tal/apnic.tal'!
+
+Attention: ARIN requires you to agree to their Relying Party Agreement (RPA) before you can download and use their TAL.
+Please download and read https://www.arin.net/resources/manage/rpki/rpa.pdf
+If you agree to the terms, type 'yes' and hit Enter: yes
+Jul 30 12:01:04 DBG: HTTP GET: https://www.arin.net/resources/manage/rpki/arin.tal
+Successfully fetched '/etc/fort/tal/arin.tal'!
+
+Jul 30 12:01:05 DBG: HTTP GET: https://www.lacnic.net/innovaportal/file/4983/1/lacnic.tal
+Successfully fetched '/etc/fort/tal/lacnic.tal'!
+
+Jul 30 12:01:06 DBG: HTTP GET: https://tal.rpki.ripe.net/ripe-ncc.tal
+Successfully fetched '/etc/fort/tal/ripe-ncc.tal'!
+{% endhighlight %}
+
+This flag can be used in conjunction with `--init-as0-tals`.
+
+### `--init-as0-tals`
+
+- **Type:** None
+- **Availability:** `argv` only
+
+Download the currently known _AS0 Trust Anchor Locators_ (AS0 TALs) into the [`--tal`](#--tal) directory, then exit.
+
+Here's an example. The following command downloads the AS0 TALs into `/etc/fort/tal` (assuming it exists, and is a writable directory):
+
+```bash
+$ {{ page.command }} --init-as0-tals --tal /etc/fort/tal
+Jul 30 12:02:51 DBG: HTTP GET: https://tal.apnic.net/apnic-as0.tal
+Successfully fetched '/etc/fort/tal/apnic-as0.tal'!
+
+Jul 30 12:02:52 DBG: HTTP GET: https://www.lacnic.net/innovaportal/file/4983/1/lacnic-as0.tal
+Successfully fetched '/etc/fort/tal/lacnic-as0.tal'!
+```
+
+This flag can be used in conjunction with `--init-tals`.
+
 ### `--local-repository`
 
 - **Type:** String (Path to directory)
 - **Availability:** `argv` and JSON
 - **Default:** `/tmp/fort/repository`
 
-Path to the directory where Fort will store a local cache of the repository.
-
-Fort accesses RPKI repositories either with [rsync](https://en.wikipedia.org/wiki/Rsync) or [RRDP](https://tools.ietf.org/html/rfc8182). During each validation cycle, and depending on the preferred access methods defined by the CAs, Fort can do two things:
-- Literally invoke an `rsync` command (see [`rsync.program`](#rsyncprogram) and [`rsync.arguments-recursive`](#rsyncarguments-recursive)), which will download the files into `--local-repository`.
-- Fetch the RRDP Update Notification file (which implies an HTTP request) and fetch the files from there on (can be obtained from a Snapshot file or Delta files). The files will be downloaed into `--local-repository`.
+Path to the directory where Fort will store a local cache of the entire repository trees.
 
-Fort's entire validation process operates on the resulting copy of the files (doesn't matter if the files where fetched by rsync of https).
+This cache is updated (based on the trees pointed by the TALs) during every validation cycle, and Fort's entire validation process operates on it.
 
-Because rsync uses delta encoding, you're advised to keep this cache around. It significantly speeds up subsequent validation cycles.
+Assuming not much time has passed since the last time the repository was cached, updating the cache is most of the time much faster than downloading it from scratch. You're therefore encouraged to keep it around.
 
 ### `--work-offline`
 
-- **Type:** None
+- **Type:** Boolean (`true`, `false`)
 - **Availability:** `argv` and JSON
 
-If this flag is activated, Fort will disable all outgoing requests (currently done with: *rsync* and *https* (RRDP protocol uses HTTPS to fetch data)). All repository files (certificates, ROAs, etc.) are expected to exist at configured [`--local-repository`](#--local-repository).
+Skip the repository cache update?
+
+If `true`, Fort will disable all outgoing RRDP and RSYNC requests during the validation cycle. The validation results will be entirely based on the (possibly outdated) existing cache. ([`--local-repository`](#--local-repository))
 
-Otherwise, Fort will perform outgoing requests whenever this is needed. If a specific protocol needs to be deactivated, use [`--rsync.enabled`](#--rsyncenabled) or [`--http.enabled`](#--httpenabled).
+Mostly intended for debugging. See [`--rsync.enabled`](#--rsyncenabled) and [`--http.enabled`](#--httpenabled) if you want to disable a specific protocol.
 
 ### `--daemon`
 
-- **Type:** None
+- **Type:** Boolean (`true`, `false`)
 - **Availability:** `argv` and JSON
 
-If this flag is activated, Fort will run as a daemon. The process is detached from the calling terminal and sent to the background.
+Send process to the background?
 
-All the enabled logs will be sent to syslog, so the configured values of [`--log.output`](#--logoutput) and [`--validation-log.output`](#--validation-logoutput) will be ignored.
+All enabled logs will be sent to syslog; [`--log.output`](#--logoutput) and [`--validation-log.output`](#--validation-logoutput) will be ignored.
 
 ### `--shuffle-uris`
 
-- **Type:** None
+- **Type:** Boolean (`true`, `false`)
 - **Availability:** `argv` and JSON
 
-If enabled, Fort will access TAL URLs in random order. This is meant for load balancing. If disabled, Fort will access TAL URLs in sequential order.
+Access the URLs from the TALs in random order? (This is meant for load balancing.) Otherwise, Fort will try to access them in sequential order. (Which makes more sense when the URLs are ordered by priority.)
 
-Regardless of this flag, Fort will stop iterating through the URLs as soon as it finds one that yields a successful traversal.
+Fort only needs one TA for a successful traversal. As soon as one functioning URL is found, the others are ignored until the next validation cycle.
 
-Of course, this flag is only relevant if the TAL lists more than one URL. If that's the case, the shuffle is done honoring the priority of the protocols (see [`--rsync.priority`](#--rsyncpriority) and [`--http.priority`](#--httppriority)). i.e. if the HTTP protocol has a higher priority than RSYNC, then all the shuffled HTTP URLs will come first.
+> This sorting mechanism is secondary to the protocol sorting mechanism. URLs are first sorted according to their protocol's priorities ([`--rsync.priority`](#--rsyncpriority), [`--http.priority`](#--httppriority)), then according to `--shuffle-uris`.
 
 ### `--maximum-certificate-depth`
 
@@ -325,9 +366,9 @@ Fort's tree traversal is actually iterative (not recursive), so there should be
 - **Availability:** `argv` and JSON
 - **Default:** `server`
 
-Run mode, commands the way Fort executes the validation. The two possible values and its behavior are:
-- `server`: Enables the RTR server using the `server.*` arguments ([`server.address`](#--serveraddress), [`server.port`](#--serverport), [`server.backlog`](#--serverbacklog), [`server.interval.validation`](#--serverintervalvalidation), [`server.interval.refresh`](#--serverintervalrefresh), [`server.interval.retry`](#--serverintervalretry), [`server.interval.expire`](#--serverintervalexpire)).
-- `standalone`:  Disables the RTR server, the `server.*` arguments are ignored, and Fort performs an in-place standalone RPKI validation.
+In `server` mode, Fort runs endlessly, performing RPKI validation cycles [repeatedly](#--serverintervalvalidation). In parallel, it also starts an [RTR server](#--serveraddress) that will perpetually serve the validation results to upcoming RTR clients. (Which are usually routers.)
+
+In `standalone` mode, Fort simply performs one immediate RPKI validation, then exits. This mode is usually coupled with [`--output.roa`](#--outputroa).
 
 ### `--server.address`
 
@@ -335,16 +376,16 @@ Run mode, commands the way Fort executes the validation. The two possible values
 - **Availability:** `argv` and JSON
 - **Default:** `NULL`
 
-List of hostnames or numeric host addresses where the RTR server will be bound to. Must resolve to (or be) bindable IP addresses. IPv4 and IPv6 are supported.
+List of hostnames or numeric host addresses the RTR server will be bound to. Must resolve to (or be) bindable IP addresses. IPv4 and IPv6 are supported.
 
-The list of addresses must be comma sepparated, and each address must have the following format: `<address>[#<port>]`. Note that the port is optional; in case that a port isn't specified, the value of [`--server.port`](#--serverport) will be utilized with the corresponding address.
+The address list must be comma-separated, and each address must have the following format: `<address>[#<port>]`. The port defaults to [`--server.port`](#--serverport).
 
-Here are some examples of valid values for this argument:
-- `--server.address="localhost"`: will bind to 'localhost' and the configured port at [`--server.port`](#--serverport).
-- `--server.address="localhost,::1#8324"`: same as the previous example, and also will bind to IPv6 address '::1' at the port '8324'.
-- `--server.address="localhost#8323,::1#8324"`: will bind to 'localhost' at port '8323', and to '::1' port '8324'. The value of [`--server.port`](#--serverport) isn't utilized.
+Here are some examples:
+- `--server.address="localhost"`: Bind to 'localhost', port [`--server.port`](#--serverport).
+- `--server.address="localhost, ::1#8324"`: Same as above, and also bind to IPv6 address '::1', port '8324'.
+- `--server.address="localhost#8323, ::1#8324"`: Bind to 'localhost' at port '8323', and to '::1' port '8324'. [`--server.port`](#--serverport) is ignored.
 
-If this field is omitted, Fort will attempt to bind the server using the IP address `INADDR_ANY` (for an IPv4 address) or `IN6ADDR_ANY_INIT` (for an IPv6 address); see '`$ man getaddrinfo`'.
+If this field is omitted, the server will accept connections on any of the host's network addresses.
 
 ### `--server.port`
 
@@ -352,13 +393,11 @@ If this field is omitted, Fort will attempt to bind the server using the IP addr
 - **Availability:** `argv` and JSON
 - **Default:** `"323"`
 
-TCP port or service where the server address(es) will be bound to by default if no port is set (see [`--server.address`](#--serveraddress)).
+TCP port or service the server address(es) will be bound to, if [`--server.address`](#--serveraddress) doesn't override it.
 
-This is a string because a service alias can be used as a valid value. The available aliases are commonly located at `/etc/services`. (See '`$ man services`'.)
+This is a string because a service alias can be used as a valid value. The available aliases are commonly located at `/etc/services`. (See '`$ man services`'.)
 
-> ![img/warn.svg](img/warn.svg) The default port is privileged. To improve security, either change or jail it.
->
-> In case you don't wish to change the port, nor run FORT validator as root, see [Non root port binding](run.html#non-root-port-binding).
+> ![img/warn.svg](img/warn.svg) The default port is privileged. To improve security, either change or jail it. See [Non root port binding](run.html#non-root-port-binding).
 
 ### `--server.backlog`
 
@@ -380,11 +419,11 @@ See the corresponding manual page from your operating system (likely `man 2 list
 - **Default:** 3600
 - **Range:** 60--[`UINT_MAX`](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html)
 
-Number of seconds the server will sleep between validation cycles.
+Number of seconds Fort will sleep between validation cycles, when in [`server`](#--mode) mode.
 
 The timer starts counting every time a validation is finished, not every time it begins. The actual validation loop is, therefore, longer than this number.
 
-"Validation cycle" includes the rsync update along with the validation operation. Because you are taxing the global repositories every time the validator performs an rsync, it is recommended not to reduce the validation interval to the point you might be contributing to DoS'ing the global repository. The minimum value (60) was taken from the [RRDP RFC](https://tools.ietf.org/html/rfc8182#section-3.1), which means it's not necessarily a good value for heavy rsyncs.
+"Validation cycle" includes the rsync update along with the validation operation. Because you are taxing the global repositories every time the validator performs a cache synchronization, it is recommended not to reduce the validation interval to the point you might be contributing to DoS'ing the global repository. The minimum value (60) was taken from the [RRDP RFC](https://tools.ietf.org/html/rfc8182#section-3.1), which means it's not necessarily a good value for heavy rsyncs.
 
 ### `--server.interval.refresh`
 
@@ -393,11 +432,11 @@ The timer starts counting every time a validation is finished, not every time it
 - **Default:** 3600
 - **Range:** 1--86400
 
-Number of seconds that a router should wait before the next attempt to poll FORT using either a Serial Query PDU or Reset Query PDU.
+To synchronize their cache of RPKI prefix origin data and router keys, RTR clients (routers) poll Fort's RTR Server at regular intervals.
 
-Countdown for this timer starts upon receipt of an End Of Data PDU (this should be administered by the client).
+`--server.interval.refresh` is the length of that interval (in seconds), as _suggested_ by Fort, to the RTR clients. It is only employed if the peers manage to negociate usage of the RTRv1 protocol for the communication.
 
-This value is utilized only on RTR version 1 sessions (more information at [RFC 8210 section 6](https://tools.ietf.org/html/rfc8210#section-6)).
+See [RFC 8210, section 6](https://tools.ietf.org/html/rfc8210#section-6).
 
 ### `--server.interval.retry`
 
@@ -406,11 +445,11 @@ This value is utilized only on RTR version 1 sessions (more information at [RFC
 - **Default:** 600
 - **Range:** 1--7200
 
-Number of seconds that a router should wait before retrying a failed Serial Query PDU or Reset Query PDU.
+To synchronize their cache of RPKI prefix origin data and router keys, RTR clients (routers) poll Fort's RTR Server at regular intervals.
 
-Countdown for this timer starts upon failure of the query and restarts after each subsequent failure until a query succeeds (this should be administered by the client).
+`--server.interval.retry` is the number of seconds a router should wait before retrying a failed synchronization. It is _suggested_ to them by Fort, and only employed if the peers manage to negociate usage of the RTRv1 protocol for the communication.
 
-This value is utilized only on RTR version 1 sessions (more information at [RFC 8210 section 6](https://tools.ietf.org/html/rfc8210#section-6)).
+See [RFC 8210, section 6](https://tools.ietf.org/html/rfc8210#section-6).
 
 ### `--server.interval.expire`
 
@@ -419,11 +458,24 @@ This value is utilized only on RTR version 1 sessions (more information at [RFC
 - **Default:** 7200
 - **Range:** 600--172800
 
-Number of seconds that a router can retain the current version of data while unable to perform a successful subsequent query.
+To synchronize their cache of RPKI prefix origin data and router keys, RTR clients (routers) poll Fort's RTR Server at regular intervals.
+
+`--server.interval.expire` is the number of seconds a router should retain their data while unable to perform a successful synchronization with Fort. It is _suggested_ to them by Fort, and only employed if the peers manage to negociate usage of the RTRv1 protocol for the communication.
+
+See [RFC 8210, section 6](https://tools.ietf.org/html/rfc8210#section-6).
+
+### `--server.deltas.lifetime`
+
+- **Type:** Integer
+- **Availability:** `argv` and JSON
+- **Default:** 2
+- **Range:** 0--[`UINT_MAX`](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html)
+
+When routers first connect to Fort, they request a _snapshot_ of the validation results. (ROAs and Router Keys.) Because they need to keep their validated objects updated, and snapshots tend to be relatively large amounts of information, they request _deltas_ afterwards over configurable intervals. ("Deltas" being the differences between snapshots.)
 
-Countdown for this timer starts upon receipt of an End Of Data PDU (this should be administered by the client).
+During each validation cycle, Fort generates a new snapshot, as well as the deltas needed to build the new snapshot from the previous one. These are all stored in RAM. `--server.deltas.lifetime` is the number of iterations a set of deltas will be kept before being deallocated. (Recall that every iteration lasts [`--server.interval.validation`](#--serverintervalvalidation) seconds, plus however long the validation takes.)
 
-This value is utilized only on RTR version 1 sessions (more information at [RFC 8210 section 6](https://tools.ietf.org/html/rfc8210#section-6)).
+If a router lags behind, to the point Fort has already deleted the deltas it needs to update the router's snapshot, Fort will have to fall back to fetch the entire latest snapshot instead.
 
 ### `--slurm`
 
@@ -439,9 +491,9 @@ SLURM file, or directory containing SLURM files. See [SLURM](slurm.html).
 - **Availability:** `argv` and JSON
 - **Default:** `true`
 
-Enables the operation logs.
+Enable the operation logs?
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Enabled](logging.html#enabled).
+See [Logging](logging.html).
 
 ### `--log.level`
 
@@ -449,15 +501,11 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Enabled](
 - **Availability:** `argv` and JSON
 - **Default:** `warning`
 
-Defines which operation log messages will be logged according to its priority, e.g. a value of `info` will log messages of equal or higher level (`info`, `warning`, and `error`).
+Minimum allowed severity of operation log messages. (Lower severity messages will be dropped.) The highest priority is `error`, and the lowest is `debug`.
 
-The priority levels, from higher to lowest, are:
-- `error`
-- `warning`
-- `info`
-- `debug`
+For example, `--log.level=warning` will cause only `warning` and `error` messages to be logged.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Level](logging.html#level).
+See [Logging > Configuration > Level](logging.html#level).
 
 ### `--log.output`
 
@@ -465,11 +513,11 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Level](lo
 - **Availability:** `argv` and JSON
 - **Default:** `console`
 
-Desired output where the operation logs will be printed.
+Desired target that will take care of actually printing the operation logs.
 
-The value `console` will log messages at standard output and standard error; `syslog` will log to [Syslog](https://en.wikipedia.org/wiki/Syslog).
+`console` will log messages in the standard streams; `syslog` will log on [Syslog](https://en.wikipedia.org/wiki/Syslog).
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Output](logging.html#output).
+See [Logging > Configuration > Output](logging.html#output).
 
 ### `--log.color-output`
 
@@ -477,9 +525,9 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Output](l
 - **Availability:** `argv` and JSON
 - **Default:** `false`
 
-If enabled, the operation logs output will contain ANSI color codes. Meant for human consumption, and meaningful only if [`--log.output`](#--logoutput) is `console`.
+Include ANSI color codes in the logging? Meant to ease human consumption. Only applies when [`--log.output`](#--logoutput) is `console`.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Color output](logging.html#color-output).
+See [Logging > Configuration > Color output](logging.html#color-output).
 
 ### `--log.file-name-format`
 
@@ -489,7 +537,7 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Color out
 
 Decides which version of file names should be printed during most debug/error messages at the operation logs.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > File name format](logging.html#file-name-format).
+See [Logging > Configuration > File name format](logging.html#file-name-format).
 
 ### `--log.facility`
 
@@ -499,7 +547,7 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > File name
 
 Syslog facility utilized for operation logs (meaningful only if [`--log.output`](#--logoutput) is `syslog`).
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Facility](logging.html#facility).
+See [Logging > Configuration > Facility](logging.html#facility).
 
 ### `--log.tag`
 
@@ -507,9 +555,11 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Facility]
 - **Availability:** `argv` and JSON
 - **Default:** `NULL`
 
-Text tag that will be added to the operation log messages (it will appear inside square brackets).
+Prefix tag that will be added to all operation log messages. It's meant to help identify operation logs from other types of logs.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Tag](logging.html#tag).
+The tag will be surrounded by square brackets.
+
+See [Logging > Configuration > Tag](logging.html#tag).
 
 ### `--validation-log.enabled`
 
@@ -517,9 +567,9 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Tag](logg
 - **Availability:** `argv` and JSON
 - **Default:** `false`
 
-Enables the validation logs.
+Enable the validation logs?
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Enabled](logging.html#enabled).
+See [Logging](logging.html).
 
 ### `--validation-log.level`
 
@@ -527,15 +577,11 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Enabled](
 - **Availability:** `argv` and JSON
 - **Default:** `warning`
 
-Defines which validation log messages will be logged according to its priority, e.g. a value of `info` will log messages of equal or higher level (`info`, `warning`, and `error`).
+Minimum allowed severity of validation log messages. (Lower severity messages will be dropped.) The highest priority is `error`, and the lowest is `debug`.
 
-The priority levels, from higher to lowest, are:
-- `error`
-- `warning`
-- `info`
-- `debug`
+For example, `--validation-log.level=warning` will cause only warning and error messages to be logged.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Level](logging.html#level).
+See [Logging > Configuration > Level](logging.html#level).
 
 ### `--validation-log.output`
 
@@ -543,11 +589,11 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Level](lo
 - **Availability:** `argv` and JSON
 - **Default:** `console`
 
-Desired output where the validation logs will be printed.
+Desired target that will take care of actually printing the validation logs.
 
-The value `console` will log messages at standard output and standard error; `syslog` will log to [Syslog](https://en.wikipedia.org/wiki/Syslog).
+`console` will log messages in the standard streams; `syslog` will log on Syslog.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Output](logging.html#output).
+See [Logging > Configuration > Output](logging.html#output).
 
 ### `--validation-log.color-output`
 
@@ -555,9 +601,9 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Output](l
 - **Availability:** `argv` and JSON
 - **Default:** `false`
 
-If enabled, the validation logs output will contain ANSI color codes. Meant for human consumption, and meaningful only if [`--validation-log.output`](#--validation-logoutput) is `console`.
+Include ANSI color codes in the logging? Meant to ease human consumption. Only applies when `--validation-log.output` is `console`.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Color output](logging.html#color-output).
+See [Logging > Configuration > Color output](logging.html#color-output).
 
 ### `--validation-log.file-name-format`
 
@@ -565,9 +611,9 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Color out
 - **Availability:** `argv` and JSON
 - **Default:** `global-url`
 
-Decides which version of file names should be printed during most debug/error messages at the operation logs.
+Decides which version of file names should be printed during most debug/error messages at the validation logs.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > File name format](logging.html#file-name-format).
+See [Logging > Configuration > File name format](logging.html#file-name-format).
 
 ### `--validation-log.facility`
 
@@ -577,7 +623,7 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > File name
 
 Syslog facility utilized for validation logs (meaningful only if [`--validation-log.output`](#--validation-logoutput) is `syslog`).
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Facility](logging.html#facility).
+See [Logging > Configuration > Facility](logging.html#facility).
 
 ### `--validation-log.tag`
 
@@ -585,9 +631,11 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Facility]
 - **Availability:** `argv` and JSON
 - **Default:** `Validation`
 
-Text tag that will be added to the validation log messages (it will appear inside square brackets).
+Prefix tag that will be added to all operation log messages. It's meant to help identify operation logs from other types of logs.
 
-Read more at [Logging](logging.html) and at [Logging > Configuration > Tag](logging.html#tag).
+The tag will be surrounded by square brackets.
+
+See [Logging > Configuration > Tag](logging.html#tag).
 
 ### `--http.enabled`
 
@@ -595,9 +643,11 @@ Read more at [Logging](logging.html) and at [Logging > Configuration > Tag](logg
 - **Availability:** `argv` and JSON
 - **Default:** `true`
 
-Enables outgoing HTTP requests.
+Enable HTTP requests during validation?
+
+If disabled (`--http.enabled=false`), Fort will skip all outgoing HTTP requests during the validation cycle. The relevant validation results will be entirely based on the (possibly outdated) existing cache. ([`--local-repository`](#--local-repository))
 
-If disabled (eg. `--http.enabled=false`), FORT validator won't request HTTP URIs, and will expect to find all the corresponding repository files at [`--local-repository`](#--local-repository).
+Mostly intended for debugging.
 
 ### `--http.priority`
 
@@ -606,16 +656,11 @@ If disabled (eg. `--http.enabled=false`), FORT validator won't request HTTP URIs
 - **Default:** 60
 - **Range:** 0--100
 
-> ![img/warn.svg](img/warn.svg) By default, HTTPS requests are preferred over rsync requests.
-
-Assign priority to use HTTP to fetch repository files. A higher value means a higher priority.
+HTTP's (and therefore RRDP's) precedence when choosing the protocol used to download files (assuming Fort has to choose, and both protocols are [enabled](#--http.enabled)). The protocol with the highest priority is used first, and the runner-up is employed as fallback.
 
-This argument works along with [`--rsync.priority`](#--rsyncpriority), since the higher value of the two arguments will result in the first protocol to utilize when fetching repositories files. Of course, this depends also on certificates information or the TAL URIs, since currently HTTP URIs are optional and not every RIR repository makes use of them.
+> At the moment, only two protocols (RRDP/HTTP and RSYNC) are supported. Yes, `--http.priority`'s range is overkill.
 
-Whenever a certificate or a TAL has both RSYNC and HTTP URIs, the following criteria is followed to prioritize which one to use first:
-- [`--rsync.priority`](#--rsyncpriority) **equals** [`--http.priority`](#--httppriority): use the order specified at the certificate or the TAL to fetch the corresponding URI.
-- [`--rsync.priority`](#--rsyncpriority) **greater than** [`--http.priority`](#--httppriority): use RSYNC repository/TAL URI first; if there's an error fetching data, fallback to fetch HTTP repository/TAL URI.
-- [`--rsync.priority`](#--rsyncpriority) **less than** [`--http.priority`](#--httppriority): use HTTP repsitory/TAL URI first; if there's an error fetching data, fallback to use RSYNC repository/TAL URI.
+See [`--rsync.priority`](#--rsyncpriority).
 
 ### `--http.retry.count`
 
@@ -703,23 +748,15 @@ The value specified (either by the argument or the default value) is utilized in
 
 _**All requests are made using HTTPS, verifying the peer and the certificate name vs host**_
 
-Local path where the CA's utilized to verify the peers are located.
+Path to a directory containing CA certificates, which Fort might employ to verify peers while performing HTTPS requests.
 
 Useful when the CA from the peer isn't located at the default OS certificate bundle. If specified, the peer certificate will be verified using the CAs at the path. The directory MUST be prepared using the `rehash` utility from the SSL library:
+
 - OpenSSL command (with help): `$ openssl rehash -h`
 - LibreSSL command (with help): `$ openssl certhash -h`
 
 The value specified is utilized in libcurl's option [CURLOPT_CAPATH](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html).
 
-### `--http.disabled`
-
-- **Type:** None
-- **Availability:** `argv` and JSON
-
-If the flag is activated, HTTP requests won't be performed and the files that should have been fetched are searched locally at [`--local-repository`](#--local-repository).
-
-Otherwise, Fort will perform HTTP requests when needed (eg. an HTTPS URI at a TAL, RRDP URIs).
-
 ### `--output.roa`
 
 - **Type:** String (Path to file)
@@ -727,25 +764,26 @@ Otherwise, Fort will perform HTTP requests when needed (eg. an HTTPS URI at a TA
 
 > Note: The paragraphs below apply to [Fort 1.5.0](https://github.com/NICMx/FORT-validator/releases/tag/v1.5.0).
 
-File where the ROAs will be stored in CSV format.
+File where the ROAs (found during each validation run) will be stored (in CSV format).
 
-When the file is specified, its content will be removed to store the ROAs; if the file doesn't exists, it will be created. To print at console, use a hyphen `"-"`. If RTR server is enabled, then the ROAs will be printed every [`--server.interval.validation`](#--serverintervalvalidation) secs.
+If the file already exists, it will be overwritten. If it doesn't exist, it will be created. To print to standard output, use a hyphen (`-`). If the RTR server is [enabled](#--mode), then the ROAs will be printed every [`--server.interval.validation`](#--serverintervalvalidation) seconds.
 
-Each line of the result is printed in the following order: _AS, Prefix, Max prefix length_; the first line contains those column descriptors.
+Each line of the result is printed in the following order: _AS, Prefix, Max prefix length_. The first line contains the column names.
 
-If a value isn't specified, then the ROAs aren't printed.
+If `--output.roa` is omitted, the ROAs are not printed.
 
 > Note: The paragraphs below apply to [Fort master](https://github.com/NICMx/FORT-validator).
 
-File where the ROAs will be stored in the configured format (see [`--output.format`](#--outputformat)).
+File where the ROAs (found during each validation run) will be stored. See [`--output.format`](#--outputformat).
 
-When the file is specified, its content will be removed to store the ROAs; if the file doesn't exists, it will be created. To print at console, use a hyphen `"-"`. If RTR server is enabled, then the ROAs will be printed every [`--server.interval.validation`](#--serverintervalvalidation) secs.
+If the file already exists, it will be overwritten. If it doesn't exist, it will be created. To print to standard output, use a hyphen (`-`). If the RTR server is [enabled](#--mode), then the ROAs will be printed every [`--server.interval.validation`](#--serverintervalvalidation) secs.
 
-When [`--output.format`](#--outputformat)`=csv` (which is the default value), then each line of the result is printed in the following order: _AS, Prefix, Max prefix length_; the first line contains those column descriptors.
+When `--output.format` equals `csv`, each line of the result is printed in the following order: _AS, Prefix, Max prefix length_. The first line contains the column names.
 
-When [`--output.format`](#--outputformat)`=json`, then each element is printed inside an object array of `roas`; ie:
+When `--output.format` equals `json`, each element is printed in an object array of `roas`:
 
-<pre><code>{
+{% highlight json %}
+{
        "roas": [
                {
                        "asn": "AS64496",
@@ -758,9 +796,10 @@ When [`--output.format`](#--outputformat)`=json`, then each element is printed i
                        "maxLength": 48
                }
        ]
-}</code></pre>
+}
+{% endhighlight %}
 
-If a value isn't specified, then the ROAs aren't printed.
+If `--output.roa` is omitted, the ROAs are not printed.
 
 ### `--output.bgpsec`
 
@@ -769,44 +808,46 @@ If a value isn't specified, then the ROAs aren't printed.
 
 > Note: The paragraphs below apply to [Fort 1.5.0](https://github.com/NICMx/FORT-validator/releases/tag/v1.5.0).
 
-File where the BGPsec Router Keys will be stored in CSV format.
+File where the BGPsec Router Keys (found during each validation run) will be stored (in CSV format).
 
-Since most of the data is binary (Subject Key Identifier and Subject Public Key Info), such data is base64url encoded without trailing pads.
+Since most of the data (Subject Key Identifier and Subject Public Key Info) is binary, it is base64url-encoded, without trailing pads.
 
-When the file is specified, its content will be removed to store the Router Keys; if the file doesn't exists, it will be created. To print at console, use a hyphen `"-"`. If RTR server is enabled, then the BGPsec Router Keys will be printed every [`--server.interval.validation`](#--serverintervalvalidation) secs.
+If the file already exists, it will be overwritten. If it doesn't exist, it will be created. To print to standard output console, use a hyphen (`-`). If the RTR server is [enabled](#--mode), the BGPsec Router Keys will be printed every [`--server.interval.validation`](#--serverintervalvalidation) seconds.
 
-Each line of the result is printed in the following order: _AS, Subject Key Identifier, Subject Public Key Info_; the first line contains those column descriptors.
+Each line of the result is printed in the following order: _AS, Subject Key Identifier, Subject Public Key Info_. The first line contains the column names.
 
-If a value isn't specified, then the BGPsec Router Keys aren't printed.
+If `--output.bgpsec` is ommited, then the BGPsec Router Keys are not printed.
 
 > Note: The paragraphs below apply to [Fort master](https://github.com/NICMx/FORT-validator).
 
-File where the BGPsec Router Keys will be stored in the configured format (see [`--output.format`](#--outputformat)).
+File where the BGPsec Router Keys (found during each validation run) will be stored. See [`--output.format`](#--outputformat).
 
-Since most of the data is binary (Subject Key Identifier and Subject Public Key Info), such data is base64url encoded without trailing pads.
+Since most of the data (Subject Key Identifier and Subject Public Key Info) is binary, it is base64url-encoded, without trailing pads.
 
-When the file is specified, its content will be removed to store the Router Keys; if the file doesn't exists, it will be created. To print at console, use a hyphen `"-"`. If RTR server is enabled, then the BGPsec Router Keys will be printed every [`--server.interval.validation`](#--serverintervalvalidation) secs.
+If the file already exists, it will be overwritten. If it doesn't exist, it will be created. To print to standard output, use a hyphen (`-`). If the RTR server is [enabled](#--mode), the BGPsec Router Keys will be printed every [`--server.interval.validation`](#--serverintervalvalidation) seconds.
 
-When [`--output.format`](#--outputformat)`=csv` (which is the default value), then each line of the result is printed in the following order: _AS, Subject Key Identifier, Subject Public Key Info_; the first line contains those column descriptors.
+When `--output.format` equals `csv`, each line of the result is printed in the following order: _AS, Subject Key Identifier, Subject Public Key Info_. The first line contains the column names.
 
-When [`--output.format`](#--outputformat)`=json`, then each element is printed inside an object array of `router-keys`; ie:
+When `--output.format` equals `json`, each element is printed in an object array of `router-keys`:
 
-<pre><code>{
+{% highlight json %}
+{
        "router-keys": [
                {
                        "asn": "AS64496",
-                       "ski": "&lt;Base64 Encoded SKI&gt;",
-                       "spki": "&lt;Base64 Encoded SPKI&gt;"
+                       "ski": "<Base64 Encoded SKI>",
+                       "spki": "<Base64 Encoded SPKI>"
                },
                {
                        "asn": "AS64497",
-                       "ski": "&lt;Base64 Encoded SKI&gt;",
-                       "spki": "&lt;Base64 Encoded SPKI&gt;"
+                       "ski": "<Base64 Encoded SKI>",
+                       "spki": "<Base64 Encoded SPKI>"
                }
        ]
-}</code></pre>
+}
+{% endhighlight %}
 
-If a value isn't specified, then the BGPsec Router Keys aren't printed.
+If `--output.bgpsec` is ommited, then the BGPsec Router Keys are not printed.
 
 ### `--output.format`
 
@@ -838,28 +879,26 @@ This check is merely a caution, since ASN1 decoding functions are recursive and
 
 Time period that must lapse to warn about a stale repository (the messages will be sent to the operation log). The time lapse starts once the repository download has been retried (see [`--rsync.retry.count`](#--rsyncretrycount) and [`--http.retry.count`](#--httpretrycount)) and failed after such retries.
 
-A repository is considered stale if its files can't be fetched due to a communication error and this error persists across validation cycles. This kind of issues can be due to a local misconfiguration (eg. a firewall that blocks incoming data) or a problem at the server (eg. the server is down).
+A repository is considered stale if its files can't be fetched due to a communication error, and this error persists across validation cycles. This kind of issue can be due to a local misconfiguration (eg. a firewall that blocks incoming data) or a problem at the server (eg. the server is down).
 
-Despite who's "fault" is, FORT validator will try to work with the local files from [`--local-repository`](#--local-repository).
+During the downtime, Fort will try to work with the local cache. ([`--local-repository`](#--local-repository))
 
 The communication errors sent to the operation log, are those related to "first level" RPKI servers; commonly this are the servers maintained by the RIRs.
 
-Currently **all** the communication errors are logged at the validation log. This argument (`--stale-repository-period`) is merely to send this error messages also to the operation log.
+Currently **all** the communication errors are logged in the validation log. `--stale-repository-period` is only used to also send them to the operation log.
 
-A value **equal to 0** means that the communication errors will be logged at once.
+A value **equal to 0** means that the communication errors will be logged immediately.
 
 ### `--thread-pool.server.max`
 
 - **Type:** Integer
 - **Availability:** `argv` and JSON
 - **Default:** 20
-- **Range:** 1--500
-
-Maximum number of threads that will be spawned at an internal thread pool to attend incoming RTR clients (i.e. routers).
+- **Range:** 1--[`UINT_MAX`](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html)
 
-The thread pool assigns one thread per RTR client, so a maximum of `--thread-pool.server.max` clients will be attended simultaneously. If the max limit is reached, any incoming client will be rejected: an RTR error PDU will be sent to the client and the connection will be closed by the server.
+Number of threads the RTR server will reserve for RTR client (router) request handling. The server will be able to handle `--thread-pool.server.max` requests at most, at once. Additional requests will queue.
 
-Once the client or the server terminates the session, the corresponding thread will be returned to the pool so that it can be used again by any other incoming client.
+> Before Fort 1.5.1, this value used to represent the maximum number of client _connections_ the server would be able to hold at any given time. It scales better now.
 
 ### `--thread-pool.validation.max`
 
@@ -868,11 +907,11 @@ Once the client or the server terminates the session, the corresponding thread w
 - **Default:** 5
 - **Range:** 1--100
 
-Maximum number of threads that will be spawned at an internal thread pool in order to run validation cycles.
+> ![Warning!](img/warn.svg) Deprecated. This value should always equal the number of TALs you have, and will therefore be automated and retired in the future.
 
-When a validation cycle begins, one thread per configured TAL is utilized; once the whole RPKI tree of the TAL is validated, the thread is returned to the pool.
+Number of threads in the validation thread pool.
 
-If there are more TALs at [`--tal`](#--tal) than `--thread-pool.validation.max` threads at the pool, is very likely that the validation cycles take a bit more of time to complete since only `--thread-pool.validation.max` threads will be working at the same time. E.g. if `--thread-pool.validation.max=2` and the location at [`--tal`](#--tal) has 4 TAL files, only 2 TALs will be validated simultaneously while the rest waits in a queue until there's an available thread at the pool to attend them.
+During every validation cycle, one thread is borrowed from this pool per TAL, to validate the RPKI tree of the corresponding TAL.
 
 ### `--rsync.enabled`
 
@@ -880,9 +919,11 @@ If there are more TALs at [`--tal`](#--tal) than `--thread-pool.validation.max`
 - **Availability:** `argv` and JSON
 - **Default:** `true`
 
-Enables RSYNC requests.
+Enables RSYNC requests during validation?
+
+If disabled (`--rsync.enabled=false`), Fort will skip all outgoing RSYNC requests during the validation cycle. The relevant validation results will be entirely based on the (possibly outdated) existing cache. ([`--local-repository`](#--local-repository))
 
-If disabled (eg. `--rsync.enabled=false`), FORT validator won't download files nor directories via RSYNC, and will expect to find all repository files at [`--local-repository`](#--local-repository).
+Mostly intended for debugging.
 
 ### `--rsync.priority`
 
@@ -891,16 +932,11 @@ If disabled (eg. `--rsync.enabled=false`), FORT validator won't download files n
 - **Default:** 50
 - **Range:** 0--100
 
-> ![img/warn.svg](img/warn.svg) By default, HTTPS requests are preferred over rsync requests.
+RSYNC's precedence when choosing the protocol used to download files (assuming Fort has to choose, and both protocols are [enabled](#--mode)). The protocol with the highest priority is used first, and the runner-up is employed as fallback.
 
-Assign priority to use RSYNC to fetch repository files. A higher value means a higher priority.
+> At the moment, only two protocols (RRDP/HTTP and RSYNC) are supported. Yes, `--rsync.priority`'s range is overkill.
 
-This argument works along with [`--http.priority`](#--httppriority), since the higher value of the two arguments will result in the first protocol to utilize when fetching repositories files. Of course, this depends also on certificates information or the TAL URIs, since currently HTTP URIs are optional and not every RIR repository makes use of them.
-
-Whenever a certificate or a TAL has both RSYNC and HTTP URIs, the following criteria is followed to prioritize which one to use first:
-- [`--rsync.priority`](#--rsyncpriority) **equals** [`--http.priority`](#--httppriority): use the order specified at the certificate or the TAL to fetch the corresponding URI.
-- [`--rsync.priority`](#--rsyncpriority) **greater than** [`--http.priority`](#--httppriority): use RSYNC repository/TAL URI first; if there's an error fetching data, fallback to fetch HTTP repository/TAL URI.
-- [`--rsync.priority`](#--rsyncpriority) **less than** [`--http.priority`](#--httppriority): use HTTP repository/TAL URI first; if there's an error fetching data, fallback to use RSYNC repository/TAL URI.
+See [`--http.priority`](#--httppriority).
 
 ### `--rsync.strategy`
 
@@ -977,7 +1013,7 @@ Period of time (in seconds) to wait between each retry to execute an RSYNC.
 
 Path to a JSON file from which additional configuration will be read.
 
-The configuration options are mostly the same as the ones from the `argv` interface. (See the "Availability" metadata of each field.) Here's a full configuration file example:
+The configuration options are mostly the same as the ones from the `argv` interface. (See the "Availability" metadata of each field.) Here's a (possibly slightly outdated) full configuration file example:
 
 <pre><code>{
        "<a href="#--tal">tal</a>": "/tmp/fort/tal/",
@@ -985,9 +1021,9 @@ The configuration options are mostly the same as the ones from the `argv` interf
        "<a href="#--work-offline">work-offline</a>": false,
        "<a href="#--shuffle-uris">shuffle-uris</a>": true,
        "<a href="#--maximum-certificate-depth">maximum-certificate-depth</a>": 32,
-       "<a href="#--slurm">slurm</a>": "/tmp/fort/test.slurm",
        "<a href="#--mode">mode</a>": "server",
        "<a href="#--daemon">daemon</a>": false,
+       "<a href="#--slurm">slurm</a>": "/tmp/fort/test.slurm",
 
        "server": {
                "<a href="#--serveraddress">address</a>": [
@@ -1001,6 +1037,9 @@ The configuration options are mostly the same as the ones from the `argv` interf
                        "<a href="#--serverintervalrefresh">refresh</a>": 3600,
                        "<a href="#--serverintervalretry">retry</a>": 600,
                        "<a href="#--serverintervalexpire">expire</a>": 7200
+               },
+               "deltas": {
+                       "<a href="#--serverdeltaslifetime">lifetime</a>": 4
                }
        },
 
@@ -1185,37 +1224,6 @@ Fort will replace `"$REMOTE"` with the remote URL it needs to download, and `"$L
 
 A listing of actions to be performed by validation upon encountering certain error conditions. See [Incidences](incidence.html).
 
-### `init-locations`
-
-- **Type:** JSON Object array
-- **Availability:** JSON only
-
-List of URLs from where the TALs will be fetched when [`--init-tals`](#--init-tals) is utilized. Each URL can have an optional `accept-message` that will be displayed at the terminal. When this message is displayed, the word **"yes"** is expected by FORT to download the corresponding TAL file; this way an explicit acceptance is obtained to comply with the printed message.
-
-By default it has 4 URLs from each TAL that doesn't require and explicit politics acceptance by the user, and 1 URL that does have an acceptance message so that FORT can proceed with its download.
-
-This is a JSON array of objects, where each object has a mandatory `url` member, and an optional `accept-message` member. The default value is:
-
-<pre><code>
-"init-locations": [
-       {
-               "url": "https://www.arin.net/resources/manage/rpki/arin.tal",
-               "accept-message": "Please download and read ARIN Relying Party Agreement (RPA) from https://www.arin.net/resources/manage/rpki/rpa.pdf. Once you've read it and if you agree ARIN RPA, type 'yes' to proceed with ARIN's TAL download:"
-       },
-       {
-               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/lacnic.tal"
-       },
-       {
-               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/ripe.tal"
-       },
-       {
-               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/afrinic.tal"
-       },
-       {
-               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/apnic.tal"
-       }
-]</code></pre>
-
 ## Deprecated arguments
 
 ### `--sync-strategy`
@@ -1240,7 +1248,7 @@ Despite this argument will be deprecated, it still can be utilized. Its possible
 - **Availability:** `argv` and JSON
 - **Default:** `true`
 
-> ![img/warn.svg](img/warn.svg) This argument **will be DEPRECATED**. Use [`--http.enabled`](#--httpenabled) instead.
+> ![img/warn.svg](img/warn.svg) This argument **is DEPRECATED**. Use [`--http.enabled`](#--httpenabled) instead.
 
 ### `--rrdp.priority`
 
@@ -1249,7 +1257,7 @@ Despite this argument will be deprecated, it still can be utilized. Its possible
 - **Default:** 60
 - **Range:** 0--100
 
-> ![img/warn.svg](img/warn.svg) This argument **will be DEPRECATED**. Use [`--http.priority`](#--httppriority) instead.
+> ![img/warn.svg](img/warn.svg) This argument **is DEPRECATED**. Use [`--http.priority`](#--httppriority) instead.
 
 ### `--rrdp.retry.count`
 
@@ -1258,7 +1266,7 @@ Despite this argument will be deprecated, it still can be utilized. Its possible
 - **Default:** 2
 - **Range:** 0--[`UINT_MAX`](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html)
 
-> ![img/warn.svg](img/warn.svg) This argument **will be DEPRECATED**. Use [`--http.retry.count`](#--httpretrycount) instead.
+> ![img/warn.svg](img/warn.svg) This argument **is DEPRECATED**. Use [`--http.retry.count`](#--httpretrycount) instead.
 
 ### `--rrdp.retry.interval`
 
@@ -1267,4 +1275,38 @@ Despite this argument will be deprecated, it still can be utilized. Its possible
 - **Default:** 5
 - **Range:** 0--[`UINT_MAX`](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html)
 
-> ![img/warn.svg](img/warn.svg) This argument **will be DEPRECATED**. Use [`--http.retry.interval`](#--httpretryinterval) instead.
+> ![img/warn.svg](img/warn.svg) This argument **is DEPRECATED**. Use [`--http.retry.interval`](#--httpretryinterval) instead.
+
+### `init-locations`
+
+- **Type:** JSON Object array
+- **Availability:** JSON only
+
+> ![img/warn.svg](img/warn.svg) This argument is deprecated. I don't know why it exists; just do normal wgets or curls instead. As of Fort 1.5.1, it does nothing. The documentation below applies to 1.5.0 and below.
+
+List of URLs from where the TALs will be fetched when [`--init-tals`](#--init-tals) is utilized. Each URL can have an optional `accept-message` that will be displayed at the terminal. When this message is displayed, the word **"yes"** is expected by FORT to download the corresponding TAL file; this way an explicit acceptance is obtained to comply with the printed message.
+
+By default it has 4 URLs from each TAL that doesn't require and explicit politics acceptance by the user, and 1 URL that does have an acceptance message so that FORT can proceed with its download.
+
+This is a JSON array of objects, where each object has a mandatory `url` member, and an optional `accept-message` member. The default value is:
+
+```
+"init-locations": [
+       {
+               "url": "https://www.arin.net/resources/manage/rpki/arin.tal",
+               "accept-message": "Please download and read ARIN Relying Party Agreement (RPA) from https://www.arin.net/resources/manage/rpki/rpa.pdf. Once you've read it and if you agree ARIN RPA, type 'yes' to proceed with ARIN's TAL download:"
+       },
+       {
+               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/lacnic.tal"
+       },
+       {
+               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/ripe.tal"
+       },
+       {
+               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/afrinic.tal"
+       },
+       {
+               "url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples/tal/apnic.tal"
+       }
+]
+```
index 77b36826e875ce4cf39b725fac1766598d2ca5f1..44807746e2f4bb17b9bb6d3f1fd65d91182a4438 100644 (file)
@@ -1,4 +1,2 @@
-Please ignore this folder. It only exists in the hopes that `fort_setup.sh` continues working until it's retired. The script is deprecated at the moment.
-
-The TALs contained here are pretty much all old and obsolete. If you need to download the current TALs, run `fort --init-tals --tal <TAL directory>` instead.
+Please ignore this folder. If you need to download the current TALs, run `fort --init-tals --tal <TAL directory>` instead.
 
index e61c4829cb28e87d854b3fef36e398ceb49ddf36..5ff40bfd5518653f8d84ad356120bd3f230495bc 100644 (file)
@@ -1,5 +1,5 @@
-https://rpki.afrinic.net/repository/AfriNIC.cer
 rsync://rpki.afrinic.net/repository/AfriNIC.cer
+https://rpki.afrinic.net/repository/AfriNIC.cer
 
 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxsAqAhWIO+ON2Ef9oRDM
 pKxv+AfmSLIdLWJtjrvUyDxJPBjgR+kVrOHUeTaujygFUp49tuN5H2C1rUuQavTH
index 57cd9125db0cd5a035bfe992eb55682727a71d67..fc781ee224092a954107127f9391ca94550b388f 100644 (file)
@@ -1,4 +1,3 @@
-https://tal.apnic.net/apnic.cer
 rsync://rpki.apnic.net/repository/apnic-rpki-root-iana-origin.cer
 
 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx9RWSL61YAAYumEiU8z8
index 55bbf3198fe95bc1bd8acb9a764872849714c99c..f81af215aab433bd7f72e46873c6f444c6ed2795 100644 (file)
@@ -1,9 +1,4 @@
+https://rrdp.lacnic.net/ta/rta-lacnic-rpki.cer
 rsync://repository.lacnic.net/rpki/lacnic/rta-lacnic-rpki.cer
 
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqZEzhYK0+PtDOPfub/KR
-c3MeWx3neXx4/wbnJWGbNAtbYqXg3uU5J4HFzPgk/VIppgSKAhlO0H60DRP48by9
-gr5/yDHu2KXhOmnMg46sYsUIpfgtBS9+VtrqWziJfb+pkGtuOWeTnj6zBmBNZKK+
-5AlMCW1WPhrylIcB+XSZx8tk9GS/3SMQ+YfMVwwAyYjsex14Uzto4GjONALE5oh1
-M3+glRQduD6vzSwOD+WahMbc9vCOTED+2McLHRKgNaQf0YJ9a1jG9oJIvDkKXEqd
-fqDRktwyoD74cV57bW3tBAexB7GglITbInyQAsmdngtfg2LUMrcROHHP86QPZINj
-DQIDAQAB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqZEzhYK0+PtDOPfub/KRc3MeWx3neXx4/wbnJWGbNAtbYqXg3uU5J4HFzPgk/VIppgSKAhlO0H60DRP48by9gr5/yDHu2KXhOmnMg46sYsUIpfgtBS9+VtrqWziJfb+pkGtuOWeTnj6zBmBNZKK+5AlMCW1WPhrylIcB+XSZx8tk9GS/3SMQ+YfMVwwAyYjsex14Uzto4GjONALE5oh1M3+glRQduD6vzSwOD+WahMbc9vCOTED+2McLHRKgNaQf0YJ9a1jG9oJIvDkKXEqdfqDRktwyoD74cV57bW3tBAexB7GglITbInyQAsmdngtfg2LUMrcROHHP86QPZINjDQIDAQAB
\ No newline at end of file
index b03fb4aa8256cbb7c5d8e3e8ff819108edf5f7cb..4cb1ff89900c93b2326531fbb440655fc327d53d 100755 (executable)
@@ -113,7 +113,7 @@ get_tal "ARIN" "$TALS_LOC/arin.tal" $ARIN_TAL
 echo ""
 echo "Fetching the rest of the TALs"
 get_tal "LACNIC" "$TALS_LOC/lacnic.tal" "$GITHUB_TALS/lacnic.tal"
-get_tal "RIPE" "$TALS_LOC/ripe.tal" "$GITHUB_TALS/ripe.tal"
+get_tal "RIPE" "$TALS_LOC/ripe-ncc.tal" "$GITHUB_TALS/ripe-ncc.tal"
 get_tal "AFRINIC" "$TALS_LOC/afrinic.tal" "$GITHUB_TALS/afrinic.tal"
 get_tal "APNIC" "$TALS_LOC/apnic.tal" "$GITHUB_TALS/apnic.tal"
 
index 8449013922f8af81815b4fd97a1d3137d99708d2..aa2636dcff3c17b1d295ca94f9dcb83ec42302d2 100644 (file)
@@ -1,11 +1,14 @@
-.TH fort 8 "2020-11-25" "v1.5.0" "FORT validator"
+.TH fort 8 "2021-08-05" "v1.5.1" "FORT validator"
 
 .SH NAME
-fort \- RPKI certificate path validator and RTR server
+fort \- RPKI validator and RTR server
 
 .SH SYNOPSIS
 .B fort
-[\fIOPTIONS\fR]
+[--mode=server] [\fIOPTIONS\fR]
+.P
+.B fort
+--mode=standalone [\fIOPTIONS\fR]
 .P
 .B fort
 --init-tals --tal=\fIPATH\fR
@@ -15,27 +18,20 @@ fort \- RPKI certificate path validator and RTR server
 
 .SH DESCRIPTION
 
-FORT is an RPKI validator and a RTR server (RTR versions 0 and 1 are
-supported).
-In the RPKI context, FORT is also known as an RP (Relying Party).
-A simple resume of the actions performed by an RP can be read at RFC 6480
-section 6
-.RI "(" https://tools.ietf.org/html/rfc6480#section-6 ")."
-.P
-The RTR (RPKI to Router Protocol) is basically "a protocol to deliver validated
-prefix origin data to routers", see RFC 6810
-.RI "(" https://tools.ietf.org/html/rfc6810 ")"
-and RFC 8210
-.RI "(" https://tools.ietf.org/html/rfc8210 ")."
-.P
-
-So, FORT performs RPKI validations starting from a single or set of TALs (Trust
-Anchor Locators), either in a recurrent or single (standalone) way.
-Additionally, it can talk to routers using the RTR protocol (version will
-depend on the client, both 0 and 1 are supported) to provide them the VRPs
-(Validated ROA Payloads) and the BGPsec Router Keys resultant of the
-validation.
+Fort is an RPKI "Relying Party" (RP). It's an artifact that validates Route
+Origin Attestations (ROAs) and BGPsec Router Keys, by way of a Public Key
+Infrastructure (PKI). ROAs are employed by routers, to verify BGP routing
+attestations.
+.P
+The main validation input is one or more Trust Anchor Locator (TAL) files
+(\fI--tal\fR), which point to the RPKI Trust Anchors (ie. root certificates).
+Fort downloads all the resources governed by the trust anchors into a local
+cache (\fI--local-repository\fR), and proceeds to validate their entirety. The
+output of the validation is a set of trusted ROAs and Router Keys, which are
+printed to files (\fI--output.roa\fR and \fI--output.bgpsec\fR) and/or served to
+routers (\fI--mode=server\fR, \fI--server.address\fR, \fI--server.port\fR)
+through the RTR protocol (version 0 or 1).
+
 .SH OPTIONS
 .TP
 .B \-h, \-\-help
@@ -58,24 +54,36 @@ Print program version and exit.
 
 .B \-\-init-tals
 .RS 4
-Download the RIR TALs into the existent local path directory set at \fI--tal\fR
-argument and exit.
+Download the currently known core TALs into the existent local directory \fI--tal\fR, then exit.
 .P
-This argument exists merely to have all TALs before running FORT validator,
-the directory path should be set at the \fI--tal\fR argument.
+The "currently known core TALs" are
 .P
-By default, the 4 TALs that don't require a policy acceptance are downloaded
-from FORT validator's GitHub repository. ARIN TAL does require an explicit
-acceptance by the user, so it's downloaded only after the user accepts ARIN's
-RPA; this message is displayed at the terminal and only if the user accepts,
-ARIN TAL is also downloaded.
+https://rpki.afrinic.net/tal/afrinic.tal
+.br
+https://tal.apnic.net/apnic.tal
+.br
+https://www.arin.net/resources/manage/rpki/arin.tal
+.br
+https://www.lacnic.net/innovaportal/file/4983/1/lacnic.tal
+.br
+https://tal.rpki.ripe.net/ripe-ncc.tal
 .P
-This is an example on how to use this argument (assuming that
-\fI/etc/fort/tal\fR exists and is writable):
-\fBfort --init-tals --tal /etc/fort/tal\fR
+Please note that ARIN requires that you accept a Relying Party Agreement before you can download their TAL: https://www.arin.net/resources/manage/rpki/rpa.pdf
 .RE
+
+.B \-\-init-as0-tals
+.RS 4
+Download the currently known AS0 TALs into the existent local directory \fI--tal\fR, then exit.
+.P
+The "currently known AS0 TALs" are
+.P
+https://tal.apnic.net/apnic-as0.tal
+.br
+https://www.lacnic.net/innovaportal/file/4983/1/lacnic-as0.tal
 .P
 
+.RE
+
 .BR \-f ", " \-\-configuration-file=\fIFILE\fR
 .RS 4
 Path to a JSON file from where additional configuration will be read.
@@ -206,73 +214,14 @@ match the actual file hash). [Default action: \fBerror\fR]
 More information about incidences can be consulted at FORT's web docs.
 .RE
 
-.P
-.B init-locations
-.RS 4
-List of URLs from where the TALs will be fetched when \fI--init-tals\fR is
-utilized. Each URL can have an optional \fBaccept-message\fR that will be
-displayed at the terminal. When this message is displayed, the word "yes" is
-expected by FORT to download the corresponding TAL file; this way an explicit
-acceptance is obtained to comply with the printed message.
-.P
-By default it has 4 URLs from each TAL that doesn't require and explicit
-politics acceptance by the user, and 1 URL that does have an acceptance message
-so that FORT can proceed with its download.
-.P
-This is a JSON array of objects, where each object has a mandatory \fBurl\fR
-member, and an optional \fBaccept-message\fR member. The default value is:
-.P
-"init-locations": [
-.RS 2
-{
-.RS 2
-"url": "https://www.arin.net/resources/manage/rpki/arin.tal",
-.br
-"accept-message": "Please download and read ARIN Relying Party Agreement (RPA)
-from https://www.arin.net/resources/manage/rpki/rpa.pdf. Once you've read it and
-if you agree ARIN RPA, type 'yes' to proceed with ARIN's TAL download:"
-.RE
-},
-{
-.RS 2
-"url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples\
-/tal/lacnic.tal"
-.RE
-},
-{
-.RS 2
-"url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples\
-/tal/ripe.tal"
-.RE
-},
-{
-.RS 2
-"url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples\
-/tal/afrinic.tal"
-.RE
-},
-{
-.RS 2
-"url": "https://raw.githubusercontent.com/NICMx/FORT-validator/master/examples\
-/tal/apnic.tal"
-.RE
-}
-.RE
-]
-.RE
-
 .RE
 .P
 
 .BR \-t ", " \-\-tal=(\fIFILE\fR|\fIDIRECTORY\fR)
 .RS 4
-Path to the TAL file or directory the validation will sprawl from.
+Path to a .tal, or a directory containing .tal files. Fort will validate the trees pointed by them.
 .P
-If a DIRECTORY is specified, the files with the extension '\fI.tal\fR' are
-utilized by fort as TAL.
-.P
-The TAL ("Trust Anchor Locator") is a text file that lists a few URLs which can
-be used to access the "Trust Anchor" (the root of a particular RPKI tree) and
+The TAL ("Trust Anchor Locator") is a text file that lists a few URLs which can be used to access the "Trust Anchor" (the root of a particular RPKI tree) and
 its public key. (See RFC 8630.)
 .RE
 .P
@@ -1178,20 +1127,13 @@ By default, it has a value of \fIcsv\fR.
 
 .B \-\-thread-pool.server.max=\fIUNSIGNED_INTEGER\fR
 .RS 4
-Maximum number of threads that will be spawned at an internal thread pool to
-attend incoming RTR clients (i.e. routers).
-.P
-The thread pool assigns one thread per RTR client, so a maximum of
-\fI--thread-pool.server.max\fR clients will be attended simultaneously. If the
-max limit is reached, any incoming client will be rejected: an RTR error PDU
-will be sent to the client and the connection will be closed by the server.
-.P
-Once the client or the server terminates the session, the corresponding thread
-will be returned to the pool so that it can be used again by any other incoming
-client.
+Number of threads the RTR server will reserve for RTR client (router) request handling. The server will be able to handle \fI--thread-pool.server.max\fR requests at most, at once. Additional requests will queue.
 .P
-By default, it has a value of \fI20\fR. Minimum allowed value: \fI1\fR,
-maximum allowed value \fI500\fR.
+Minimum: \fI1\fR
+.br
+Maximum: \fIUINT_MAX\fR
+.br
+Default: \fI20\fR
 .RE
 
 .B \-\-thread-pool.validation.max=\fIUNSIGNED_INTEGER\fR
@@ -1319,7 +1261,8 @@ to a specific value:
   "slurm": "/tmp/fort/test.slurm",
   "server": {
     "address": [
-      "127.0.0.1"
+      "192.0.2.1",
+      "2001:db8::1"
     ],
     "port": "8323",
     "backlog": 64,
@@ -1328,6 +1271,9 @@ to a specific value:
       "refresh": 3600,
       "retry": 600,
       "expire": 7200
+    },
+    "deltas": {
+      "lifetime": 4
     }
   },
   "log": {
@@ -1355,7 +1301,7 @@ to a specific value:
       "count": 2,
       "interval": 5
     },
-    "user-agent": "fort/1.5.0",
+    "user-agent": "fort/1.5.1",
     "connect-timeout": 30,
     "transfer-timeout": 0,
     "idle-timeout": 15,
index 0cb383be521d3652c1719d4a311bd164971dce15..755d57085fae0483124398641cbd8fad2b1e6d21 100644 (file)
@@ -10,7 +10,6 @@ fort_SOURCES += address.h address.c
 fort_SOURCES += algorithm.h algorithm.c
 fort_SOURCES += certificate_refs.h certificate_refs.c
 fort_SOURCES += cert_stack.h cert_stack.c
-fort_SOURCES += clients.h
 fort_SOURCES += common.c common.h
 fort_SOURCES += config.h config.c
 fort_SOURCES += daemon.h daemon.c
@@ -128,7 +127,7 @@ fort_SOURCES += xml/relax_ng.c xml/relax_ng.h
 include asn1/asn1c/Makefile.include
 fort_SOURCES += $(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS)
 
-fort_CFLAGS  = -Wall -Wno-cpp
+fort_CFLAGS  = -Wall -Wno-cpp -Wpedantic
 # Feel free to temporarily remove this one if you're not using gcc 7.3.0.
 #fort_CFLAGS += $(GCC_WARNS)
 fort_CFLAGS += -std=gnu11 -O2 -g $(FORT_FLAGS) ${XML2_CFLAGS}
@@ -141,7 +140,7 @@ GCC_WARNS  = -fmax-errors=1
 # Please ready some arguments if you want to permanently remove some of these
 # flags. I gave a quick read to the documentation of all of these warnings, and
 # generally liked each of them.
-GCC_WARNS += -Wpedantic -pedantic-errors -Waddress -Walloc-zero -Walloca
+GCC_WARNS += -pedantic-errors -Waddress -Walloc-zero -Walloca
 GCC_WARNS += -Wno-aggressive-loop-optimizations -Warray-bounds=2 -Wbool-compare
 GCC_WARNS += -Wbool-operation -Wno-builtin-declaration-mismatch -Wcast-align
 GCC_WARNS += -Wcast-qual -Wchar-subscripts -Wchkp -Wclobbered -Wcomment
index 78b7a4b4f22139dd5633406bf63f178a581bc6ed..634f2c6c71ffe25fb08e9f5b3b2809a85ebad98d 100644 (file)
@@ -795,10 +795,9 @@ static const struct option_field options[] = {
                .name = "thread-pool.server.max",
                .type = &gt_uint,
                .offset = offsetof(struct rpki_config, thread_pool.server.max),
-               .doc = "Maximum number of active threads (one thread per RTR client) that can live at the thread pool",
+               .doc = "Number of threads in the RTR client request thread pool. Also known as the maximum number of client requests the RTR server will be able to handle at the same time.",
                .min = 1,
-               /* Would somebody connect more than 500 routers? */
-               .max = 500,
+               .max = UINT_MAX,
        },
        {
                .id = 12001,
@@ -806,8 +805,8 @@ static const struct option_field options[] = {
                .type = &gt_uint,
                .offset = offsetof(struct rpki_config,
                    thread_pool.validation.max),
-               .doc = "Maximum number of active threads (one thread per TAL) that can live at the thread pool",
-               .min = 1,
+               .doc = "Number of threads in the validation thread pool. (Each thread handles one TAL tree.)",
+               .min = 0,
                .max = 100,
        },
 
@@ -982,7 +981,7 @@ set_default_values(void)
        rpki_config.server.interval.refresh = 3600;
        rpki_config.server.interval.retry = 600;
        rpki_config.server.interval.expire = 7200;
-       rpki_config.server.deltas_lifetime = 4;
+       rpki_config.server.deltas_lifetime = 2;
 
        rpki_config.tal = NULL;
        rpki_config.slurm = NULL;
index 3058e1badfda5520cd93e099bae9041eaaafda1f..cb865eb74d2793e7863c66a81513f77f59f19614 100644 (file)
@@ -21,8 +21,8 @@
 static pthread_t server_thread;
 static volatile bool stop_server_thread;
 
-STATIC_ARRAY_LIST(server_arraylist, struct rtr_server);
-STATIC_ARRAY_LIST(client_arraylist, struct rtr_client);
+STATIC_ARRAY_LIST(server_arraylist, struct rtr_server)
+STATIC_ARRAY_LIST(client_arraylist, struct rtr_client)
 
 static struct server_arraylist servers;
 static struct client_arraylist clients;
index 54ed1f0bc5a784981baddc3cdfeba35a5813aea6..08df970ad95e4a477aa38eb411f803ab1441b66b 100644 (file)
@@ -81,7 +81,6 @@ EXTRA_DIST  = impersonator.c
 EXTRA_DIST += line_file/core.txt
 EXTRA_DIST += line_file/empty.txt
 EXTRA_DIST += line_file/error.txt
-EXTRA_DIST += rtr/stream.c rtr/stream.h
 EXTRA_DIST += rtr/db/rtr_db_impersonator.c
 EXTRA_DIST += tal/lacnic.tal
 EXTRA_DIST += xml/notification.xml