2026-07-14 12:05:08 +02:00
[ build-system ]
# 77+ for PEP 639 SPDX `license = "..."` + `license-files`.
requires = [ "setuptools>=77" ]
build-backend = "setuptools.build_meta"
2026-07-14 11:27:49 +02:00
[ project ]
2026-07-14 11:56:29 +02:00
name = "linux-image-manager"
2026-07-21 19:09:25 +02:00
version = "2.2.0"
2026-07-14 12:05:08 +02:00
description = "CLI (`lim`) for downloading, verifying and flashing Linux images, LUKS/Btrfs encrypted storage (single drive and RAID1), image backups and chroot maintenance"
readme = "README.md"
2026-07-14 11:27:49 +02:00
requires-python = ">=3.10"
2026-07-14 12:05:08 +02:00
authors = [ { name = "Kevin Veen-Birkenbach" , email = "kevin@veen.world" } ]
maintainers = [ { name = "Kevin Veen-Birkenbach" , email = "kevin@veen.world" } ]
license = "GPL-3.0-only"
license-files = [ "LICENSE.txt" ]
urls = { Homepage = "https://veen.world" , Repository = "https://github.com/kevinveenbirkenbach/linux-image-manager" }
classifiers = [
"Environment :: Console" ,
"Operating System :: POSIX :: Linux" ,
"Programming Language :: Python :: 3" ,
]
2026-07-14 11:27:49 +02:00
dependencies = [ "PyYAML>=6" ]
2026-07-14 12:05:08 +02:00
[ project . scripts ]
lim = "lim.cli:main"
[ tool . setuptools . packages . find ]
include = [ "lim*" ]
[ tool . setuptools . package-data ]
2026-07-21 18:48:56 +02:00
lim = [
"distributions.yml" ,
"configuration/packages/**/*.txt" ,
"configuration/initcpio/*" ,
feat(image): distro-agnostic remote unlock via initramfs backends + Debian support
Split the mkinitcpio-only remote-LUKS-unlock path into an InitramfsBackend
ABC with a get_backend() dispatch, and add the initramfs-tools backend for
Debian / Raspberry Pi OS.
- base.py: six-step backend contract; encryption.py becomes a thin,
distro-neutral sequencer (get_backend by distribution).
- initramfs_tools.py: crypttab `none luks,initramfs`, cmdline rewritten to
root=/dev/mapper + ip=::::host:eth0:dhcp, dropbear-initramfs
authorized_keys, update-initramfs -k all (no build-host uname leak).
- shipped hooks (configuration/initramfs-tools/*): single-hop non-anonymous
onion, libnss DNS baking, sed-not-source DHCP, kill-tor-before-pivot.
- shared offline onion keygen in keygen.py; tor.py removed (logic moved to
mkinitcpio.py).
- raspios added to the apt distro family (session.py, raspberry.py).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 17:00:26 +02:00
"configuration/initramfs-tools/*" ,
2026-07-21 18:48:56 +02:00
]
2026-07-14 12:05:08 +02:00
2026-07-14 11:27:49 +02:00
[ tool . pytest . ini_options ]
testpaths = [ "tests" ]
[ tool . ruff ]
target-version = "py310"
line-length = 100
[ tool . ruff . lint ]
select = [ "ALL" ]
ignore = [
# This tool's UI is print/prompt based and its purpose is orchestrating
# system commands — these rules contradict the design:
"T201" , # print used as console UI
"S603" , # subprocess without shell is exactly what runner.py wraps
"S607" , # system tools are resolved via PATH on purpose
# Style choices:
"D203" , # conflicts with D211 (blank line before class docstring)
"D213" , # conflicts with D212 (multi-line docstring summary position)
"D1" , # docstrings are not required on every symbol
"COM812" , # trailing commas are handled by the formatter
"TRY003" , # exception messages are written inline
"EM101" , # literal exception messages are fine
"EM102" , # f-string exception messages are fine
]
[ tool . ruff . lint . per-file-ignores ]
"tests/*" = [
"S101" , # pytest asserts
"ANN" , # test signatures need no annotations
"PLR2004" , # literal expectations in assertions
"ARG" , # fixtures are injected even when unused
"SLF001" , # tests may exercise internal helpers directly
]