Files
Igor 2046a78660 extensions: add @description headers and a list generator (#10534)
* extensions: add @description headers and a list generator

Add a one-line `# @description` header near the top of every extension in
extensions/ (85 files), each ~35-45 words / 3 sentences, source-verified
against the extension's actual behaviour. Two extensions with a dedicated
docs page also carry a `# @doc-page` link.

Add lib/tools/gen-extensions-list.py, which scans extensions/**/*.sh for
these headers and prints the Markdown extensions reference consumed by the
documentation repo. The list is no longer hand-maintained: edit an
extension's `# @description` and the generator brings the change over.

Signed-off-by: Igor Pecovnik <igor@armbian.com>

* extensions: correct descriptions flagged in review, validate @doc-page

Seven @description headers claimed more than the code does:

  cleanup-space-final-image  zerofree globs ${LOOP}p?, so p10+ is not covered
  image-output-abl           one recovery image from ABL_DTB_LIST[0], not per-DTB
  marvell-tools              binaries-marvell and cryptopp track branches, not pins
  nvidia                     also skipped without a working headers package
  odin2-preset-firstrun      ships hardcoded 1234 root/user passwords
  preset-firstrun            static networking is on by default, not optional
  uefi-edk2-rk3588           acpi=off is a default, not forced

Reword each to match, and call out the two credential hazards explicitly
rather than leaving them implied.

In the generator, restrict @doc-page to site-relative paths. The value goes
into a Markdown link target on the published docs site and Python-Markdown
does not sanitize URL schemes, so a "javascript:" target would survive into
the page; unusable values are now dropped with a warning on stderr.

Signed-off-by: Igor Pecovnik <igor@armbian.com>

* gen-extensions-list: close two holes in @doc-page validation

DOC_PAGE_RE accepted "//external.example/x". "/" is in the character class, so
after the required leading slash a second one matched happily -- the protocol-
relative case the comment claimed to reject sailed straight through. Add a
negative lookahead.

The annotation parser also matched a single \S+ token, so "@doc-page /guide
extra" and a bare "@doc-page" failed to match at all and were dropped in
silence, with no warning. Capture the whole value instead and let validation
reject it, so malformed annotations are reported rather than ignored.

Output over the current extensions/ tree is byte-identical.

Signed-off-by: Igor Pecovnik <igor@armbian.com>

---------

Signed-off-by: Igor Pecovnik <igor@armbian.com>
2026-08-26 19:14:35 +02:00

37 lines
2.3 KiB
Bash

# @description Installs the `photonicat-pm` DKMS power-management driver for the Ariaboard Photonicat router. Fetches the latest `HackingGate/photonicat-pm` release deb and builds the kernel module in the chroot, forcing `INSTALL_HEADERS=yes`. Requires a kernel with a working headers package and is skipped on kernels ≥ 6.20.
function extension_finish_config__install_kernel_headers_for_photonicat_pm_dkms() {
if [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]]; then
display_alert "Kernel version has no working headers package" "skipping photonicat-pm dkms for kernel v${KERNEL_MAJOR_MINOR}" "warn"
return 0
fi
declare -g INSTALL_HEADERS="yes"
display_alert "Forcing INSTALL_HEADERS=yes; for use with photonicat-pm dkms" "${EXTENSION}" "debug"
}
function post_install_kernel_debs__install_photonicat_pm_dkms_package() {
if linux-version compare "${KERNEL_MAJOR_MINOR}" ge 6.20; then
display_alert "Kernel version is too recent" "skipping photonicat-pm dkms for kernel v${KERNEL_MAJOR_MINOR}" "warn"
return 0
fi
[[ "${INSTALL_HEADERS}" != "yes" ]] || [[ "${KERNEL_HAS_WORKING_HEADERS}" != "yes" ]] && return 0
api_url="https://api.github.com/repos/HackingGate/photonicat-pm/releases/latest"
latest_version=$(curl -s "${api_url}" | jq -r '.tag_name')
# Get the Debian version from changelog
changelog_url="https://raw.githubusercontent.com/HackingGate/photonicat-pm/refs/tags/${latest_version}/debian/changelog"
debian_version=$(curl -s "${changelog_url}" | head -1 | grep -oP 'photonicat-pm \(\K[^)]+')
photonicat_pm_url="https://github.com/HackingGate/photonicat-pm/releases/download/${latest_version}/photonicat-pm-dkms_${debian_version}_all.deb"
if [[ "${GITHUB_MIRROR}" == "ghproxy" ]]; then
ghproxy_header="https://ghfast.top/"
photonicat_pm_url=${ghproxy_header}${photonicat_pm_url}
fi
photonicat_pm_dkms_file_name=photonicat-pm-dkms_${debian_version}_all.deb
use_clean_environment="yes" chroot_sdcard "curl -fsSL -o /tmp/${photonicat_pm_dkms_file_name} '${photonicat_pm_url}'"
display_alert "Install photonicat-pm packages, will build kernel module in chroot" "${EXTENSION}" "info"
declare -ag if_error_find_files_sdcard=("/var/lib/dkms/photonicat-pm*/*/build/*.log")
use_clean_environment="yes" chroot_sdcard_apt_get_install "/tmp/${photonicat_pm_dkms_file_name}"
use_clean_environment="yes" chroot_sdcard "rm -f /tmp/photonicat-pm*.deb"
}