In my /opt/mailman/mm/var/templates/lists/ kictanet.lists.kictanet.or.ke/en/list:member:regular:footer.txt, I have:
Archived at: ${hyperkitty_url
I was hoping that variable would be replaced with what I see in this list, i.e. - Archived at: https://lists.mailman3.org/archives/list/mailman-users @mailman3.org/message/HX6NZKICL7V2QWE2V4YNKIMSMQHARPUV/
However, in my posts, it's blank.
What am I missing?
-- Best regards, Odhiambo WASHINGTON, Nairobi,KE +254 7 3200 0004/+254 7 2274 3223 In an Internet failure case, the #1 suspect is a constant: DNS. "Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-) [How to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html]
Washington Odhiambo via Mailman-users writes:
In my /opt/mailman/mm/var/templates/lists/ kictanet.lists.kictanet.or.ke/en/list:member:regular:footer.txt, I have:
Archived at: ${hyperkitty_url
First, I assume the unbalanced { is a typo.
Second, I don't think that is correct syntax for this flavor of template, it's just "$hyperkitty_url". (It might be OK, but this language is designed for an undelimited reference to the template variable.)
Third, there is no provision for that substitution in footers, as the substitions are a hard-coded list in the decorate() function in handlers/decorate.py. It is available in the Archived-At header field.
It wouldn't be hard to add, I suspect, but currently there is no protocol for an archiver to communicate its archived-at URL to the decorate function. There are generic callbacks for the Archived-At and List-Archive header fields, but those are simple lists and don't allow you to specify the particular archiver as $hyperkitty_url.
Steve
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
On Mon, Mar 2, 2026 at 1:56 PM Stephen J. Turnbull <steve@turnbull.jp> wrote:
Washington Odhiambo via Mailman-users writes:
In my /opt/mailman/mm/var/templates/lists/ kictanet.lists.kictanet.or.ke/en/list:member:regular:footer.txt, I have:
Archived at: ${hyperkitty_url
First, I assume the unbalanced
{is a typo.
Yes. That was a typo actually.
Second, I don't think that is correct syntax for this flavor of template, it's just "$hyperkitty_url". (It might be OK, but this language is designed for an undelimited reference to the template variable.)
Third, there is no provision for that substitution in footers, as the
substitions are a hard-coded list in the decorate() function in handlers/decorate.py. It is available in the Archived-At header field.
I have seen that in the footer for this MM3 users ML for ages. And my MM3 installation is new :)
It wouldn't be hard to add, I suspect, but currently there is no protocol for an archiver to communicate its archived-at URL to the decorate function. There are generic callbacks for the Archived-At and List-Archive header fields, but those are simple lists and don't allow you to specify the particular archiver as $hyperkitty_url.
How did @Mark Sapiro <mark@msapiro.net> add the footer to mailman-users@mailman3.org?
-- Best regards, Odhiambo WASHINGTON, Nairobi,KE +254 7 3200 0004/+254 7 2274 3223 In an Internet failure case, the #1 suspect is a constant: DNS. "Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-) [How to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html]
Washington Odhiambo via Mailman-users writes:
How did @Mark Sapiro <mark@msapiro.net> add the footer to mailman-users@mailman3.org?
Looking more carefully at decorate(), it does fetch the value of
archiver.permalink for the message, and place it in
d[f"{archiver.name}_url"], which should be d["hyperkitty_url"].
Have you tried using "$hyperkitty_url" instead of "${hyperkitty_url}"?
Steve
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
On Mon, Mar 2, 2026 at 3:41 PM Stephen J. Turnbull <steve@turnbull.jp> wrote:
Washington Odhiambo via Mailman-users writes:
How did @Mark Sapiro <mark@msapiro.net> add the footer to mailman-users@mailman3.org?
Looking more carefully at decorate(), it does fetch the value of archiver.permalink for the message, and place it in
d[f"{archiver.name}_url"], which should bed["hyperkitty_url"].Have you tried using "$hyperkitty_url" instead of "${hyperkitty_url}"?
I have now removed the curly braces. Let me see what follows.
-- Best regards, Odhiambo WASHINGTON, Nairobi,KE +254 7 3200 0004/+254 7 2274 3223 In an Internet failure case, the #1 suspect is a constant: DNS. "Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-) [How to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html]
On 3/2/26 05:03, Washington Odhiambo via Mailman-users wrote:
On Mon, Mar 2, 2026 at 3:41 PM Stephen J. Turnbull <steve@turnbull.jp> wrote: >>
Have you tried using "$hyperkitty_url" instead of "${hyperkitty_url}"?
I have now removed the curly braces. Let me see what follows.
That shouldn't matter. It should work with or without the curly braces.
Is there anything relevant in mailman.log? Does Mailman have permission to access /opt/mailman/mm/var/templates/lists/kictanet.lists.kictanet.or.ke/en/list:member:regular:footer.txt?
In the OP you said "in my posts, it's blank". Do you mean the entire footer is blank or is it just that ${hyperkitty_url} is replaced with nothing and the rest of the footer is OK?
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
On Mon, Mar 2, 2026 at 8:23 PM Mark Sapiro <mark@msapiro.net> wrote:
On 3/2/26 05:03, Washington Odhiambo via Mailman-users wrote:
On Mon, Mar 2, 2026 at 3:41 PM Stephen J. Turnbull <steve@turnbull.jp> wrote: >>
Have you tried using "$hyperkitty_url" instead of "${hyperkitty_url}"?
I have now removed the curly braces. Let me see what follows.
That shouldn't matter. It should work with or without the curly braces.
Is there anything relevant in mailman.log? Does Mailman have permission to access /opt/mailman/mm/var/templates/lists/ kictanet.lists.kictanet.or.ke/en/list:member:regular:footer.txt?
I will have to check the mailman.log. What should I look for? Right now it looks so clean - without anything to worry about.
Yes. all files in /optmailman/ are owned by mailman:mailman
In the OP you said "in my posts, it's blank". Do you mean the entire
footer is blank or is it just that ${hyperkitty_url} is replaced with nothing and the rest of the footer is OK?
Only the ${hyperkitty_url} is replaced with nothing.
I suppose there may be another way to get the end result, no?
-- Best regards, Odhiambo WASHINGTON, Nairobi,KE +254 7 3200 0004/+254 7 2274 3223 In an Internet failure case, the #1 suspect is a constant: DNS. "Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-) [How to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html]
On 3/2/26 10:13, Washington Odhiambo via Mailman-users wrote:
I will have to check the mailman.log. What should I look for? Right now it looks so clean - without anything to worry about.
I'm assuming the list's active archivers includes hyperkitty and that messages are archived there and messages from the list contain an appropriate Archived-AT: header. Is all that correct?
Are there Exception in "hyperkitty" archiver messages in mailman.log,
or if you have set a path: in the [logging.archiver] section of
mailman.cfg, in that file?
You could try in mailman shell
$ mailman shell -l list.example.com
Welcome to the GNU Mailman shell
Use commit() to commit changes.
Use abort() to discard changes since the last commit.
Exit with ctrl+D does an implicit commit() but exit() does not.
The variable 'm' is the list.example.com mailing list
>>> for archiver in IListArchiverSet(m).archivers:
... if archiver.system_archiver.name == 'hyperkitty':
... print(f'Enabled: {archiver.is_enabled}')
...
Enabled: True
>>>
and see if it prints Enabled: True.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
On 3/2/26 11:03, Mark Sapiro wrote:
Are there
Exception in "hyperkitty" archivermessages in mailman.log, or if you have set a path: in the [logging.archiver] section of mailman.cfg, in that file?
Actually, there won't be those messages. The code in question is <https://gitlab.com/mailman/mailman/-/blob/master/src/mailman/handlers/decora...>
The fact the ${hyperkitty_url} is replaced with an empty string
indicates that line 79 does not raise an exception but rather sets
archive_url to the empty string. This is the only way that the
replacement dictionary would contain the key hyperkitty_url and if it
didn't contain that key, the resultant footer would contain literally
${hyperkitty_url}
You could try in mailman shell
$ mailman shell -l list.example.com
Welcome to the GNU Mailman shell
Use commit() to commit changes.
Use abort() to discard changes since the last commit.
Exit with ctrl+D does an implicit commit() but exit() does not.
The variable 'm' is the list.example.com mailing list
>>> from mailman.email.message import Message
>>> msg = Message()
>>> msg['Message-ID'] = '<xxx@example.com>'
>>> for archiver in IListArchiverSet(m).archivers:
... if archiver.system_archiver.name == 'hyperkitty':
... print(f'URL: {archiver.system_archiver.permalink(m, msg)}')
...
This should print something like
URL: https://example.com/archives/list/list@example.com/message/FMB3KJSE74FUTZBVO...
Does it?
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
participants (3)
-
Mark Sapiro -
Stephen J. Turnbull -
Washington Odhiambo