{% set page_title = 'Installed' %} {% include '_header.html' %}
| Type | Module | Version | From |
|---|---|---|---|
{{ origin.type_name }}
{%- if row.count %}
used by {{ row.count }} check{{ 's' if row.count != 1 else '' }}{#- The node path, not the check's name: the path is the thing the reader can go and look at, so each is a link to that node. -#}
|
{#- The loaded path under the module name, because the
version beside it is the installed metadata's claim:
a source copy earlier on the path shadows an
installed distribution of the same name, and then
the version is answering for code that is not
running. Exactly the case somebody reads this table
to diagnose, so the table shows both.
Against a root the reader has, not absolutely: the
diagnostic is *which root*, and nine tenths of an
absolute path is the same prefix on every row —
starting with somebody's home directory. The whole
string stays one hover away. -#}
{{ origin.module }}
{% if origin.path %} {{ origin.path | loaded_from }}{% endif %} |
{% if origin.version %}{{ origin.version }}{% else %}—{% endif %} | {% if origin.builtin %}built-in{% elif origin.distribution %}{{ origin.distribution }}{% else %}source{% endif %} |
| Package | Registers |
|---|---|
{{ row.origin.package }}
{% if row.origin.distribution %}· {{ row.origin.distribution }} {{ row.origin.version }}{% else %}· source{% endif %}
{%- if row.origin.path %}{{ row.origin.path | loaded_from }}{% endif %} |
{#- Each registration is one fact and must not break
across lines: "slot reason.actions" split after
"slot" reads as two entries, and the column is
narrow enough for that to happen. The list still
wraps *between* items — that is what the breaks
are for. -#}
{%- for item in row.registers %}
{{ item }}{% if not loop.last %} {% endif %} {%- endfor %} |
| Slot | Package | Template | Context | From |
|---|---|---|---|---|
{{ filler.slot }} |
{{ filler.package }} | {{ filler.template }} | {% if filler.context %}provider{% else %}—{% endif %} | {#- Which kind: a dependent package's registration, or the library's own declarative action list, which fills the same slots through the same seam (ADR-0038). Worth naming, because an operator looking here after adding a config action needs to see the difference between "mine" and "theirs". -#}{% if filler.builtin %}built-in{% else %}extension{% endif %} |
| Scheme | Package | Replaces | From |
|---|---|---|---|
{{ row.scheme }}:// |
{{ row.owner }} | {% if row.replaced %}{{ row.replaced }}{% else %}—{% endif %} | {% if row.builtin %}built-in{% else %}extension{% endif %} |
Registered configuration aspects:
{% for name, owner in extra_aspects %}config/{{ name }}{% if owner %} ({{ owner }}){% endif %}{% if not loop.last %}, {% endif %}{% endfor %}
| Door | Route | Provider | Package | Default |
|---|---|---|---|---|
{{ door.name }}{% if door.label != door.name %} ({{ door.label }}){% endif %} |
{{ door.route }} |
{{ door.provider_name }} | {{ door.owner }} | {% if door.default %}default{% else %}—{% endif %} |
{% if choosing_at_login %}
/login offers a choice of the doors above; an
unidentified request still goes to the default door.
{% else %}
/login is the default door's own login step.
{% endif %}
System admin: configured by {{ system_admin.keyword }}=
{%- if system_admin.reference %} ({{ system_admin.reference }}){% endif %},
{% if system_admin.available %}credential resolved.
{%- else %}credential unavailable — that door is
shut ({{ system_admin.problem }}).{% endif %}
No system-admin account is configured: this instance is reachable only through the doors above.
{% endif %}{{ csp_header }}
| Directive | Sources |
|---|---|
{{ directive }} |
{%- for source in sources %}
{{ source.value }}
({{ source.by }})
{%- if not loop.last %}{% endif %} {%- endfor %} |
img-src
on /links |
{%- for source in csp_links_sources %}
{{ source.value }}
({{ source.by }})
{%- if not loop.last %}{% endif %} {%- endfor %} |
{% if log.in_charge %}
The library's default is in charge of this log. The root logger
is at {{ log.root }}:
{%- if log.root_source == 'variable' %} the level LOG_LEVEL names.
{%- elif log.root_source == 'default' %} the default, since LOG_LEVEL names no level.
{%- else %} set by code, after the default was installed.
{%- endif %}
{% else %}
The application configured logging itself, so no level is the
library's to set: the root logger, at {{ log.root }},
is the application's, LOG_LEVEL does nothing, and no
declared cap is set.
{% endif %}
| Logger | Level | From |
|---|---|---|
{{ level.logger }} |
{{ level.level_name }} |
{#- Three sources and no fourth. A cap names every
package that declared one for the logger, each
with what its cap hides — two packages may bring
one dependency, the higher level stands, and the
page names both. An entry is printed as it would
be written. And *neither* is said as what it is:
the library cannot tell a level the deployment's
code set from one the dependency set on itself,
and a guess here would send somebody to the wrong
file. -#}
{%- if level.source == 'cap' %}
{%- for row in level.rows %}
cap, declared by {{ row.owner }}
{%- if row.level_name != level.level_name %} at {{ row.level_name }}{% endif %}
— hides {{ row.hides }}
{%- if not loop.last %}{% endif %} {%- endfor %} {%- elif level.source == 'variable' %} LOG_LEVEL entry {{ level.logger }}={{ level.level_name }}
{%- else %}
the application's code, or the dependency itself
{%- endif %} |
No logger carries a level of its own.
{% endif %} {% if capped %} {#- How a cap is lifted, with a logger of this instance in the example: a capped logger is asked for by name, and a line the reader can copy beats a rule they have to instantiate. The line is the variable as it was read with one entry more, so that pasting it changes one thing: every entry the variable has stays, and the bare level in front is its own, or the default's where it names none — not the root's as it stands, which code may have moved. The entry names the level the logger is at without its cap, which brings back what the cap hid and nothing below it. -#}
A capped logger's lines come back by name, at the next start:
LOG_LEVEL={{ log.variable }},{{ capped[0].shown_by }},
in .env or in the environment.
Declared caps that were not set:
| Logger | Cap | Declared by | Not set because |
|---|---|---|---|
{{ verdict.logger }} |
{{ verdict.level_name }} |
{%- for row in verdict.rows %}
{{ row.owner }}
{%- if row.level_name != verdict.level_name %} at {{ row.level_name }}{% endif %}
— hides {{ row.hides }}
{%- if not loop.last %}{% endif %} {%- endfor %} |
{{ verdict.reason }} |
Taken off by LOG_LEVEL:
{% for taken in log.taken_off -%}
{{ taken.level_name }} on {{ taken.logger }}, which the entry for {{ taken.entry }} speaks for
{%- if not loop.last %}; {% endif %}
{%- endfor %}.
Entries of LOG_LEVEL that could not be read, and were skipped:
{% for skipped in log.unreadable -%}
{{ skipped.entry }} ({{ skipped.why }})
{%- if not loop.last %}; {% endif %}
{%- endfor %}.