Convert code block captions into relative links to the tangles.
authorMatt Birkholz <matt@birchwood-abbey.net>
Mon, 1 Apr 2024 22:10:27 +0000 (17:10 -0500)
committerMatt Birkholz <matt@birchwood-abbey.net>
Mon, 1 Apr 2024 22:51:08 +0000 (17:51 -0500)
README.org

index 3950dfe364f465de870d7a97b1dfe6325f00c256..92e30a769d850004553acb0bc543bd5468c84d31 100644 (file)
@@ -86,7 +86,7 @@ abbey's private parameters, in =private/vars-abbey.yml=, example lines
 abbey's private institutional parameters, =private/vars.yml=, can be
 found in [[file:Institute/private/vars.yml][=Institute/private/vars.yml=]].
 
-#+CAPTION: =public/vars.yml=
+#+CAPTION: [[file:public/vars.yml][=public/vars.yml=]]
 #+BEGIN_SRC conf :tangle public/vars.yml :mkdirp yes
 ---
 domain_name: birchwood-abbey.net
@@ -108,7 +108,7 @@ Dovecot-IMAPd, and hosting a VPN with OpenVPN.
 
 The monks of the abbey are masters of the staff (bo) and Emacs.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml :mkdirp yes
 ---
 - name: Install Emacs.
@@ -124,7 +124,7 @@ common mailboxes like ~postmaster~ and ~admin~ into ~root~ and ~root~
 to the machine's privileged account (~sysadm~).  The abbey takes it
 from there, forwarding ~sysadm~ to a real person.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml :noweb no-export
 
 - name: Install abbey email aliases.
@@ -144,7 +144,7 @@ from there, forwarding ~sysadm~ to a real person.
   notify: New aliases.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-front/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/handlers/main.yml][=roles_t/abbey-front/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/handlers/main.yml :mkdirp yes
 ---
 - name: New aliases.
@@ -202,7 +202,7 @@ factor out small roles like ~abbey-git-server~, Emacs Org Mode's Noweb
 support does the duplication, by multiple references to code blocks
 like ~git-tasks~ and ~git-handlers~.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml :noweb no-export
 
 <<git-tasks>>
@@ -241,7 +241,7 @@ like ~git-tasks~ and ~git-handlers~.
     mode: u=rwx,g=srwx,o=rx
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-front/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/handlers/main.yml][=roles_t/abbey-front/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/handlers/main.yml :noweb no-export
 
 <<git-handlers>>
@@ -402,7 +402,7 @@ The following =.htaccess= file works with the directives above.  It
 declares most the native source files in the current directory tree to
 be plain text, so that they are displayed rather than downloaded.
 
-#+CAPTION: =.htaccess=
+#+CAPTION: [[file:.htaccess][=.htaccess=]]
 #+BEGIN_SRC conf :tangle .htaccess
 ReadmeName notfound.html
 IndexIgnore README.org
@@ -448,7 +448,7 @@ and includes =options-ssl-apache.conf= from =/etc/letsencrypt/=.  The
 rest of the Let's Encrypt configuration is discussed in the following
 [[*Install Let's Encrypt][Install Let's Encrypt]] section.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml :noweb no-export
 
 - name: Configure Apache.
@@ -468,7 +468,7 @@ rest of the Let's Encrypt configuration is discussed in the following
 <<apache-gitweb-tasks>>
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-front/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/handlers/main.yml][=roles_t/abbey-front/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/handlers/main.yml :noweb no-export
 
 <<apache-gitweb-handlers>>
@@ -486,7 +486,7 @@ the subject as a command line argument as provided by ~logrotate~.
 The replacement =logrotate-mailer= does, and includes it in a
 ~Subject~ header prepended to ~logrotate~'s message.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml
 
 - name: Configure Apache log archival.
@@ -526,7 +526,7 @@ The replacement =logrotate-mailer= does, and includes it in a
     mode: u=rwx,g=rx,o=rx
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-front/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/handlers/main.yml][=roles_t/abbey-front/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/handlers/main.yml
 
 - name: Reload systemd.
@@ -541,7 +541,7 @@ system's ~ExecStart~ in =/lib/systemd/system/logrotate.service=.  (A
 See the description of ~ExecStart~ in the ~systemd.service(5)~ manual
 page.)
 
-#+CAPTION: =roles_t/abbey-front/files/logrotate-mailer.conf=
+#+CAPTION: [[file:roles_t/abbey-front/files/logrotate-mailer.conf][=roles_t/abbey-front/files/logrotate-mailer.conf=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/files/logrotate-mailer.conf :mkdirp yes
 [Service]
 ExecStart=
@@ -559,7 +559,7 @@ sending it on to ~sendmail~.  Note that there is no encryption (yet).
 This is a low priority because much of the data is available to
 Droplet's ISP's Mom, the NSA/CIA/NWO.
 
-#+CAPTION: =roles_t/abbey-front/files/logrotate-mailer=
+#+CAPTION: [[file:roles_t/abbey-front/files/logrotate-mailer][=roles_t/abbey-front/files/logrotate-mailer=]]
 #+BEGIN_SRC sh :tangle roles_t/abbey-front/files/logrotate-mailer
 #!/bin/bash -e
 
@@ -659,7 +659,7 @@ do ACME (the certificate protocol) when next Let's Encrypt calls
 (quarterly).  The following tasks ensure the ~python3-cerbot-apache~
 package is installed and its =live/= subdirectory is world readable.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml
 
 - name: Install Certbot for Apache.
@@ -688,7 +688,7 @@ The following tasks ensure they are symbolic links to
 =/etc/letsencrypt/= was restored from a backup, the servers should be
 restarted manually.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml
 
 - name: Use Let's Encrypt certificate&key.
@@ -708,7 +708,7 @@ restarted manually.
 
 The following task arranges to rotate Certbot's logs files.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml
 
 - name: Install Certbot logrotate configuration.
@@ -719,7 +719,7 @@ The following task arranges to rotate Certbot's logs files.
     mode: u=rw,g=r,o=r
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-front/files/certbot_logrotate=
+#+CAPTION: [[file:roles_t/abbey-front/files/certbot_logrotate][=roles_t/abbey-front/files/certbot_logrotate=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/files/certbot_logrotate
 /var/log/letsencrypt/*.log {
     rotate 12
@@ -735,7 +735,7 @@ A backup copy of Let's Encrypt's data (=/etc/letsencrypt/=) is sent to
 ~root@core~ in S/MIME encrypted email every time it changes.  Changes
 are detected by keeping a copy in =/etc/letsencrypt~/= for comparison.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml
 
 - name: Install Let's Encrypt archive script.
@@ -746,7 +746,7 @@ are detected by keeping a copy in =/etc/letsencrypt~/= for comparison.
     mode: u=rwx,g=rx,o=rx
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-front/files/cron.daily_letsencrypt=
+#+CAPTION: [[file:roles_t/abbey-front/files/cron.daily_letsencrypt][=roles_t/abbey-front/files/cron.daily_letsencrypt=]]
 #+BEGIN_SRC sh :tangle roles_t/abbey-front/files/cron.daily_letsencrypt
 #!/bin/bash -e
 
@@ -771,7 +771,7 @@ cp -a letsencrypt letsencrypt~
 The message is encrypted with ~root@core~'s public key, which is
 imported into ~root@front~'s GnuPG key file.
 
-#+CAPTION: =roles_t/abbey-front/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/tasks/main.yml][=roles_t/abbey-front/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/tasks/main.yml
 
 - name: Copy root@core's public key.
@@ -783,7 +783,7 @@ imported into ~root@front~'s GnuPG key file.
   notify: Import root@core's public key.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-front/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-front/handlers/main.yml][=roles_t/abbey-front/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-front/handlers/main.yml
 
 - name: Import root@core's public key.
@@ -809,7 +809,7 @@ document, and so replaced with variables set in
 =private/vars-abbey.yml=.  The file path is relative to the playbook's
 directory, =playbooks/=.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml :mkdirp yes
 ---
 - name: Include private abbey variables.
@@ -825,7 +825,7 @@ the ~libhtml-tree-perl~ package.  The house task list uses JQuery.
 Weather scripts use ~mit-scheme~ and ~gnuplot~ (in pseudonymous
 packages).
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Install additional packages.
@@ -846,7 +846,7 @@ machine.  (They should all be relaying to ~smtp.birchwood-abbey.net~
 which delivers any ~.birchwood-abbey.net~ email,
 e.g. ~mythtv@mythtv.birchwood-abbey.net~, locally.)
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml :noweb no-export
 
 - name: Install abbey email aliases.
@@ -862,7 +862,7 @@ e.g. ~mythtv@mythtv.birchwood-abbey.net~, locally.)
   notify: New aliases.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-core/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/handlers/main.yml][=roles_t/abbey-core/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/handlers/main.yml :mkdirp yes
 ---
 - name: New aliases.
@@ -876,13 +876,13 @@ These tasks are identical to those executed on Front, for similar Git
 services on Front and Core.  See [[Configure Git Daemon on Front]] and
 [[*Configure Gitweb on Front][Configure Gitweb on Front]] for more information.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml :noweb no-export
 
 <<git-tasks>>
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-core/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/handlers/main.yml][=roles_t/abbey-core/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/handlers/main.yml :noweb no-export
 
 <<git-handlers>>
@@ -895,7 +895,7 @@ test, and campus).  The live and test sites must operate just like the
 site on Front.  Their configurations include the same [[apache-abbey][~apache-abbey~]],
 [[apache-photos][~apache-photos~]], and [[apache-gitweb][~apache-gitweb~]] used on Front.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml :noweb no-export
 
 - name: Configure live website.
@@ -927,7 +927,7 @@ site on Front.  Their configurations include the same [[apache-abbey][~apache-ab
 <<apache-gitweb-tasks>>
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-core/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/handlers/main.yml][=roles_t/abbey-core/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/handlers/main.yml :noweb no-export
 
 <<apache-gitweb-handlers>>
@@ -941,7 +941,7 @@ more accessible, especially the documentation of software installed on
 Core and not on typical desktop clients.  Also included: the Apache2
 directives that enable user Git publishing with Gitweb (defined [[apache-gitweb][here]]).
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml :noweb no-export
 
 - name: Configure house website.
@@ -963,7 +963,7 @@ directives that enable user Git publishing with Gitweb (defined [[apache-gitweb]
 The abbey uses the Apt-Cacher:TNG package cache on Core.  The
 ~apt-cacher~ domain name is defined in =private/db.domain=.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Install Apt-Cacher:TNG.
@@ -975,7 +975,7 @@ The abbey uses the Apt-Cacher:TNG package cache on Core.  The
 
 Core itself will benefit from using the package cache.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Use the local Apt package cache.
@@ -1005,7 +1005,7 @@ The abbey adds monitoring of the space remaining on the volume at
 =/home/= on Core.  (The small institute only monitors the space
 remaining on roots.)
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Configure NAGIOS monitoring for Core /home/.
@@ -1022,7 +1022,7 @@ remaining on roots.)
   notify: Reload NAGIOS4.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-core/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/handlers/main.yml][=roles_t/abbey-core/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/handlers/main.yml
 
 - name: Reload NAGIOS4.
@@ -1042,7 +1042,7 @@ Raspberry Pi does not reveal core CPU temperatures, so the abbey
 includes yet another version, ~abbey_pisensors~, that reports any
 recognizable temperature in the ~sensors~ output.
 
-#+CAPTION: =roles_t/abbey-core/files/abbey_pisensors=
+#+CAPTION: [[file:roles_t/abbey-core/files/abbey_pisensors][=roles_t/abbey-core/files/abbey_pisensors=]]
 #+BEGIN_SRC sh :tangle roles_t/abbey-core/files/abbey_pisensors :mkdirp yes
 #!/bin/sh
 
@@ -1143,7 +1143,7 @@ The IP addresses of all three hosts are nice to use in the NAGIOS
 configuration (to avoid depending on name service) and so are
 included in =private/vars-abbey.yml=.
 
-#+CAPTION: =private/vars-abbey.yml=
+#+CAPTION: [[file:private/vars-abbey.yml][=private/vars-abbey.yml=]]
 #+BEGIN_SRC conf
 devaron_addr:               10.84.138.10
 kamino_addr:                192.168.56.14
@@ -1156,7 +1156,7 @@ The following task installs each host's NAGIOS configuration.  Note
 that Kamino is not included.  It is currently unmonitored as it is now
 rarely powered up.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Configure cloister NAGIOS monitoring.
@@ -1170,7 +1170,7 @@ rarely powered up.
 
 *** NAGIOS Monitoring of Devaron
 
-#+CAPTION: =roles_t/abbey-core/templates/nagios-devaron.cfg=
+#+CAPTION: [[file:roles_t/abbey-core/templates/nagios-devaron.cfg][=roles_t/abbey-core/templates/nagios-devaron.cfg=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/templates/nagios-devaron.cfg :mkdirp yes
 define host {
     use                     linux-server
@@ -1223,7 +1223,7 @@ define service {
 
 *** NAGIOS Monitoring of Kamino
 
-#+CAPTION: =roles_t/abbey-core/templates/nagios-kamino.cfg=
+#+CAPTION: [[file:roles_t/abbey-core/templates/nagios-kamino.cfg][=roles_t/abbey-core/templates/nagios-kamino.cfg=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/templates/nagios-kamino.cfg
 define host {
     use                     linux-server
@@ -1276,7 +1276,7 @@ define service {
 
 *** NAGIOS Monitoring of Kessel
 
-#+CAPTION: =roles_t/abbey-core/templates/nagios-kessel.cfg=
+#+CAPTION: [[file:roles_t/abbey-core/templates/nagios-kessel.cfg][=roles_t/abbey-core/templates/nagios-kessel.cfg=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/templates/nagios-kessel.cfg
 define host {
     use                     linux-server
@@ -1334,7 +1334,7 @@ regularly to ~webmaster~, who saves them in =/Logs/apache2-public/=
 and runs ~analog~ to generate =/WWW/campus/analog.html=, available to
 the campus as ~http://www/analog.html~.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Install Analog.
@@ -1386,7 +1386,7 @@ user cloud accounts, found in files owned by ~www-data~, files like
 =InstantUpload/Camera/2021/01/IMG_20210115_092838.jpg= in
 =/var/www/nextcloud/data/$USER/files/=.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Add Monkey to Nextcloud group.
@@ -1402,7 +1402,7 @@ user cloud accounts, found in files owned by ~www-data~, files like
 Monkey's photo processing scripts use ~netpbm~ commands like
 ~jpegtopnm~.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Install netpbm.
@@ -1415,7 +1415,7 @@ Monkey's photo processing scripts use ~netpbm~ commands like
 Monkey on Core runs =/WWW/campus/Weather/Private/cronjob= every 5
 minutes and =cronjob-midnight= at midnight.
 
-#+CAPTION: =roles_t/abbey-core/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-core/tasks/main.yml][=roles_t/abbey-core/tasks/main.yml=]]
 #+BEGIN_SRC :tangle roles_t/abbey-core/tasks/main.yml
 
 - name: Create Monkey's weather job.
@@ -1550,7 +1550,7 @@ repeatedly until few or no incomplete or damaged files are found.
 Depending on the quality of the Internet connection, this may take a
 while.
 
-#+CAPTION: =roles_t/abbey-cloister/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-cloister/tasks/main.yml][=roles_t/abbey-cloister/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-cloister/tasks/main.yml :mkdirp yes
 ---
 - name: Use the local Apt package cache.
@@ -1572,7 +1572,7 @@ NRPE]] of [[file:Institute/README.org][A Small Institute]]).  The abbey adds one
 another ~check_sensors~ variant, ~abbey_pisensors~, installed on
 Raspberry Pis (architecture ~aarch64~) only.
 
-#+CAPTION: =roles_t/abbey-cloister/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-cloister/tasks/main.yml][=roles_t/abbey-cloister/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-cloister/tasks/main.yml
 
 - name: Install abbey_pisensors NAGIOS plugin.
@@ -1593,7 +1593,7 @@ Raspberry Pis (architecture ~aarch64~) only.
   notify: Reload NRPE server.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-cloister/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-cloister/handlers/main.yml][=roles_t/abbey-cloister/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-cloister/handlers/main.yml :mkdirp yes
 
 - name: Reload NRPE server.
@@ -1607,7 +1607,7 @@ Raspberry Pis (architecture ~aarch64~) only.
 
 The monks of the abbey are masters of the staff and Emacs.
 
-#+CAPTION: =roles_t/abbey-cloister/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-cloister/tasks/main.yml][=roles_t/abbey-cloister/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-cloister/tasks/main.yml
 
 - name: Install monastic software.
@@ -1677,7 +1677,7 @@ daemon scripts, to call ~owread~ with different paths (containing the
 IDs of each host's devices).  At the moment there is just the
 one weather host, ~anoat~.
 
-#+CAPTION: =roles_t/abbey-weather/files/daemon-anoat=
+#+CAPTION: [[file:roles_t/abbey-weather/files/daemon-anoat][=roles_t/abbey-weather/files/daemon-anoat=]]
 #+BEGIN_SRC perl :tangle roles_t/abbey-weather/files/daemon-anoat :mkdirp yes
 #!/usr/bin/perl -w
 # -*- CPerl -*-
@@ -1814,7 +1814,7 @@ main;
 The above Perl script uses the ~Date::Format~ module, which is
 installed by the following task.
 
-#+CAPTION: =roles_t/abbey-weather/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-weather/tasks/main.yml][=roles_t/abbey-weather/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-weather/tasks/main.yml :mkdirp yes
 ---
 - name: Install weather daemon packages.
@@ -1829,7 +1829,7 @@ abbey uses the Dallas Semiconductor DS9490R, a USB to 1-Wire adapter,
 on all its weather hosts, so it also configures the server to use the
 USB adapter (rather than a test "fake" adapter).
 
-#+CAPTION: =roles_t/abbey-weather/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-weather/tasks/main.yml][=roles_t/abbey-weather/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-weather/tasks/main.yml
 
 - name: Install 1-Wire server.
@@ -1854,7 +1854,7 @@ USB adapter (rather than a test "fake" adapter).
 Monkey on Core will want to download log records (files) using
 ~rsync(1)~.
 
-#+CAPTION: =roles_t/abbey-weather/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-weather/tasks/main.yml][=roles_t/abbey-weather/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-weather/tasks/main.yml
 
 - name: Install Rsync.
@@ -1871,7 +1871,7 @@ administrator to login on the new weather host as ~monkey~ and thus to
 test access to the 1-Wire adapter and devices.  To facilitate
 debugging the ~sysadm~ account is included in the ~monkey~ group.
 
-#+CAPTION: =roles_t/abbey-weather/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-weather/tasks/main.yml][=roles_t/abbey-weather/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-weather/tasks/main.yml
 
 - name: Create monkey.
@@ -1906,7 +1906,7 @@ creates and starts that service /after/ the host-specific
 The ~ExecStartPre=/bin/sleep 30~ is intended to avoid recent hangs in
 ~owread~.
 
-#+CAPTION: =roles_t/abbey-weather/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-weather/tasks/main.yml][=roles_t/abbey-weather/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-weather/tasks/main.yml :noweb no-export
 
 - name: Install weather directory.
@@ -1978,7 +1978,7 @@ The ~ExecStartPre=/bin/sleep 30~ is intended to avoid recent hangs in
   when: weather.stat.exists
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-weather/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-weather/handlers/main.yml][=roles_t/abbey-weather/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-weather/handlers/main.yml :mkdirp yes
 ---
 - name: Reload Systemd.
@@ -2043,7 +2043,7 @@ Private variables in =private/vars-abbey.yml= are needed, and included
 here, as in the ~abbey-core~ role.  The file path is relative to the
 playbook's directory, =playbooks/=.
 
-#+CAPTION: =roles_t/abbey-dvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-dvr/tasks/main.yml][=roles_t/abbey-dvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-dvr/tasks/main.yml :mkdirp yes
 ---
 - name: Include private abbey variables.
@@ -2066,7 +2066,7 @@ After uninstalling 1.36, the Debian 11 package (1.34) was installed
 and configured per the instructions in sections "Web server set-up"
 and "Time Zone" in =/usr/share/doc/zoneminder/README.Debian.gz=.
 
-#+CAPTION: =roles_t/abbey-dvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-dvr/tasks/main.yml][=roles_t/abbey-dvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-dvr/tasks/main.yml
 
 - name: Install Zoneminder.
@@ -2115,7 +2115,7 @@ and "Time Zone" in =/usr/share/doc/zoneminder/README.Debian.gz=.
     state: started
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-dvr/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-dvr/handlers/main.yml][=roles_t/abbey-dvr/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-dvr/handlers/main.yml :mkdirp yes
 ---
 - name: Restart MySQL.
@@ -2134,7 +2134,7 @@ and "Time Zone" in =/usr/share/doc/zoneminder/README.Debian.gz=.
 The following Rsyslog configuration drop-in gets Zoneminder's natter
 out of =/var/log/syslog=.
 
-#+CAPTION: =roles_t/abbey-dvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-dvr/tasks/main.yml][=roles_t/abbey-dvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-dvr/tasks/main.yml
 
 - name: Use /var/log/zoneminder.log
@@ -2175,7 +2175,7 @@ The DB user's password is taken from the ~zoneminder_dbpass~
 variable, kept in =private/vars-abbey.yml=, and generated e.g. with
 the ~apg -n 1 -x 12 -m 12~ command.
 
-#+CAPTION: =private/vars-abbey.yml=
+#+CAPTION: [[file:private/vars-abbey.yml][=private/vars-abbey.yml=]]
 #+BEGIN_SRC conf
 zoneminder_dbpass:           gakJopbikJadsEdd
 #+END_SRC
@@ -2226,7 +2226,7 @@ The following tasks start with a test for the existence of
 last "Link..." task below "forces" the link, whether the target exists
 or not (yet).
 
-#+CAPTION: =roles_t/abbey-dvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-dvr/tasks/main.yml][=roles_t/abbey-dvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-dvr/tasks/main.yml
 
 - name: Test for /Zoneminder/.
@@ -2262,7 +2262,7 @@ or not (yet).
 The remaining tasks ensure that the =/etc/zm/zm.conf= file has the
 proper permissions and contains the correct password.
 
-#+CAPTION: =roles_t/abbey-dvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-dvr/tasks/main.yml][=roles_t/abbey-dvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-dvr/tasks/main.yml
 
 - name: Set /etc/zm/zm.conf permissions.
@@ -2286,7 +2286,7 @@ Finally, Zoneminder's service unit can be enabled (and started) /if/
 the ~zm~ database has also been created, and the service is ready to
 run.
 
-#+CAPTION: =roles_t/abbey-dvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-dvr/tasks/main.yml][=roles_t/abbey-dvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-dvr/tasks/main.yml
 
 - name: Enable/Start Zoneminder.
@@ -2391,7 +2391,7 @@ Private variables in =private/vars-abbey.yml= are needed, as in the
 ~abbey-core~ role.  The file path is relative to the playbook's
 directory, =playbooks/=.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/main.yml][=roles_t/abbey-tvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml :mkdirp yes
 ---
 - name: Include private abbey variables.
@@ -2453,7 +2453,7 @@ index 7a1a0bc..26ba782 100644
        '{{ lookup("flattened", deb_pkg_lst ) }}'
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/mains.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/mains.yml][=roles_t/abbey-tvr/tasks/mains.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Install MythTV runtime requisites.
@@ -2501,7 +2501,7 @@ completed.  It registers the results in the ~mythtv~ variable.
 Several of the remaining installation steps are skipped unless
 ~mythtv.stat.exists~.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/main.yml][=roles_t/abbey-tvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Test for MythTV binary packages.
@@ -2517,7 +2517,7 @@ Several of the remaining installation steps are skipped unless
 
 MythTV Backend needs to run as its own user: ~mythtv~.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/main.yml][=roles_t/abbey-tvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Create mythtv.
@@ -2554,7 +2554,7 @@ The DB user's password is taken from the ~mythtv_dbpass~ variable,
 kept in =private/vars-abbey.yml=, and generated e.g. with the ~apg -n
 1 -x 12 -m 12~ command.
 
-#+CAPTION: =private/vars-abbey.yml=
+#+CAPTION: [[file:private/vars-abbey.yml][=private/vars-abbey.yml=]]
 #+BEGIN_SRC conf
 mythtv_dbpass:           daJkibpoJkag
 #+END_SRC
@@ -2616,7 +2616,7 @@ mysql_tzinfo_to_sql /usr/share/zoneinfo | sudo mysql mysql
 
 This task installs the =mythtv-backend.service= file.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/mains.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/mains.yml][=roles_t/abbey-tvr/tasks/mains.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Create mythtv-backend service.
@@ -2645,7 +2645,7 @@ This task installs the =mythtv-backend.service= file.
   notify: Reload Systemd.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-tvr/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/handlers/main.yml][=roles_t/abbey-tvr/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/handlers/main.yml :mkdirp yes
 ---
 - name: Reload Systemd.
@@ -2658,7 +2658,7 @@ This task installs the =mythtv-backend.service= file.
 This task checks PHP's timezone.  If unset, MythTV's backend logs
 bitter complaints.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/main.yml][=roles_t/abbey-tvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Configure PHP date.timezone.
@@ -2674,7 +2674,7 @@ bitter complaints.
   notify: Restart Apache2.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-tvr/handlers/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/handlers/main.yml][=roles_t/abbey-tvr/handlers/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/handlers/main.yml
 
 - name: Restart Apache2.
@@ -2692,7 +2692,7 @@ program (as described below).  The abbey uses
 =/home/mythtv/Recordings/= for MythTV's default storage.  This task
 creates that directory and ensures it has appropriate permissions.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/main.yml][=roles_t/abbey-tvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Create MythTV storage area.
@@ -2898,7 +2898,7 @@ sudo -H -u mythtv \
 The abbey directs MythTV log messages to =/var/log/mythtv.log= (and
 away from =/var/log/syslog=) and rotates the log file.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/main.yml][=roles_t/abbey-tvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Install =/etc/rsyslog.d/40-mythtv.conf.
@@ -2955,7 +2955,7 @@ rsync -C mythweb /usr/local/share/mythtv/
 
 The following tasks take care of the rest of the installation.
 
-#+CAPTION: =roles_t/abbey-tvr/tasks/main.yml=
+#+CAPTION: [[file:roles_t/abbey-tvr/tasks/main.yml][=roles_t/abbey-tvr/tasks/main.yml=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/tasks/main.yml
 
 - name: Install MythWeb requisites.
@@ -2991,7 +2991,7 @@ The following tasks take care of the rest of the installation.
   notify: Restart Apache2.
 #+END_SRC
 
-#+CAPTION: =roles_t/abbey-tvr/templates/mythweb.conf.j2=
+#+CAPTION: [[file:roles_t/abbey-tvr/templates/mythweb.conf.j2][=roles_t/abbey-tvr/templates/mythweb.conf.j2=]]
 #+BEGIN_SRC conf :tangle roles_t/abbey-tvr/templates/mythweb.conf.j2 :mkdirp yes
 #
 # Apache configuration directives for MythWeb.
@@ -3118,7 +3118,7 @@ rest are built up piecemeal by (tangled from) this document,
 This is much like the example (test) institutional configuration file,
 except the roles are found in =Institute/roles/= as well as =roles/=.
 
-#+CAPTION: =ansible.cfg=
+#+CAPTION: [[file:ansible.cfg][=ansible.cfg=]]
 #+BEGIN_SRC conf :tangle ansible.cfg
 [defaults]
 interpreter_python=/usr/bin/python3
@@ -3130,7 +3130,7 @@ roles_path=roles:Institute/roles
 ** =hosts=
 
 #+NAME: hosts
-#+CAPTION: =hosts=
+#+CAPTION: [[file:hosts][=hosts=]]
 #+BEGIN_SRC conf :tangle hosts
 all:
   vars:
@@ -3205,7 +3205,7 @@ all:
 This playbook provisions the entire network by applying first the
 institutional roles, then the liturgical roles.
 
-#+CAPTION: =playbooks/site.yml=
+#+CAPTION: [[file:playbooks/site.yml][=playbooks/site.yml=]]
 #+BEGIN_SRC conf :tangle playbooks/site.yml :mkdirp yes
 ---
 - name: Configure All
@@ -3272,7 +3272,7 @@ Liturgical sub-commands:
 
 The script begins with the following prefix and trampolines.
 
-#+CAPTION: =abbey=
+#+CAPTION: [[file:abbey][=abbey=]]
 #+BEGIN_SRC perl :tangle abbey :tangle-mode u=rwx,g=rx
 #!/usr/bin/perl -w
 #
@@ -3298,7 +3298,7 @@ Ansible does not implement a ~playbooks_path~ key, so the following
 code block "duplicates" the action of the institute's
 =check-inst-vars.yml=.
 
-#+CAPTION: =playbooks/check-inst-vars.yml=
+#+CAPTION: [[file:playbooks/check-inst-vars.yml][=playbooks/check-inst-vars.yml=]]
 #+BEGIN_SRC conf :tangle playbooks/check-inst-vars.yml
 - import_playbook: ../Institute/playbooks/check-inst-vars.yml
 #+END_SRC
@@ -3317,7 +3317,7 @@ a limit pattern.  For example:
 : ./abbey upgrade -n core
 : ./abbey upgrade '!front'
 
-#+CAPTION: =abbey=
+#+CAPTION: [[file:abbey][=abbey=]]
 #+BEGIN_SRC perl :tangle abbey
 
 if ($ARGV[0] eq "upgrade") {
@@ -3338,7 +3338,7 @@ if ($ARGV[0] eq "upgrade") {
 }
 #+END_SRC
 
-#+CAPTION: =playbooks/upgrade.yml=
+#+CAPTION: [[file:playbooks/upgrade.yml][=playbooks/upgrade.yml=]]
 #+BEGIN_SRC conf :tangle playbooks/upgrade.yml
 - hosts: all
   tasks:
@@ -3368,7 +3368,7 @@ if ($ARGV[0] eq "upgrade") {
 The script implements a ~reboots~ sub-command that looks for
 =/run/reboot-required= on all abbey managed machines.
 
-#+CAPTION: =abbey=
+#+CAPTION: [[file:abbey][=abbey=]]
 #+BEGIN_SRC perl :tangle abbey
 if ($ARGV[0] eq "reboots") {
   exec ("ansible-playbook", "-e", "\@Secret/become.yml",
@@ -3376,7 +3376,7 @@ if ($ARGV[0] eq "reboots") {
 }
 #+END_SRC
 
-#+CAPTION: =playbooks/reboots.yml=
+#+CAPTION: [[file:playbooks/reboots.yml][=playbooks/reboots.yml=]]
 #+BEGIN_SRC conf :tangle playbooks/reboots.yml
 ---
 - hosts: all
@@ -3396,7 +3396,7 @@ if ($ARGV[0] eq "reboots") {
 The script implements a ~versions~ sub-command that reports the
 operating system version of all abbey managed machines.
 
-#+CAPTION: =abbey=
+#+CAPTION: [[file:abbey][=abbey=]]
 #+BEGIN_SRC perl :tangle abbey
 if ($ARGV[0] eq "versions") {
   exec ("ansible-playbook", "-e", "\@Secret/become.yml",
@@ -3404,7 +3404,7 @@ if ($ARGV[0] eq "versions") {
 }
 #+END_SRC
 
-#+CAPTION: =playbooks/versarch.yml=
+#+CAPTION: [[file:playbooks/versarch.yml][=playbooks/versarch.yml=]]
 #+BEGIN_SRC conf :tangle playbooks/versarch.yml
 - hosts: all
   tasks:
@@ -3434,7 +3434,7 @@ machines hosting the DVR and TVR services.  It assumes each host sees
 the ~new_tz~ result registered by it in a previous play and not by the
 last host in the previous play.
 
-#+CAPTION: =abbey=
+#+CAPTION: [[file:abbey][=abbey=]]
 #+BEGIN_SRC perl :tangle abbey
 if ($ARGV[0] eq "tz") {
   my $city = `cat /etc/timezone`; chomp $city;
@@ -3446,7 +3446,7 @@ if ($ARGV[0] eq "tz") {
 }
 #+END_SRC
 
-#+CAPTION: =playbooks/timezone.yml=
+#+CAPTION: [[file:playbooks/timezone.yml][=playbooks/timezone.yml=]]
 #+BEGIN_SRC conf :tangle playbooks/timezone.yml
 ---
 - hosts: core, dvrs, tvrs
@@ -3500,7 +3500,7 @@ if ($ARGV[0] eq "tz") {
 
 ** Abbey Command Help
 
-#+CAPTION: =abbey=
+#+CAPTION: [[file:abbey][=abbey=]]
 #+BEGIN_SRC perl :tangle abbey
 my $ops = "config,new,old,pass,client,upgrade,reboots,versions";
 die "usage: $0 [$ops]\n";