Luke Granger-Brown
4a76db2401
dc460ec76cbf Remove obsolete libXrandr inputs from programs using winit (#354847) f1b26f503aac nitrokey-udev-rules: init at 1.0.0 (#352481) a4761c00db07 smartcat: 1.7.1 -> 2.1.0 (#354016) 60533322e317 protonvpn-gui: 4.6.0 -> 4.7.3 (#354170) ab599469897c yosys: 0.46 -> 0.47 (#354226) 736b36d5719f niri: 0.1.9 -> 0.1.10 (#355047) 547ac36fb30e spotify-player: 0.20.0 -> 0.20.1 (#354593) 6c3d0282c839 netbird: 0.30.2 -> 0.31.0 (#354756) fcfcc8e0f43d proton-ge-bin: GE-Proton9-18 -> GE-Proton9-20 (#354849) 2e3b9c403874 miriway: 24.09 -> 24.10.1 (#353939) c598a008a26b gfn-electron: init at 2.1.2 (#353887) fcf7e79c02e9 python312Packages.anthropic: 0.35.0 -> 0.39.0 (#354808) 9e9dc89f01d1 python312Packages.githubkit: 0.11.11 -> 0.11.14 (#354763) 3d7216f0da32 nzportable: init at 2.0.0-indev+20241012190425 (#312424) 1d4a687f62fc python312Packages.scikit-rf: 1.3.0 -> 1.4.1 (#354453) 566bf556282a typos: 1.26.0 -> 1.27.3 (#354980) 9a7641474d1c python312Packages.google-generativeai: 0.8.2 -> 0.8.3 (#354919) 76e387b03039 python312Packages.{localstack-ext,localstack}: fix build and refactor (#354962) d056782c98a1 python3Packages.globus-sdk: fix test (#354988) 1ce8fcbc506b hyprlandPlugins: update plugins (#355037) 43c84259fd1b python312Packages.tensorflow-probability: 0.24.0 -> 0.25.0 (#355007) 8c79491aea4c obsidian: remove white background from icons (#354945) b3057fce636d niri: add patch for scrolling without mouse config 97ca8ccb1551 nixos/roundcube: add example for `database.passwordFile` (#348166) f0b14e4fb4be niri: install dinit service files 172f0cee3628 python312Packages.wordcloud: 1.9.3 -> 1.9.4 (#355027) cf81310c69b9 prettypst: unstable-2023-12-06 -> unstable-2024-10-20 (#354972) 4d9d042055b6 cvise: 2.10.0 -> 2.11.0 (#354970) 7514add1990f python312Packages.google-ai-generativelanguage: 0.6.10 -> 0.6.12 (#354917) 66eab41e34dd python312Packages.tencentcloud-sdk-python: 3.0.1262 -> 3.0.1263 (#354909) 2ec42a007584 python312Packages.pyswitchbot: add pytest-asyncio (#354911) fa1b67747b3b ggshield: 1.32.2 -> 1.33.0 (#354912) 918a840f93bf python312Packages.reolink-aio: 0.10.4 -> 0.11.0b1 (#354910) f5c93dd4908f python312Packages.google-cloud-bigquery-logging: 1.4.5 -> 1.5.0 (#354918) 9e48e1749f0a python312Packages.soco: 0.30.5 -> 0.30.6 (#354943) 12569c191eb1 completely: 0.5.2 -> 0.6.3, move to by-name (#354974) 2049461e5435 python3Packages.protobuf4: disable tests that fail on 32bit (#354992) 3f42f0b61e6c linux-firmware: 20241017 -> 20241110 (#355130) 4c3539c70b79 linux-firmware: 20241017 -> 20241110 7ff8d0f160be vaultwarden: 1.32.3 -> 1.32.4 (#355129) 7d4246729b44 vaultwarden: 1.32.3 -> 1.32.4 e635cf8d9fb5 netsurf.browser: fix darwin builds (#355038) 8feb5e84c9e9 libskk: fix parse error (#355005) b71ccf87b23c gnuplot: fix build with `withTeXLive = true` (#352768) 96e1c83061ff pyamlboot.tests: fix the eval (#352825) 87e380382121 nix-unit: 2.24.0 -> 2.24.1 (#355104) f257cb5e5ee1 kubectl-graph: init at 0.7.0, add maintainer rksm (#348297) b3dc0d06fdad buck2: Add shell completions (#354758) 9d2100929da8 rapidfuzz-cpp: 3.0.5 -> 3.1.1 (#351052) 3f334c14975e scopehal-apps: darwin support (#354815) f03a58a929b4 roboto-flex: init at 3.200 (#353851) 5c1e2db52711 libnvme: 1.10 -> 1.11 (#352703) f94a3e0cd12e nix-unit: 2.24.0 -> 2.24.1 628110078b5c libdatachannel: 0.21.2 -> 0.22.2 (#350821) db0b0737bfdc obs-studio-plugins.obs-hyperion: patch stateChanged deprecation (#349326) b3c4badad7e2 roboto-flex: init at 3.200 5812399690b8 gcsfuse: 2.4.0 -> 2.5.1 (#351360) 771d3917283d azure-storage-azcopy: 10.26.0 -> 10.27.0 (#352775) a8489059c4eb signal-desktop: remove stdenv.cc.cc from runtimeDeps (#354924) f475d7505046 python3Packages.pywebview: build fix for tests (#353833) 5b27ef3c5495 pantheon.elementary-onboarding: 8.0.1 -> 8.0.2 (#354896) a0c28de3e7d7 phonemizer: fix build (#354946) 802cb21f2a2a python3Packages.us: switch to pyproject (#354950) 99ad7da9e313 nixosTests.frr: fix node.router.config warning (#354710) a44589e11da3 python312Packages.phonopy: 2.28.0 -> 2.29.1, fix build (#354523) cb9613de4c67 python312Packages.tskit: relax numpy build-time constraint, unbreak (#354512) bc1a933e128d evcc: 0.131.4 -> 0.131.5 (#355083) 20ee59317101 nixos/frigate: Set SyslogIdentifier for better log entries (#355088) 503b5b4c8cba rime-zhwiki: init at 20240909 (#354931) dac96aac49af nixos/frigate: Set SyslogIdentifier for better log entries 871087c18d34 nixos/acme: do not limit credentials functionality to DNS/S3 config (#348344) 8c164faef4d4 nixos/nextcloud-notify_push: fix defaultText rendering (#352479) 8209b0d9b9b0 netclient: 0.25.0 -> 0.26.0 (#354525) 96115f656695 python312Packages.pytest-flake8: 1.2.2 -> 1.3.0 (#354743) 6b5935539883 texlivePackages.xetex: force XeTeX to use fontconfig on Darwin (#354963) 32e064f48c2b evcc: 0.131.4 -> 0.131.5 1593115346ba piano-rs: init at 0.2.0 (#336405) a67e90c4928a wibo: 0.4.2 -> 0.6.14 (#291723) 5b74eb9b909e scopehal-apps: darwin support 71734a22978f pypy3Packages.home-assistant-chip-clusters: fix the eval (#355051) ab58dcfaf4c5 maintainers/README: add guidelines for committers (#351744) 95855a90f9d0 aquamarine: 0.4.3 -> 0.4.4 (#355030) 34ed0c9cc1bb scarab: Apply scaling factor in Wayland (#348427) ae725bafb39b python312Packages.debugpy: 1.8.7 -> 1.8.8 (#354925) eba346ebfead teamspeak3: modernise (#354161) 673033d742b2 yubioath-flutter: 7.1.0 -> 7.1.1 (#352448) 8f0c9853d549 pypy3Packages.home-assistant-chip-clusters: fix the eval e80622178221 niri: 0.1.9 -> 0.1.10 8aed22ecd71e quarto: 1.6.30 -> 1.6.33 and apply patch (#354672) 0198cfb7673a hyprlandPlugins.hyprsplit: 0.44.1 -> 0.45.0 f3f9fcf93c8d hyprlandPlugins.hyprspace: 0-unstable-2024-09-16 -> 0-unstable-2024-11-02 cbc60c36101f hyprlandPlugins.hyprscroller: 0-unstable-2024-10-10 -> 0-unstable-2024-11-09 d9e2143b3e56 hyprlandPlugins.hyprgrass: 0.8.2 -> 0.8.2-unstable-2024-10-30 9739ac3afe95 hyprlandPlugins.hyprfocus: 0-unstable-2024-05-30 -> 0-unstable-2024-10-09 7804dcce6c5b hyprlandPlugins.hypr-dynamic-cursors: 0-unstable-2024-10-10 -> 0-unstable-2024-11-10 7c6c04825999 hyprlandPlugins/hyprland-plugins: 0.44.0 -> 0.45.0 e2b798c525ac hyprlandPlugins.hy3: 0.44.0 -> 0.45.0 e575fc8ffa4b hyprland: 44.1 -> 45.0 (#354900) 62d3c4fb592b netsurf.browser: fix darwin builds 0ef26b5dd615 Merge: Linux Hardened Kernel Updates for 2024-11-10 (#355023) a6f2dfc2572d pylyzer: 0.0.69 -> 0.0.70 (#354954) 91333a0e6dcd team-list: establish java team (#352938) 6b0d4d7f4e8e aquamarine: 0.4.3 -> 0.4.4 3024a6807634 python3Packages.subliminal: mark as not broken (#353672) fa1ebbeeff0a python312Packages.wordcloud: 1.9.3 -> 1.9.4 4fee2cde561f brave: 1.71.121 -> 1.71.123; refactor and nixfmt-rfc-style (#354114) 44bbe5ddad08 nixos/{boinc,guix}: Use exec to start the payload binary of the service (#297526) 9bd781e73301 linux/hardened/patches/6.6: v6.6.59-hardened1 -> v6.6.60-hardened1 3b3ea3ac4b03 linux/hardened/patches/6.11: v6.11.6-hardened1 -> v6.11.7-hardened1 d9b6a745b265 linux/hardened/patches/6.1: v6.1.115-hardened1 -> v6.1.116-hardened1 c367b19a22b7 linux/hardened/patches/5.4: v5.4.284-hardened1 -> v5.4.285-hardened1 fc9089929ad5 linux/hardened/patches/5.15: v5.15.170-hardened1 -> v5.15.171-hardened1 edb9a963e6ea linux/hardened/patches/5.10: v5.10.228-hardened1 -> v5.10.229-hardened1 8db0ec767e6d home-assistant-custom-components.better_thermostat: 1.6.0 -> 1.6.1 (#355021) 2544da75c5bf home-assistant-custom-lovelace-modules.dirigera_platform: init at 2.6.4 (#350542) 799b1af3b445 cfn-nag: fix gemfile so that binaries are generated (#353735) 8339db676638 home-assistant-custom-components.better_thermostat: 1.6.0 -> 1.6.1 9e1f7a1fc712 libvirt: 10.5.0 -> 10.9.0 (#353684) 6977c6b6c48e piano-rs: init at 0.2.0 e4c62c1fc494 pylyzer: 0.0.69 -> 0.0.70 fd214590b6ac rime-zhwiki: init at 20240909 f5f87e7240f5 dashy-ui: init at 3.1.1-unstable-2024-07-14 (#349149) 08e65e669ae3 python312Packages.tensorflow-probability: 0.24.0 -> 0.25.0 608a4a6e7042 libsForQt5.accounts-qml-module,lomiri.*: Enable qdoc docs (#352601) f4a76ebd1330 waylock: 1.2.1 -> 1.3.0 (#354685) 6eafb43ca667 python312Packages.androidtv: 0.0.74 -> 0.0.75 (#354948) 926dbc8e1c6a jasp-desktop: add patch to fix crash when using qt 6.8 (#352505) 60190159408f gfn-electron: init at 2.1.2 9a333460f50c Merge: postgresql: improve passthru.tests (#352966) 0598c612417e python312Packages.bsdiff4: 1.2.4 -> 1.2.5 (#352452) d40ed47baac0 python312Packages.pyftgl: fix build on darwin; fix source; refactor and modenize (#354973) d77a2129f3e2 zed-editor: make node-based built-in LSPs work on NixOS (#354063) 4e73fc3d5304 release: block on `aarch64` on `*-darwin` channels (#262038) 37c3c1a32edf python312Packages.morecantile: 5.4.2 -> 6.0.0 (#349069) 43544b405735 containerlab: 0.58.0 -> 0.59.0 (#353113) 3e9874330416 regripper: update-2023-07-23 -> 0-unstable-2024-11-02 (#353377) 88b78b3d1881 gtree: 1.10.11 -> 1.10.12 (#354521) 83d30478782d python312Packages.kornia: 0.7.3 -> 0.7.4 (#354350) 93472981d1ff nest-cli: 10.4.5 -> 10.4.7 (#354452) 886b26bad3d5 vassal: 3.7.14 -> 3.7.15 (#354462) b1d782c6fbb9 kube-state-metrics: 2.13.0 -> 2.14.0 (#354503) 3e3d0f2c68cf openlibm: 0.8.3 -> 0.8.4 (#354964) 38ed0b172a2e compose2nix: 0.2.3 -> 0.3.1 (#354858) c8af02ff2edb kine: 0.13.2 -> 0.13.3 (#354916) 3a92760aa3f9 stardust-xr-kiara: 0-unstable-2024-07-07 -> 0-unstable-2024-07-13 (#354775) b6077e3f6067 python312Packages.dinghy: 1.3.2 -> 1.3.3 (#354801) 84db55f55e00 erg: 0.6.45 -> 0.6.47 (#354818) d932f3609c38 python312Packages.xml2rfc: 3.23.2 -> 3.24.0 (#354827) cb0631fce111 dotenvx: 1.14.2 -> 1.22.0 (#354838) 1c7bb9a36ff7 jan: 0.5.6 -> 0.5.7 (#354845) 9dcf68f72882 pik: 0.9.0 -> 0.10.0 (#354901) 85a894514e94 dbmate: 2.21.0 -> 2.22.0 (#354985) 77c379fc15b1 maintainers/README: add guidelines for committers aebe24954483 ox: 0.6.7 -> 0.6.10 (#354280) 2b05865a6fa6 glfw3: added vulkan support (#354761) 72d2fc0fe01c python312Packages.polars: 1.7.1 -> 1.12.0 (#354656) 57fa23936966 python3Packages.globus-sdk: fix test 4b239e8fff18 python3Packages.globus-sdk: add bot-wxt1221 as maintainers 2b76729d1341 python312Packages.aiogram: 3.13.1 → 3.14.0 (#354881) 3bfe9c23d14e clickhouse-backup: 2.6.2 -> 2.6.3 (#354882) 67e295df4455 python312Packages.chess: 1.11.0 -> 1.11.1 (#354892) 123c88831bff komga: 1.14.0 -> 1.14.1 (#354826) 57fb3a800a9a xml2rfc: 3.23.2 -> 3.24.0 (#354829) c9ba25afb896 go-mockery: 2.46.0 -> 2.46.3 (#354844) 9d40f67872f2 octoprint: 1.10.2 -> 1.10.3 (#354848) 1d2941554a10 dbmate: 2.21.0 -> 2.22.0 45f61aa9a947 python312Packages.stravalib: 2.0 → 2.1 (#354851) e01ca8d232a0 wit-bindgen: 0.33.0 -> 0.34.0 (#354853) 090349a58995 nwg-drawer: 0.5.0 -> 0.5.2 (#354856) a7fcea08bca8 miriway: 24.09 -> 24.10.1 8025d6d17bcd typos: 1.26.0 -> 1.27.3 da9757048d7d buck2: Use stdenvNoCC 982ff0b08e25 buck2: Install completions for bash and zsh 8213a8a557f8 surreal-engine: init at 0-unstable-2024-11-08 (#337069) 6d4ddefd7161 positron-bin: fix darwin not unpacking the dmg (#354846) 494908f0fe86 python312Packages.localstack: fix build and refactor 54394a0c0b71 python312Packages.localstack-ext: fix build and refactor 5b916fd89714 nixos/openvpn3: add `/etc/openvpn3/configs` to `systemd.tmpfiles` (#353832) 822590d06248 python3Packages.protobuf4: disable tests that fail on 32bit e9c53bdf9a56 nixos/localsend: add package option & allow udp port (#333485) da404cffefb6 vgmtrans: init at 1.2, libbassmidi: init at 2.4.15.3 (#321129) 551bd11c42de python312Packages.pyftgl: refactor and modenize beceecb51336 python312Packages.pyftgl: fix source 8618fe6f96b9 python312Packages.pyftgl: fix build on darwin 9828bad63a49 completely: 0.5.2 -> 0.6.3 8f8f60bee8e5 cvise: 2.10.0 -> 2.11.0 66c47da4338c prettypst: unstable-2023-12-06 -> unstable-2024-10-20 88b620a72b65 completely: move to by-name 00cd61f517aa cartridges: 2.9.3 -> 2.10.1 (#354306) 6cd1dd3dc5e6 vscode-extensions.esbenp.prettier-vscode: 10.4.0 -> 11.0.0 (#335742) f7911fc460e9 vscode-extensions.continue.continue: 0.8.44 -> 0.8.54 (#342514) f69f13279107 vscode-extensions.sainnhe.gruvbox-material: init at 6.5.2 (#350464) e065e550b153 python3Packages.us: add bot-wxt1221 as maintainers ef21cc74e2f1 python3Packages.us: switch to pyproject 925510d32cab vscode-extensions.streetsidesoftware.code-spell-checker: 4.0.14 -> 4.0.15 (#353989) dbb60b6319f3 vscode-extensions.shd101wyy.markdown-preview-enhanced: 0.8.14 -> 0.8.15 (#354447) f696e0dc331c crates-tui: init at 0.1.20 (#354307) 46bbcb7efef5 vgmtrans: init at 1.2 07ca74e13487 teamviewer: add services.teamviewer.package Option + misc improvemens (#346365) fc94ad90fb0e phonemizer: add bot-wxt1221 as maintainers 42be8c49fb89 phonemizer: fix build 1531e7712628 typos-lsp: 0.1.27 -> 0.1.30 (#354872) e19b3c8cd386 python312Packages.netifaces2: init at 0.0.22 (#354736) fc1d56201e17 openlibm: 0.8.3 -> 0.8.4 b306e97ffe30 Libreoffice updates (#354456) 62fa59a63947 doc: revise Darwin SDK documentation (#353439) 29ba5b9a2985 xcodes: 1.5.0 -> 1.6.0, move to `by name`, `with lib;` cleanup, RFC format (#354932) eee079f7e129 xcodes: nix-rfc-format b45f61402b8a xcodes: with lib; cleanup 7531c8e01dc8 xcodes: 1.5.0 -> 1.6.0 3912015f1d0d python312Packages.androidtv: 0.0.74 -> 0.0.75 d420f2c9502f maintainers: add llakala (#354625) 757189b3e6b0 vscode-extensions.ms-windows-ai-studio.windows-ai-studio: init at 0.6.1 (#354817) 214d9423dca6 python312Packages.langgraph: Use correct test directory (#354345) 647624dca6a1 wine-discord-ipc-bridge: unstable-2023-08-09 -> 0.0.3 (#353900) 4c78072d2f27 python312Packages.guidata: 3.6.3 -> 3.7.1 (#354168) 3efeb317473e git-warp-time: init at 0.8.4 (#354046) 35305f29a7e3 xar: fix Linux build on staging-next (#352507) 01ddc69668f5 obsidian: remove white background from icons 903f42960df7 fishPlugins.*: fix versions (#354729) b0b3a70891e6 buildFHSEnv: use LOCALE_ARCHIVE from environment if present (#354899) c188d417cf07 python312Packages.soco: 0.30.5 -> 0.30.6 d3cba66b117d python312Packages.millheater: 0.11.8 -> 0.12.0 (#354797) 4af121e6ac0f ov: 0.36.0 -> 0.37.0 (#354807) 96e67743abd9 ox: switch to the new darwin sdk pattern 992c80c02e1f ox: 0.6.7 -> 0.6.10 757df4a1b42e xcodes: move to by-name ae21c33fafab python312Packages.debugpy: 1.8.7 -> 1.8.8 1bd58487d015 python312Packages.scikit-rf: 1.3.0 -> 1.4.1 343b0a222530 adolc: modernize; fix clang build (#354642) 27235e1e6da6 python312Packages.google-generativeai: 0.8.2 -> 0.8.3 1e6362fe068f python312Packages.google-ai-generativelanguage: 0.6.10 -> 0.6.12 9d3096074f3e vale: 3.8.0 -> 3.9.0 (#354444) 9e960c976873 python312Packages.google-cloud-bigquery-logging: 1.4.5 -> 1.5.0 16107665062c dolphin-emu-primehack: 1.0.6a -> 1.0.7a, qt5 -> qt6, unpin fmt (#350053) b3765ba04029 d2: 0.6.7 -> 0.6.8 (#354459) 012a679db0f8 python312Packages.stripe: 11.1.0 -> 11.2.0 (#354852) 6ffb12c9f9c3 kine: 0.13.2 -> 0.13.3 27a103786c88 doc/hooks/aws-c-common: init (#351394) 660022ee302b newlib: enable parallel build (#354520) acf406372cf8 linux_xanmod, linux_xanmod_latest: 2024-11-08 (#354617) ab244d13144a python312Packages.aiogram: update disabled bb00b359cce7 ggshield: 1.32.2 -> 1.33.0 b39ea623743c python312Packages.tencentcloud-sdk-python: 3.0.1262 -> 3.0.1263 4c4420b29b66 python312Packages.pyswitchbot: add pytest-asyncio b1d0a1aafff5 python312Packages.reolink-aio: 0.10.4 -> 0.11.0b1 465eab85d222 python312Packages.playwrightcapture: 1.26.3 -> 1.27.0, python312Packages.lacuscore: 1.11.3 -> 1.12.0 (#353963) 85c8b5ba7879 esphome: 2024.10.2 -> 2024.10.3 (#354880) c00d32f28515 beszel: init at 0.6.2 (#345444) 652fd5119056 pik: 0.9.0 -> 0.10.0 a59e625bb474 buildFHSEnv: use LOCALE_ARCHIVE from environment if present f8a4abdc2ed1 python312Packages.pytest-flake8: 1.2.2 -> 1.3.0 e20360e289da leo-editor: 6.8.1 -> 6.8.2 (#354519) eacbe35bf009 python312Packages.babelfont: 3.0.5 -> 3.0.6 (#354574) 72a790c6fc77 prusa-slicer, super-slicer, mediathekview: remove Moredread as mainta… (#354794) de131566b6e4 gh-dash: 4.7.0 -> 4.7.1 (#354813) 12fe26865622 python312Packages.magic-wormhole-transit-relay: 0.3.1 -> 0.4.0 (#354726) 176eb0a3d99e doc/hooks/aws-c-common: init 8df19efae58d kubelogin-oidc: 1.30.1 -> 1.31.0 (#353577) f0000fe56d08 lib/minver: bump to 2.3.17 (#354586) 09efcc6e4be9 libvirt-glib: relax max stack size limit f91d2228a0b7 pantheon.elementary-onboarding: 8.0.1 -> 8.0.2 74d1b07edbf2 htcondor: 23.10.1 -> 24.1.1 (#353342) 28f456e3131c GNOME updates 2024-11-05 (#353824) 59ed3fa2c48d scarab: Apply scaling factor in Wayland 0a0d12f6626d gtree: 1.10.11 -> 1.10.12 1a4eb8b7a96e libnvme: 1.10 -> 1.11 35110b71bd78 azure-storage-azcopy: 10.26.0 -> 10.27.0 464b1e80245f maintainers: add llakala d1444b4947b4 python312Packages.chess: 1.11.0 -> 1.11.1 08c2eb8e894e nest-cli: 10.4.5 -> 10.4.7 061f86ca2988 vassal: 3.7.14 -> 3.7.15 ca3eca77cd85 gcsfuse: mark as broken on darwin 64b28c617d26 gcsfuse: 2.4.0 -> 2.5.1 2ff82ba8deea libdatachannel: 0.21.2 -> 0.22.2 8ff9d62e81f6 yubioath-flutter: 7.1.0 -> 7.1.1 b49da1f76456 scarab: Remove unused inputs df10ec72acee mysql-shell: add libutil on darwin; refactor to new SDK pattern (#354735) b9c73c537391 python311Packages.tsfresh: fix build on darwin (#354667) ae7f0eebdb3b python311Packages.qutip: relax numpy build-time constraint, unbreak (#354592) 6e82927b9473 python312Packages.phonopy: 2.28.0 -> 2.29.1, fix build dde8f5051682 bsc: remove axv2 when building on non x86 system (#354473) 55242bf389de hyprland: 44.1 -> 45.0 97a1ad0df003 tulip: fix build (#354236) b322800344d5 python312Packages.rapidfuzz: 3.10.0 -> 3.10.1 ff18a1b2578d rapidfuzz-cpp: 3.0.5 -> 3.1.1 0dc5bb1584a5 mesonlsp: 4.3.5 -> 4.3.7 (#345407) 7135b364b6e3 brave: 1.71.121 -> 1.71.123 301751f1c1bb brave: format with nixfmt-rfc-style d037904ba3ed brave: refactor package.nix to allow more architectures e3d50903923e hickory-dns: 0.25.0-alpha.2 -> 0.25.0-alpha.3 (#354793) b83eab78d7ec libvirt: increase timeout on darwin b5aaa1df2248 python312Packages.redis-om: 0.3.2 -> 0.3.3 (#354393) a96052fe5ffb virt-manager: disable testCLI0263virt_xml df6ffb01522b perlPackages.SysVirt: 10.2.0 -> 10.9.0 e6f77dadc335 python312Packages.libvirt: 10.5.0 -> 10.9.0 69119368fdc5 libvirt: 10.5.0 -> 10.9.0 ed887863a6d6 clickhouse-backup: 2.6.2 -> 2.6.3 06486aa31e8c python312Packages.aiogram: 3.13.1 → 3.14.0 7f76ced7336f nixos/dashy: init module 60bc80aa5cd7 dashy-ui: 3.1.1-unstable-2024-07-14 ec1f3c7390de wttrbar: 0.10.6 -> 0.11.0 (#354778) 372f9fa1b449 esphome: 2024.10.2 -> 2024.10.3 1546e0871c1d nomad_1_9: 1.9.0 -> 1.9.2 (#354300) 3cebba8819f4 spotify-player: 0.20.0 -> 0.20.1 3a83ddd0062b vimPlugins.neoconf-nvim: add dependencies (#354673) e6ffd9960ec9 python3Packages.{mirakuru,pgsanity}: fix builds (#354774) 8bee32d8bfa3 maintainers: add caperren 06be8564e527 immich: 1.119.1 -> 1.120.1 (#354083) 6648da3db4c4 darwin.openwith: remove apple_sdk.frameworks (#354766) bbdf7817f839 wibo: 0.4.2 -> 0.6.14 a329ca6aea6e immich: unvendor exiftool ee1cffa25c45 immich: 1.119.1 -> 1.120.1 d6899545c5bf typos-lsp: 0.1.27 -> 0.1.30 73e03e065ec8 luaPackages.toml-edit: 0.6.0 -> 0.6.1 2b3acacf0856 pyton312Packages.arelle: 18.3 -> 2.30.25, unbreak, refactor (#337284) d55bf75cb9fe python312Packages.uuid6: fix package version metadata (#354857) 5e5ec22c6f3d skia: unbreak darwin (#354557) c00cc16b63b0 home-assistant-custom-components.moonraker: 1.3.7 -> 1.4.0 (#354863) 93a01b05975a teamspeak3: drop 'arch' variable 2ad379b1c350 panoply: 5.5.4 -> 5.5.5 (#354771) 10a4498042d9 home-assistant-custom-components.moonraker: 1.3.7 -> 1.4.0 c48cd19fe52a python312Packages.uuid6: fix package version metadata 25628a6ed53a python3Packages.{consonance,yowsup}: fix build; refactor (#354690) 3bb8fc0f8844 compose2nix: 0.2.3 -> 0.3.1 e4ea814f0c8e teamspeak3: avoid `with lib;` 585c5ae3bcfa teamspeak3: remove NIX_REDIRECTS 4d98fc18e856 teamspeak3: rename from teamspeak_client 05eff5c687c1 python3Packages.torch: switch to apple-sdk_13 (#351778) e5017770eb89 teamspeak_client: run installer script without -x by default 2568cfa34889 teamspeak_client: install to opt/ subdirectory 3830a3dbf641 teamspeak_client: modernise installPhase 49a5c6431cb9 teamspeak_client: remove unnecessary dependencies 9db530c94c90 teamspeak_client: use autoPatchelfHook rather than manual patchelf cba4002e45b3 teamspeak_client: refactor libquazip patching 1a5940c3e8b3 teamspeak_client: use wrapQtAppsHook 56a739f756c9 teamspeak_client: make libredirect a regular runtimeDep 0f029a19c62b teamspeak_client: run phase hooks cdd40cb89c34 teamspeak_client: refactor QT deps c056c7dd7a11 teamspeak_client: use regular libcxx f3840380fd31 teamspeak_client: don't wrap with cc's libdir 168a80a4eaea nwg-drawer: 0.5.0 -> 0.5.2 e3893e5c3c76 python312Packages.python-axolotl-curve25519: fix build (#354706) 031786067bea slint-lsp: remove obsolete libXrandr input e70954dca60d alacritty: remove obsolete libXrandr input 3690e2cfea0d python312Packages.mypy-boto3-*: updates (#354714) 414bf9701593 python312Packages.chromadb: 0.5.17 -> 0.5.18 (#354715) ce51df0a5ba5 python312Packages.gehomesdk: 0.5.28 -> 0.5.29 (#354716) cec3c09abdec cnspec: 11.28.1 -> 11.29.0 (#354722) 8bfbd4e1f8d3 python312Packages.cyclopts: 2.9.9 -> 3.0.0 (#354719) b003bd16857f wit-bindgen: 0.33.0 -> 0.34.0 32cd6d84d744 python312Packages.msgraph-sdk: 1.11.0 -> 1.12.0 (#354816) 63a139ae1c3c python312Packages.millheater: refactor bcbe1d7185f3 python311Packages.angr: 9.2.126 -> 9.2.127 (#354742) 92e125410c20 python312Packages.stripe: 11.1.0 -> 11.2.0 acc043c769ce python312Packages.stravalib: 2.0 → 2.1 43fa5ea2c9aa sketchybar-app-font: 2.0.25 -> 2.0.27 (#354779) 8540b13b1d20 josm: 19230 → 19253 (#354506) f8486a3f1d9c vscode-extensions.sourcery.sourcery: 1.23.0 -> 1.24.0 (#354612) d87258ad94bd python311Packages.pymc: fix hash (#354840) 13c119bf1a64 .github: Add a "Module requests" issue template (#342713) 2212fad7704e laravel: 5.8.3 -> 5.9.2 (#354696) ebc1473d52f3 octoprint: 1.10.2 -> 1.10.3 d429e8592fb8 python312Packages.wtforms: 3.1.2 -> 3.2.1 (#350180) da39eb7dd037 treewide: use dontCargo{Build,Check,Install} (#354024) 0120ed5ea9f1 ruffle: remove obsolete libXrandr input 77c0b0b54457 halloy: remove obsolete libXrandr input 68d10c6cc3bb cosmic-term: remove obsolete libXrandr input 86d824132693 cosmic-edit: remove obsolete libXrandr input f641f65b03b4 chiptrack: init at 0.3.1 (#320790) d91e9dd0faa5 cosmic-comp: remove obsolete libXrandr input a0bc021caebf coppwr: remove obsolete libXrandr input 2dcf8afc6007 aider-chat: add playwright version (#354796) 499926182ad1 positron-bin: fix darwin not unpacking the .dmg 3d3185b49655 proton-ge-bin: GE-Proton9-18 -> GE-Proton9-20 52c3ce5d48fe qownnotes: 24.9.8 -> 24.11.1 (#354770) 7cb44f20f6b3 zed-editor: make node-based built-in LSPs work on NixOS 658a8762ea0d jan: 0.5.6 -> 0.5.7 b2f43234a2c3 adolc: fix clang build 5186ad13f487 adolc: modernize c880f1f46bfe adolc: format f3cced0b682e python312Packages.pyosmium: 4.0.1 -> 4.0.2 (#354831) a806a3b2e597 python311Packages.pymc: fix hash 9a695a958884 go-mockery: 2.46.0 -> 2.46.3 1cd03b9a6446 dotenvx: 1.14.2 -> 1.22.0 50cff47c417c bootterm: init at 0.5 (#352951) 0927ff824cde python3Packages.rioxarray: 0.17.0 -> 0.18.1 (#354630) e42a71a5de98 krabby: 0.2.0 -> 0.2.1 (#354812) df1e170e33c5 python312Packages.pyosmium: 4.0.1 -> 4.0.2 92c3f8cf92c0 wasmer: 5.0.0 -> 5.0.1 (#354116) 8ac37da4f6ed xml2rfc: 3.23.2 -> 3.24.0 7ecad5abbd99 maintainers: add therealgramdalf fe17e8dfaa6b python312Packages.xml2rfc: 3.23.2 -> 3.24.0 b323e1c5c4e2 komga: 1.14.0 -> 1.14.1 c04d7170e047 team-list: establish java team 8b2a02dc9de8 vscode-extensions.ms-windows-ai-studio.windows-ai-studio: init at 0.6.1 146c62ba33a4 vscode-extensions.ms-vscode-remote.vscode-remote-extensionpack: init at 0.26.0 5c44f6f77c96 nanoflann: 1.6.1 -> 1.6.2 (#354423) 21069db14d33 python312Packages.weblate-language-data: 2024.8 -> 2024.13 b71a8b49f59b live-server: 0.8.0 -> 0.9.0 (#354395) f5e91559fddc python312Packages.cmsdials: 1.3.0 -> 1.4.0 (#354397) 286db1ef230d wasmtime: 26.0.0 -> 26.0.1 (#354412) 939318029769 erg: 0.6.45 -> 0.6.47 45cef36e39b2 nixosTests.postgresql: run nixfmt 128244b59818 nixosTests.postgresql: use a common pattern throughout all tests 9035573855d9 nixosTests.postgresql: move all postgresql related nixosTests into one folder db2d6a00abe5 postgresqlPackages.anonymizer: make passthru.tests work with correct package 23c19a255fab postgresqlPackages.timescaledb: make passthru.tests work with correct package 6d7da20a9044 postgresqlPackages.tsja: make passthru.tests work with correct package a5c41ae80a2f postgresqlPackages.pgvecto-rs: make passthru.tests work with correct package 0af934adf740 postgresqlPackages.pgjwt: make passthru.tests work with correct package ecffab1fdaf8 postgresqlPackages.postgis: move nixosTests.postgis into package aded718a9824 postgresqlPackages.apache_datasketches: move nixosTests.apache_datasketches into package 139c5466764b postgresql: add passthru.tests.postgresql-tls-client-cert f6c2de926290 postgresql: add passthru.tests.postgresql 319d82d5c218 nixosTests.postgresql-wal2json: avoid manual imports 65ef7381c8d7 nixosTests.postgresql-jit: avoid manual imports a1ae4377e090 nixosTests.postgresql-wal-receiver: avoid manual imports 75d51c588914 postgresqlVersions: init d3feaaebea18 nixosTests.pgjwt: fix test e2636cf342ea python312Packages.msgraph-sdk: 1.11.0 -> 1.12.0 3bf6a063b3c7 Merge: postgresqlPackages: fix some builds on darwin (#354748) 059fc0f2dea1 gh-dash: 4.7.0 -> 4.7.1 8f55df5aa879 krabby: 0.2.0 -> 0.2.1 f11b5ff8a21a Merge: pg-dump-anon: use latest postgresql available (#354526) 0a7544a42300 python312Packages.anthropic: 0.35.0 -> 0.39.0 b01d3ee0239c python312Packages.polars: 1.9.0 -> 1.12.0 8f3dad550fd1 python312Packages.lacuscore: 1.11.3 -> 1.12.1 446aa3f0b262 python312Packages.playwrightcapture: 1.26.3 -> 1.27.0 635e9d2ebb5b sile: switch to the zstd based source 172cb3ef53e1 openpgp-card-tools: Add shell completions and man pages (#354287) 91e4660ed8fc git-warp-time: init at 0.8.4 d60f27f889da ov: 0.36.0 -> 0.37.0 b35c45a2c174 python312Packages.imap-tools: 1.7.3 -> 1.7.4 (#354754) 31aa6f6edf2b python312Packages.nice-go: 0.3.9 -> 0.3.10 (#354750) bba140c5a34b python312Packages.free-proxy: 1.1.2 -> 1.1.3 (#354539) c61adda6befd python312Packages.dinghy: 1.3.2 -> 1.3.3 6430e02e54ef cotp: 1.9.1 -> 1.9.2 (#354558) 9139ad63f22f granted: 0.36.0 -> 0.36.1 (#354572) 275614510a2c python312Packages.ucsmsdk: 0.9.20 -> 0.9.21 (#354596) cff5cbc5a1d9 python312Packages.aiortm: 0.9.24 -> 0.9.25 (#354607) 043d2cb44863 python312Packages.whenever: 0.6.10 -> 0.6.12 (#354613) 646347d50787 pulumi-bin: 3.137.0 -> 3.138.0 (#354618) 807e43e55923 msi-ec: 0-unstable-2024-09-19 -> 0-unstable-2024-11-04 (#353627) 02e3707a2cae python312Packages.jedi-language-server: 0.41.4 -> 0.42.0 (#354713) d8a18ae783d8 python312Packages.mitogen: 0.3.16 -> 0.3.18 (#354717) b276bfa32bff python312Packages.multiscale-spatial-image: 2.0.0 -> 2.0.1 (#354720) df67f3f7b25a helix-gpt: 0.31.0 -> 0.34.0 (#354767) 7307a896451d home-assistant-custom-lovelace-modules.mushroom: 4.0.8 -> 4.1.0 (#354787) 9559e9044e8a python312Packages.qbittorrent-api: 2024.9.67 -> 2024.10.68 (#354681) 45d7d8c8b3cd python312Packages.millheater: 0.11.8 -> 0.12.0 3061dbd29c06 ab-av1: 0.7.18 -> 0.7.19 (#354684) 3be1322ad99d python312Packages.objprint: 0.2.3 -> 0.3.0 (#354693) a8e970898daa ccls: 0.20240505 -> 0.20241108 (#354698) d5df6af63621 python312Packages.tencentcloud-sdk-python: 3.0.1261 -> 3.0.1262 (#354699) 2bac553f5a50 okteto: 3.0.0 -> 3.1.0 (#354702) d7a60669490e ocamlPackages.http-mirage-client: 0.0.7 -> 0.0.8 (#354650) 011f48fb221a fluent-bit: 3.1.9 -> 3.1.10 (#354664) f8ba284376ec python312Packages.guidata: 3.7.0 -> 3.7.1 d9353697ca64 tile38: 1.33.3 -> 1.33.4 (#354674) 4f101cae7065 aider-chat: add playwright version 7953deea2419 keybase-gui: 6.2.4 -> 6.4.0 (#336886) 20e8995972d4 thunderbird: 128.4.0esr -> 128.4.2esr (#354213) 312ce1b65c40 hickory-dns: 0.25.0-alpha.2 -> 0.25.0-alpha.3 b89f8a710d16 prusa-slicer, super-slicer, mediathekview: remove Moredread as maintainer d2d4c4f350b9 restic: 0.17.2 -> 0.17.3 (#354582) 38a52bbfd430 restic: disable tests on non-linux c98b0cad092c home-assistant-custom-lovelace-modules.mushroom: 4.0.8 -> 4.1.0 70ca880f3511 gnome-online-accounts: 3.52.0 → 3.52.1 247ee3b0379e mutter: 47.0 → 47.1 6b438be4d92a gvfs: 1.56.0 → 1.56.1 748ada2ba6e0 gnome-shell-extensions: 47.0 → 47.1 b3b9989a367d gnome-shell: 47.0 → 47.1 d45192210e86 gnome-remote-desktop: 47.0 → 47.1 ea1a562cb95a gnome-control-center: 47.0.1 → 47.1.1 9b6dabf3f2ff kubelogin-oidc: switch to recommended pattern for implicit attr defaults 4d089cffa925 kubelogin-oidc: 1.30.1 -> 1.31.0 f0bee68628ec robo: 5.0.0 -> 5.1.0 (#354707) 6fb6032d36ef roave-backward-compatibility-check: 8.9.0 -> 8.10.0 (#354705) 04f72b6930e8 ispc: 1.25.0 -> 1.25.3 (#354585) a4e298635f25 waylock: 1.2.1 -> 1.3.0 7fa514f53139 waylock: port update script to bash a9669e1be8c7 d2: 0.6.7 -> 0.6.8 a31f2a7b37f2 pluginupdate.py: fix bugs and add improvements; vimPlugins: sort properly (#353786) 8d9c4bfb9851 helix-gpt: 0.31 -> 0.34 2ef132b3585e gifski: 1.14.4 -> 1.32.0 (#346255) e02828f01cd1 python312Packages.scikit-fmm: remove stale substituteInPlace, unbreak (#354509) 7bb5dfe0e470 sketchybar-app-font: 2.0.25 -> 2.0.27 894ab7c90845 wttrbar: 0.10.6 -> 0.11.0 bc63a2f7c3c8 lapce: unbreak x86_64-darwin (#354566) dcdd61e5e5b2 whitesur-kde: 2022-05-01-unstable-2024-09-26 -> 2022-05-01-unstable-2… (#353112) 67fa71469a6b python3Packages.pgsanity: fix build e07f6a75653d python3Packages.mirakuru: fix build on darwin in sandbox 1b89b9a99d80 python3Packages.mirakuru: fix build on darwin 2515edf5369e qogir-kde: 0-unstable-2024-09-21 -> 0-unstable-2024-10-30 (#352723) 5f45ecf05c14 python312Packages.docling-parse: 2.0.2 -> 2.0.3 (#354691) cf6a8c9b4b9f chore: update references to `nix-review` to `nixpkgs-review` bc5b75eb11b1 mysql80: 8.0.39 -> 8.0.40 (#350248) 9bcab985ab58 stardust-xr-kiara: 0-unstable-2024-07-07 -> 0-unstable-2024-07-13 ea5908112814 python3Packages.mirakuru: 2.5.2 -> 2.5.3 a2dc61cee92a panoply: 5.5.4 -> 5.5.5 9ba75eb753b5 mysql-shell-innovation: add libutil on darwin; refactor to new SDK pattern 194e35dd632a mysql-shell: add libutil on darwin; refactor to new SDK pattern 54953ef09a04 qownnotes: 24.9.8 -> 24.11.1 8091ea3f24bb Merge: postgresql_17: fix build (#354571) 274d5afbc552 python312Packages.githubkit: 0.11.11 -> 0.11.14 3b91a81423cd treewide: remove redundant patches and locks (#354215) c4f452f621f6 vimPlugins.neoconf-nvim: add dependencies c701c72b71f7 wl-gammarelay-rs: 0.4.1 -> 1.0.0 (#353023) b11943b30173 nhost-cli: 1.24.5 -> 1.27.0 (#352589) 82f6fe5a5762 OWNERS: correct path after 1st by-name migration (#354753) 44800d7c800e .git-blame-ignore-revs: add 'treewide: migrate packages to pkgs/by-name, take 1' 7a56cc79c651 marwaita-red: 22 -> 22.2 (#354662) fa2cae8e77f8 treewide: migrate packages to pkgs/by-name, take 1 (#354531) 8f29f19bc162 mysql-shell: 8.4.1 -> 8.4.3, mysql-shell-innovation: 9.0.1 -> 9.1.0 (#349181) 8c2c5fa14d77 nixos/nzbget: add option to override package (#302204) f8bb0b875ad8 factorio: 2.0.14 -> 2.0.15 (#354040) ff0df8fe7aee php: 8.4.0RC3 -> 8.4.0RC4, 8.3.12 -> 8.3.13 (#354562) 751912c95af1 OWNERS: correct path after 1st by-name migration 648e59c8a3ce python312Packages.imap-tools: 1.7.3 -> 1.7.4 be978743512b Fix: use lib.mkPackageOption ba83a0dba006 Merge branch 'master' into patch-1 a96dce89d048 PR feedback: Replace pkg variable, move package statement 571c71e6f73a treewide: migrate packages to pkgs/by-name, take 1 b5f67acfbf3c nix-forecast: init at 0.1.0 (#354661) bfd5f3d9ffca glfw3: added vulkan support e98f8506648f python312Packages.nice-go: 0.3.9 -> 0.3.10 e79b71782a4c budgie-media-player-applet: 1.0.1 -> 1.1.1 (#354308) 4801d0c2a3a5 postgresql17Packages.{pg_cron,pg_hll}: fix build on x86_64-darwin b9cf08c8e5ec cargo-mobile2: 0.17.3 -> 0.17.4 (#354677) dde21924f83f vimPlugins.quarto-nvim: add dependencies (#354634) df20742283ba ombi: allow overriding package in module (#345814) a50d7295727e darwin.openwith: remove apple_sdk.frameworks 112d505ce4a2 clickhouse: fix compilation on aarch64-linux (#353983) 3fe7c149cbbb libreoffice: disable tests on Qt5 2be7c57b9325 python312Packages.ruff: 0.7.2 -> 0.7.3 (#354580) eeb4b7041961 nixos/hebbot: Fix systemd service (#354098) dde890851a3c python311Packages.angr: 9.2.126 -> 9.2.127 58e6cb8ad805 python312Packages.cle: 9.2.126 -> 9.2.127 7a83dade0a7d python312Packages.claripy: 9.2.126 -> 9.2.127 82870db16ad2 python312Packages.pyvex: 9.2.126 -> 9.2.127 1e20869209d8 python312Packages.ailment: 9.2.126 -> 9.2.127 5a5694d2ff97 python312Packages.archinfo: 9.2.126 -> 9.2.127 bf11ccc0e233 clouddrive2: 0.7.21 -> 0.8.3 (#354273) 951d196036af stardust-xr-magnetar: init at 0-unstable-2024-08-31 (#354623) 18f2cc30ef90 stardust-xr-gravity: init at 0-unstable-2024-08-20 (#354616) 90f890e79327 stardust-xr-atmosphere: init at 0-unstable-2024-08-22 (#354633) fd3e1541866a libreoffice-still: 24.2.5.2 -> 24.2.7.2 b60b7b6b05c1 libreoffice-fresh: 24.8.0.3 -> 24.8.2.1 dc31ff18ec84 stardust-xr-phobetor: init at 0-unstable-2024-02-10 (#354637) 996e9d64594d python311Packages.pysnow: fix deps and tests, unbreak (#354464) 5f8f11ff862b stardust-xr-protostar: init at 0-unstable-2024-07-19 (#354614) f3e2ba5038e9 stardust-xr-sphereland: init at 0-unstable-2023-11-06 (#354638) 99d3107b49fe stardust-xr-flatland: init at 0-unstable-2024-04-13 (#324395) 780275051aa2 stardust-xr-kiara: init at 0-unstable-2024-07-07 (#324404) ff09150750be basedpyright: 1.19.0 -> 1.21.0 (#354204) aff0cebe5ab3 fishPlugins.*: fix versions 8b4272426c92 python312Packages.magic-wormhole-transit-relay: 0.3.1 -> 0.4.0 54baabae77a7 ssh-tools: 1.8-unstable-2024-03-18 -> 1.9 (#353042) 972dfa3efafc python312Packages.objprint: add changelog to meta ca6c07d985d5 cnspec: 11.28.1 -> 11.29.0 788591e73b39 python312Packages.cyclopts: 2.9.9 -> 3.0.0 b156e982136d .github: Add a "Module requests" issue template 1df32493a41c python312Packages.mypy-boto3-verifiedpermissions: 1.35.30 -> 1.35.55 25114110f49e python312Packages.mypy-boto3-synthetics: 1.35.18 -> 1.35.56 dd882eb62402 python312Packages.mypy-boto3-s3control: 1.35.12 -> 1.35.55 aede3250222f python312Packages.mypy-boto3-resource-explorer-2: 1.35.25 -> 1.35.56 ddb9a7fcd1d7 python312Packages.mypy-boto3-quicksight: 1.35.43 -> 1.35.56 6db171d873a5 python312Packages.mypy-boto3-pinpoint-sms-voice-v2: 1.35.43 -> 1.35.57 c548504474ae nzportable: init at 2.0.0-indev+20241012190425 47904c8dd760 python312Packages.mypy-boto3-lambda: 1.35.49 -> 1.35.57 1e7b5db19091 python312Packages.mypy-boto3-lakeformation: 1.35.0 -> 1.35.55 f04bedb8b097 python312Packages.mypy-boto3-guardduty: 1.35.39 -> 1.35.55 f696f2da0ac9 python312Packages.mypy-boto3-firehose: 1.35.0 -> 1.35.57 815da64d5641 python312Packages.mypy-boto3-eks: 1.35.45 -> 1.35.57 da42eb80266f python312Packages.mypy-boto3-codebuild: 1.35.49 -> 1.35.55 f283f98e923e python312Packages.mypy-boto3-cleanrooms: 1.35.51 -> 1.35.56 764ae6081bc7 python312Packages.mypy-boto3-chime-sdk-media-pipelines: 1.35.0 -> 1.35.57 df705189ee44 python312Packages.mypy-boto3-batch: 1.35.53 -> 1.35.57 a4a1020e7137 python312Packages.mypy-boto3-autoscaling: 1.35.53 -> 1.35.56 e770aff17974 python312Packages.multiscale-spatial-image: 2.0.0 -> 2.0.1 f396caa8d752 python312Packages.chromadb: 0.5.17 -> 0.5.18 2160918a0b90 python312Packages.jedi-language-server: 0.41.4 -> 0.42.0 cb5a79de97b2 python312Packages.gehomesdk: 0.5.28 -> 0.5.29 ac3c8ae13d0a python312Packages.mitogen: 0.3.16 -> 0.3.18 b7c678532145 nix-update: 1.5.2 -> 1.6.0 (#354708) 1cc81439e761 nixosTests.frr: fix warning, use nodes.router instead of nodes.router.config f93219dfa08f nixosTests.frr: format using nixfmt df11922a6da8 nix-update: 1.5.2 -> 1.6.0 63d9179dd4e9 python312Packages.python-axolotl-curve25519: refactor 533fffa449e4 python312Packages.python-axolotl-curve25519: fix build on darwin 45dd2b73eacf python312Packages.tencentcloud-sdk-python: 3.0.1261 -> 3.0.1262 7c69e10ceb1b okteto: 3.0.0 -> 3.1.0 83d18d4dc3ee python311Packages.yowsup: refactor c0ec6c8c3c3c python311Packages.yowsup: fix build a0f0aac19598 ccls: 0.20240505 -> 0.20241108 5abc7f27a20e python312Packages.objprint: 0.2.3 -> 0.3.0 1fa9b80b0afd release: block on `aarch64` on `*-darwin` channels ab7489d373ff python311Packages.consonance: refactor c76f00a4efe6 python311Packages.consonance: fix build f323f1ccfef7 nix-forecast: init at 0.1.0 bdfa0f011297 python3Packages.pywebview: build fix for tests 78b5698555d8 ab-av1: 0.7.18 -> 0.7.19 8dfa246bb10c python312Packages.qbittorrent-api: 2024.9.67 -> 2024.10.68 4c7aa6428fe9 cargo-mobile2: 0.17.3 -> 0.17.4 df3d7683fed1 tile38: 1.33.3 -> 1.33.4 4f0337923244 quarto: apply deno 2 compatibility patch 69cc148de30a quarto: 1.6.30 -> 1.6.33 39769f9fc86f python311Packages.tsfresh: fix build on darwin 80335810c8c6 wl-gammarelay-rs: 0.4.1 -> 1.0.0 cf772c1b5608 fluent-bit: 3.1.9 -> 3.1.10 3603e0d5ea48 marwaita-red: 22 -> 22.2 5a82dc34b00e nhost-cli: 1.24.5 -> 1.27.0 40641c90b547 python312Packages.polars: 1.7.1 -> 1.9.0 b5f7f510393d ocamlPackages.http-mirage-client: 0.0.7 -> 0.0.8 a784f38df795 stardust-xr-sphereland: init at 0-unstable-2023-11-06 2c31f63228ab stardust-xr-phobetor: init at 0-unstable-2024-02-10 66bb24d74424 vimPlugins.quarto-nvim: add dependencies 02871d95ebeb mesonlsp: fix aarch64-darwin build, mark as broken on x86_64-darwin 2e2d6027352b stardust-xr-atmosphere: init at 0-unstable-2024-08-22 e9b1d2d5ac63 vimPlugins: sort properly a6fe798a015a pluginupdate.py: fix bugs and add improvements 8b503ec432ce pluginupdate.py: reformat with ruff d339f93f3225 bsc: remove axv2 when building on non x86 system 385eb6ae4dff python3Packages.rioxarray: 0.17.0 -> 0.18.1 5a1e1f65a908 stardust-xr-flatland: init at 0-unstable-2024-04-13 4b02cabbbe0c stardust-xr-protostar: init at 0-unstable-2024-07-19 839ecef9050e stardust-xr-gravity: init at 0-unstable-2024-08-20 c3fd31e2c4ad stardust-xr-magnetar: init at 0-unstable-2024-08-31 a90b34f9e76b keybase{-gui}: add myself as maintainer 265d9a2adb8b keybase-gui: add `NIXOS_OZONE_WL` support a024f81d841c keybase-gui: 6.2.4 -> 6.4.0 562758261fd4 pulumi-bin: 3.137.0 -> 3.138.0 71330f93ee9e linux_xanmod_latest: 6.11.6 -> 6.11.7 efa0718e7482 linux_xanmod: 6.6.59 -> 6.6.60 61220d768de8 python3Packages.torch: switch to apple-sdk_13 afbbb9aaeb0d python312Packages.aiortm: 0.9.24 -> 0.9.25 ac5aaaa7336f python312Packages.whenever: 0.6.10 -> 0.6.12 086bfa238585 lib/minver: bump to 2.3.17 a5b695b34b6b python312Packages.ucsmsdk: 0.9.20 -> 0.9.21 c3afba78f24e python311Packages.qutip: relax numpy build-time constraint, unbreak 0a48b45c5af7 xar: fix Linux build on staging-next 1754ed842e2d ispc: 1.25.0 -> 1.25.3 b8e62002b5d3 python312Packages.msprime: relax numpy build-time constraint, unbreak 226843be6a9f python312Packages.pysnow: patch tests, unbreak b8b4cdc90390 doc: revise Darwin SDK documentation 5db8bf44deb0 openpgp-card-tools: Add shell completions and man pages 120103ec7cc9 restic: 0.17.2 -> 0.17.3 80458ba97944 stardust-xr-kiara: init at 0-unstable-2024-07-07 676db521744e postgresql_17: fix build b2945bc0a84f python312Packages.langgraph: Fix unit tests that were breaking Hydra c64c064437f5 python312Packages.babelfont: 3.0.5 -> 3.0.6 c26249be9a66 lapce: format with nixfmt-rfc-style 896db32853f5 lapce: unbreak x86_64-darwin 3e9c905d355a nomad_1_9: 1.9.0 -> 1.9.2 4a1393afe0f1 python312Packages.ruff: 0.7.2 -> 0.7.3 78705eaeb106 skia: unbreak darwin d1478e78c0ac postgresqlPackages.system_stats: fix build on darwin af11b38d2131 cotp: 1.9.1 -> 1.9.2 c78b55b3b684 protonvpn-gui: 4.6.0 -> 4.7.3 29d02718132f wasmtime: 26.0.0 -> 26.0.1 1af3b8486fb2 granted: 0.36.0 -> 0.36.1 1bb3362ddfb5 python312Packages.free-proxy: 1.1.2 -> 1.1.3 dd59f2cfe919 budgie-media-player-applet: 1.0.1 -> 1.1.1 0418996c9685 pg-dump-anon: use latest postgresql available 6ec5b8d597ba netclient: 0.25.0 -> 0.26.0 e600b8b00b33 newlib: enable parallel build 16518a3f3d4b factorio: 2.0.14 -> 2.0.15 6c2d6fa844bc leo-editor: 6.8.1 -> 6.8.2 84b68b839ac3 python312Packages.tskit: relax numpy build-time constraint, unbreak bd2ea530520b python312Packages.scikit-fmm: run checkPhase hooks, echo check command 1c418186cfd2 python312Packages.scikit-fmm: remove stale substituteInPlace, unbreak ee27c02106f3 kube-state-metrics: 2.13.0 -> 2.14.0 0465be1b8f0e python311Packages.pysnow: fix deps, unbreak eeb52b79d149 vscode-extensions.shd101wyy.markdown-preview-enhanced: 0.8.14 -> 0.8.15 19595c35d78c crates-tui: init at 0.1.20 92647d759237 vale: 3.8.0 -> 3.9.0 44992762f0cc basedpyright: 1.19.0 -> 1.21.0 27c93e95f9a8 tulip: fix compilation by adding the `-fpermissive` flag A typecast from unsigned char* to char* in the source broke the build 987c737557b1 python312Packages.guidata: 3.6.3 -> 3.7.0 07d2ee58bae2 nanoflann: 1.6.1 -> 1.6.2 b74fdd238641 treewide: remove redundant patches and locks a588dee7465d python312Packages.cmsdials: 1.3.0 -> 1.4.0 b75334c2f965 live-server: 0.8.0 -> 0.9.0 86fbc2f2d8c6 python312Packages.redis-om: 0.3.2 -> 0.3.3 00cc5342828c python312Packages.kornia: 0.7.3 -> 0.7.4 831c38e31987 python3Packages.fastcrc: init at 0.3.2 a01b23fa72ac cartridges: run meson checks 57f23ed8b1a8 cartridges: 2.9.3 -> 2.10.1 cea2eef9fa5d clouddrive2: 0.7.21 -> 0.8.3 b62797a3d7ed tulip: format using nixfmt fb358db1b51f thunderbird-128-unwrapped: 128.4.0esr -> 128.4.2esr d56656e48729 yosys: 0.46 -> 0.47 43d0f16226c8 pyton312Packages.arelle: 18.3 -> 2.30.25, unbreak, refactor 0e174ba654b7 python3Packages.proton-vpn-network-manager: 0.9.1 -> 0.9.4 f4485f7c41af python3Packages.proton-vpn-api-core: 0.35.5 -> 0.36.4 074f93408e5a proton-vpn-local-agent: 0-unstable-2024-10-10 -> 1.0.0 da0bfe800600 signal-desktop: remove stdenv.cc.cc from runtimeDeps de8c3feb7fbf wasmer: 5.0.0 -> 5.0.1 16970e3252d0 nixos/hebbot: Fix systemd service 9e1b88a44350 libbassmidi: init at 2.4.15.3 05ac36fa30a3 treewide: use dontCargo{Build,Check,Install} 3e646301a07e smartcat: 1.7.1 -> 2.1.0 9609ea875774 vscode-extensions.streetsidesoftware.code-spell-checker: 4.0.14 -> 4.0.15 975f4c45ae5c beszel: init at 0.6.2 887a74fd5784 clickhouse: fix compilation on aarch64-linux 3f2bbfd68b79 nixos/openvpn3: add `/etc/openvpn3/configs` to `systemd.tmpfiles` 9642cf41060a cfn-nag: added mathstlouis to maintainers abcf5fb9b943 maintainer-list: added mathstlouis c771f151f8bf cfn-nag: added meta.mainProgram ff17208a821a cfn-nag: fix gemfile so that binaries are generated dd086ca40200 msi-ec: 0-unstable-2024-09-19 -> 0-unstable-2024-11-04 4b13779f3321 python3Packages.subliminal: mark as not broken 9b7877aa1fc7 kubectl-graph: init at 0.7.0 aebe9a354b7b regripper: update-2023-07-23 -> 0-unstable-2024-11-02 db15554b6954 htcondor: 23.10.1 -> 24.1.1 d90f320eb26d bootterm: init at 0.5 45d7127c77df mesonlsp: 4.3.5 -> 4.3.7 1a774a95d219 python312Packages.wtforms: 3.1.2 -> 3.2.1 682d4d76aa8c containerlab: 0.58.0 -> 0.59.0 7abbb28c59b9 whitesur-kde: 2022-05-01-unstable-2024-09-26 -> 2022-05-01-unstable-2024-11-01 b9e3b9dbb22b ssh-tools: 1.8-unstable-2024-03-18 -> 1.9 4eceb5ba2fef maintainers: add deadbaed c952a4bfdbec vscode-extensions.sainnhe.gruvbox-material: init at 6.5.2 d4e2d6e00c84 maintainers: add thtrf 1301e4f0b024 pyamlboot.tests: fix the eval 6030ff068ad7 gnuplot: fix build with `withTeXLive = true` b6cf7b27b7c0 qogir-kde: 0-unstable-2024-09-21 -> 0-unstable-2024-10-30 4d8081767bc5 lomiri.lomiri-content-hub: nixfmt, modernise 4ce2e1df58ec lomiri.lomiri-download-manager: nixfmt, modernise 5cc3c54a6425 lomiri.lomiri-ui-toolkit: nixfmt, modernise ba59f61a725a lomiri.u1db-qt: Add meta.changelog 95c0233ed962 lomiri.lomiri-action-api: nixfmt, modernise bafb37491e96 libsForQt5.accounts-qml-module: Fix version b8c432b54a5a libsForQt5.accounts-qml-module: nixfmt, modernise 8a5f86237dba lomiri.lomiri-content-hub: Enable qdoc docs 03b310e94cbc lomiri.lomiri-indicator-network: Enable qdoc docs e0d5bd98ffbc lomiri.lomiri-download-manager: Enable qdoc docs d04843ce6096 lomiri.lomiri-ui-toolkit: Enable qdoc docs ac976c912dfb jasp-desktop: add patch to fix crash when using qt 6.8 8f74b6cdaf78 lomiri.lomiri-action-api: Enable qdoc docs eeea8d648db2 lomiri.u1db-qt: Enable qdoc docs 4442e5ac9161 libsForQt5.accounts-qml-module: Enable qdoc docs 9dd1f943ecd1 nixos/nextcloud-notify_push: fix defaultText rendering bed43b44613d nixos/hardware.nitrokey: update documentation 38ec993a582f nixos/hardware.nitrokey: replace libnitrokey with nitrokey-udev-rules d43f004d1fe4 nitrokey-udev-rules: init at 1.0.0 8ffcca7fd0a0 maintainers: add robinkrahl 2280b9bf4a98 python312Packages.bsdiff4: 1.2.4 -> 1.2.5 9ce864871fdc python312Packages.rio-tiler: 6.7.0 → 7.0.1 1caf42170d5a vscode-extensions.continue.continue: 0.8.44 -> 0.8.54 d931f342a429 mysql80: 8.0.39 -> 8.0.40 07c81867c907 dolphin-emu-primehack: 1.0.6a -> 1.0.7a, qt5 -> qt6, unpin fmt c3ceedeac1ac obs-studio-plugins.obs-hyperion: patch stateChanged deprecation cbcee2460787 mysql-shell-innovation: 9.0.1 -> 9.1.0 c7a381c92a79 mysql-shell: 8.4.1 -> 8.4.3 933ccc51f4a5 maintainers: add rksm 1a48ff707293 python312Packages.morecantile: 5.4.2 -> 6.0.0 c02e155285ef vscode-extensions.esbenp.prettier-vscode: 10.4.0 -> 11.0.0 6e6fc7ca2658 nixos/acme: do not limit credentials functionality to DNS/S3 config 7467f7d59f13 nixos/roundcube: add example for `database.passwordFile` 04dbbd436515 teamviewer: introduce services.teamviewer.package option 2928912a7c74 teamviewer: remove "with lib;" 89ecd0313160 teamviewer: format file 5146c143bbf1 gifski: 1.14.4 -> 1.32.0 a44e0fe3dc9f pyton312Packages.sphinx-autodoc2: init at 0.5.0 0b097987fe34 nixos/localsend: allow udp port 9ac4777d98d0 nixos/localsend: add package option a3843a7ee564 chiptrack: init at 0.3.1 5d49d4cfa1a4 nixos/guix: use exec to start the payload binary 410ae87bf5e2 nixos/boinc: use exec to start the payload binary e8a9775a6167 nixos/nzbget: add option to override package git-subtree-dir: third_party/nixpkgs git-subtree-split: dc460ec76cbff0e66e269457d7b728432263166c
1033 lines
41 KiB
Nix
1033 lines
41 KiB
Nix
{ config, lib, pkgs, options, ... }:
|
|
let
|
|
|
|
|
|
cfg = config.security.acme;
|
|
opt = options.security.acme;
|
|
user = if cfg.useRoot then "root" else "acme";
|
|
|
|
# Used to calculate timer accuracy for coalescing
|
|
numCerts = lib.length (builtins.attrNames cfg.certs);
|
|
_24hSecs = 60 * 60 * 24;
|
|
|
|
# Used to make unique paths for each cert/account config set
|
|
mkHash = with builtins; val: lib.substring 0 20 (hashString "sha256" val);
|
|
mkAccountHash = acmeServer: data: mkHash "${toString acmeServer} ${data.keyType} ${data.email}";
|
|
accountDirRoot = "/var/lib/acme/.lego/accounts/";
|
|
|
|
lockdir = "/run/acme/";
|
|
concurrencyLockfiles = map (n: "${toString n}.lock") (lib.range 1 cfg.maxConcurrentRenewals);
|
|
# Assign elements of `baseList` to each element of `needAssignmentList`, until the latter is exhausted.
|
|
# returns: [{fst = "element of baseList"; snd = "element of needAssignmentList"}]
|
|
roundRobinAssign = baseList: needAssignmentList:
|
|
if baseList == [] then []
|
|
else _rrCycler baseList baseList needAssignmentList;
|
|
_rrCycler = with builtins; origBaseList: workingBaseList: needAssignmentList:
|
|
if (workingBaseList == [] || needAssignmentList == [])
|
|
then []
|
|
else
|
|
[{ fst = head workingBaseList; snd = head needAssignmentList;}] ++
|
|
_rrCycler origBaseList (if (tail workingBaseList == []) then origBaseList else tail workingBaseList) (tail needAssignmentList);
|
|
attrsToList = lib.mapAttrsToList (attrname: attrval: {name = attrname; value = attrval;});
|
|
# for an AttrSet `funcsAttrs` having functions as values, apply single arguments from
|
|
# `argsList` to them in a round-robin manner.
|
|
# Returns an attribute set with the applied functions as values.
|
|
roundRobinApplyAttrs = funcsAttrs: argsList: lib.listToAttrs (map (x: {inherit (x.snd) name; value = x.snd.value x.fst;}) (roundRobinAssign argsList (attrsToList funcsAttrs)));
|
|
wrapInFlock = lockfilePath: script:
|
|
# explainer: https://stackoverflow.com/a/60896531
|
|
''
|
|
exec {LOCKFD}> ${lockfilePath}
|
|
echo "Waiting to acquire lock ${lockfilePath}"
|
|
${pkgs.flock}/bin/flock ''${LOCKFD} || exit 1
|
|
echo "Acquired lock ${lockfilePath}"
|
|
''
|
|
+ script + "\n"
|
|
+ ''echo "Releasing lock ${lockfilePath}" # only released after process exit'';
|
|
|
|
|
|
# There are many services required to make cert renewals work.
|
|
# They all follow a common structure:
|
|
# - They inherit this commonServiceConfig
|
|
# - They all run as the acme user
|
|
# - They all use BindPath and StateDirectory where possible
|
|
# to set up a sort of build environment in /tmp
|
|
# The Group can vary depending on what the user has specified in
|
|
# security.acme.certs.<cert>.group on some of the services.
|
|
commonServiceConfig = {
|
|
Type = "oneshot";
|
|
User = user;
|
|
Group = lib.mkDefault "acme";
|
|
UMask = "0022";
|
|
StateDirectoryMode = "750";
|
|
ProtectSystem = "strict";
|
|
ReadWritePaths = [
|
|
"/var/lib/acme"
|
|
lockdir
|
|
];
|
|
PrivateTmp = true;
|
|
|
|
WorkingDirectory = "/tmp";
|
|
|
|
CapabilityBoundingSet = [ "" ];
|
|
DevicePolicy = "closed";
|
|
LockPersonality = true;
|
|
MemoryDenyWriteExecute = true;
|
|
NoNewPrivileges = true;
|
|
PrivateDevices = true;
|
|
ProtectClock = true;
|
|
ProtectHome = true;
|
|
ProtectHostname = true;
|
|
ProtectControlGroups = true;
|
|
ProtectKernelLogs = true;
|
|
ProtectKernelModules = true;
|
|
ProtectKernelTunables = true;
|
|
ProtectProc = "invisible";
|
|
ProcSubset = "pid";
|
|
RemoveIPC = true;
|
|
RestrictAddressFamilies = [
|
|
"AF_INET"
|
|
"AF_INET6"
|
|
];
|
|
RestrictNamespaces = true;
|
|
RestrictRealtime = true;
|
|
RestrictSUIDSGID = true;
|
|
SystemCallArchitectures = "native";
|
|
SystemCallFilter = [
|
|
# 1. allow a reasonable set of syscalls
|
|
"@system-service @resources"
|
|
# 2. and deny unreasonable ones
|
|
"~@privileged"
|
|
# 3. then allow the required subset within denied groups
|
|
"@chown"
|
|
];
|
|
};
|
|
|
|
# In order to avoid race conditions creating the CA for selfsigned certs,
|
|
# we have a separate service which will create the necessary files.
|
|
selfsignCAService = {
|
|
description = "Generate self-signed certificate authority";
|
|
|
|
path = with pkgs; [ minica ];
|
|
|
|
unitConfig = {
|
|
ConditionPathExists = "!/var/lib/acme/.minica/key.pem";
|
|
StartLimitIntervalSec = 0;
|
|
};
|
|
|
|
serviceConfig = commonServiceConfig // {
|
|
StateDirectory = "acme/.minica";
|
|
BindPaths = "/var/lib/acme/.minica:/tmp/ca";
|
|
UMask = "0077";
|
|
};
|
|
|
|
# Working directory will be /tmp
|
|
script = ''
|
|
minica \
|
|
--ca-key ca/key.pem \
|
|
--ca-cert ca/cert.pem \
|
|
--domains selfsigned.local
|
|
'';
|
|
};
|
|
|
|
# Ensures that directories which are shared across all certs
|
|
# exist and have the correct user and group, since group
|
|
# is configurable on a per-cert basis.
|
|
userMigrationService = let
|
|
script = with builtins; ''
|
|
chown -R ${user} .lego/accounts
|
|
'' + (lib.concatStringsSep "\n" (lib.mapAttrsToList (cert: data: ''
|
|
for fixpath in ${lib.escapeShellArg cert} .lego/${lib.escapeShellArg cert}; do
|
|
if [ -d "$fixpath" ]; then
|
|
chmod -R u=rwX,g=rX,o= "$fixpath"
|
|
chown -R ${user}:${data.group} "$fixpath"
|
|
fi
|
|
done
|
|
'') certConfigs));
|
|
in {
|
|
description = "Fix owner and group of all ACME certificates";
|
|
|
|
serviceConfig = commonServiceConfig // {
|
|
# We don't want this to run every time a renewal happens
|
|
RemainAfterExit = true;
|
|
|
|
# StateDirectory entries are a cleaner, service-level mechanism
|
|
# for dealing with persistent service data
|
|
StateDirectory = [ "acme" "acme/.lego" "acme/.lego/accounts" ];
|
|
StateDirectoryMode = 755;
|
|
WorkingDirectory = "/var/lib/acme";
|
|
|
|
# Run the start script as root
|
|
ExecStart = "+" + (pkgs.writeShellScript "acme-fixperms" script);
|
|
};
|
|
};
|
|
lockfilePrepareService = {
|
|
description = "Manage lock files for acme services";
|
|
|
|
# ensure all required lock files exist, but none more
|
|
script = ''
|
|
GLOBIGNORE="${lib.concatStringsSep ":" concurrencyLockfiles}"
|
|
rm -f -- *
|
|
unset GLOBIGNORE
|
|
|
|
xargs touch <<< "${toString concurrencyLockfiles}"
|
|
'';
|
|
|
|
serviceConfig = commonServiceConfig // {
|
|
# We don't want this to run every time a renewal happens
|
|
RemainAfterExit = true;
|
|
WorkingDirectory = lockdir;
|
|
};
|
|
};
|
|
|
|
|
|
certToConfig = cert: data: let
|
|
acmeServer = data.server;
|
|
useDns = data.dnsProvider != null;
|
|
destPath = "/var/lib/acme/${cert}";
|
|
selfsignedDeps = lib.optionals (cfg.preliminarySelfsigned) [ "acme-selfsigned-${cert}.service" ];
|
|
|
|
# Minica and lego have a "feature" which replaces * with _. We need
|
|
# to make this substitution to reference the output files from both programs.
|
|
# End users never see this since we rename the certs.
|
|
keyName = builtins.replaceStrings ["*"] ["_"] data.domain;
|
|
|
|
# FIXME when mkChangedOptionModule supports submodules, change to that.
|
|
# This is a workaround
|
|
extraDomains = data.extraDomainNames ++ (
|
|
lib.optionals
|
|
(data.extraDomains != "_mkMergedOptionModule")
|
|
(builtins.attrNames data.extraDomains)
|
|
);
|
|
|
|
# Create hashes for cert data directories based on configuration
|
|
# Flags are separated to avoid collisions
|
|
hashData = with builtins; ''
|
|
${lib.concatStringsSep " " data.extraLegoFlags} -
|
|
${lib.concatStringsSep " " data.extraLegoRunFlags} -
|
|
${lib.concatStringsSep " " data.extraLegoRenewFlags} -
|
|
${toString acmeServer} ${toString data.dnsProvider}
|
|
${toString data.ocspMustStaple} ${data.keyType}
|
|
'';
|
|
certDir = mkHash hashData;
|
|
# TODO remove domainHash usage entirely. Waiting on go-acme/lego#1532
|
|
domainHash = mkHash "${lib.concatStringsSep " " extraDomains} ${data.domain}";
|
|
accountHash = (mkAccountHash acmeServer data);
|
|
accountDir = accountDirRoot + accountHash;
|
|
|
|
protocolOpts = if useDns then (
|
|
[ "--dns" data.dnsProvider ]
|
|
++ lib.optionals (!data.dnsPropagationCheck) [ "--dns.propagation-disable-ans" ]
|
|
++ lib.optionals (data.dnsResolver != null) [ "--dns.resolvers" data.dnsResolver ]
|
|
) else if data.s3Bucket != null then [ "--http" "--http.s3-bucket" data.s3Bucket ]
|
|
else if data.listenHTTP != null then [ "--http" "--http.port" data.listenHTTP ]
|
|
else [ "--http" "--http.webroot" data.webroot ];
|
|
|
|
commonOpts = [
|
|
"--accept-tos" # Checking the option is covered by the assertions
|
|
"--path" "."
|
|
"-d" data.domain
|
|
"--email" data.email
|
|
"--key-type" data.keyType
|
|
] ++ protocolOpts
|
|
++ lib.optionals (acmeServer != null) [ "--server" acmeServer ]
|
|
++ lib.concatMap (name: [ "-d" name ]) extraDomains
|
|
++ data.extraLegoFlags;
|
|
|
|
# Although --must-staple is common to both modes, it is not declared as a
|
|
# mode-agnostic argument in lego and thus must come after the mode.
|
|
runOpts = lib.escapeShellArgs (
|
|
commonOpts
|
|
++ [ "run" ]
|
|
++ lib.optionals data.ocspMustStaple [ "--must-staple" ]
|
|
++ data.extraLegoRunFlags
|
|
);
|
|
renewOpts = lib.escapeShellArgs (
|
|
commonOpts
|
|
++ [ "renew" "--no-random-sleep" ]
|
|
++ lib.optionals data.ocspMustStaple [ "--must-staple" ]
|
|
++ data.extraLegoRenewFlags
|
|
);
|
|
|
|
# We need to collect all the ACME webroots to grant them write
|
|
# access in the systemd service.
|
|
webroots =
|
|
lib.remove null
|
|
(lib.unique
|
|
(builtins.map
|
|
(certAttrs: certAttrs.webroot)
|
|
(lib.attrValues config.security.acme.certs)));
|
|
in {
|
|
inherit accountHash cert selfsignedDeps;
|
|
|
|
group = data.group;
|
|
|
|
renewTimer = {
|
|
description = "Renew ACME Certificate for ${cert}";
|
|
wantedBy = [ "timers.target" ];
|
|
timerConfig = {
|
|
OnCalendar = data.renewInterval;
|
|
Unit = "acme-${cert}.service";
|
|
Persistent = "yes";
|
|
|
|
# Allow systemd to pick a convenient time within the day
|
|
# to run the check.
|
|
# This allows the coalescing of multiple timer jobs.
|
|
# We divide by the number of certificates so that if you
|
|
# have many certificates, the renewals are distributed over
|
|
# the course of the day to avoid rate limits.
|
|
AccuracySec = "${toString (_24hSecs / numCerts)}s";
|
|
# Skew randomly within the day, per https://letsencrypt.org/docs/integration-guide/.
|
|
RandomizedDelaySec = "24h";
|
|
FixedRandomDelay = true;
|
|
};
|
|
};
|
|
|
|
selfsignService = lockfileName: {
|
|
description = "Generate self-signed certificate for ${cert}";
|
|
after = [ "acme-selfsigned-ca.service" "acme-fixperms.service" ] ++ lib.optional (cfg.maxConcurrentRenewals > 0) "acme-lockfiles.service";
|
|
requires = [ "acme-selfsigned-ca.service" "acme-fixperms.service" ] ++ lib.optional (cfg.maxConcurrentRenewals > 0) "acme-lockfiles.service";
|
|
|
|
path = with pkgs; [ minica ];
|
|
|
|
unitConfig = {
|
|
ConditionPathExists = "!/var/lib/acme/${cert}/key.pem";
|
|
StartLimitIntervalSec = 0;
|
|
};
|
|
|
|
serviceConfig = commonServiceConfig // {
|
|
Group = data.group;
|
|
UMask = "0027";
|
|
|
|
StateDirectory = "acme/${cert}";
|
|
|
|
BindPaths = [
|
|
"/var/lib/acme/.minica:/tmp/ca"
|
|
"/var/lib/acme/${cert}:/tmp/${keyName}"
|
|
];
|
|
};
|
|
|
|
# Working directory will be /tmp
|
|
# minica will output to a folder sharing the name of the first domain
|
|
# in the list, which will be ${data.domain}
|
|
script = (if (lockfileName == null) then lib.id else wrapInFlock "${lockdir}${lockfileName}") ''
|
|
minica \
|
|
--ca-key ca/key.pem \
|
|
--ca-cert ca/cert.pem \
|
|
--domains ${lib.escapeShellArg (builtins.concatStringsSep "," ([ data.domain ] ++ extraDomains))}
|
|
|
|
# Create files to match directory layout for real certificates
|
|
cd '${keyName}'
|
|
cp ../ca/cert.pem chain.pem
|
|
cat cert.pem chain.pem > fullchain.pem
|
|
cat key.pem fullchain.pem > full.pem
|
|
|
|
# Group might change between runs, re-apply it
|
|
chown '${user}:${data.group}' -- *
|
|
|
|
# Default permissions make the files unreadable by group + anon
|
|
# Need to be readable by group
|
|
chmod 640 -- *
|
|
'';
|
|
};
|
|
|
|
renewService = lockfileName: {
|
|
description = "Renew ACME certificate for ${cert}";
|
|
after = [ "network.target" "network-online.target" "acme-fixperms.service" "nss-lookup.target" ] ++ selfsignedDeps ++ lib.optional (cfg.maxConcurrentRenewals > 0) "acme-lockfiles.service";
|
|
wants = [ "network-online.target" "acme-fixperms.service" ] ++ selfsignedDeps ++ lib.optional (cfg.maxConcurrentRenewals > 0) "acme-lockfiles.service";
|
|
|
|
# https://github.com/NixOS/nixpkgs/pull/81371#issuecomment-605526099
|
|
wantedBy = lib.optionals (!config.boot.isContainer) [ "multi-user.target" ];
|
|
|
|
path = with pkgs; [ lego coreutils diffutils openssl ];
|
|
|
|
serviceConfig = commonServiceConfig // {
|
|
Group = data.group;
|
|
|
|
# Let's Encrypt Failed Validation Limit allows 5 retries per hour, per account, hostname and hour.
|
|
# This avoids eating them all up if something is misconfigured upon the first try.
|
|
RestartSec = 15 * 60;
|
|
|
|
# Keep in mind that these directories will be deleted if the user runs
|
|
# systemctl clean --what=state
|
|
# acme/.lego/${cert} is listed for this reason.
|
|
StateDirectory = [
|
|
"acme/${cert}"
|
|
"acme/.lego/${cert}"
|
|
"acme/.lego/${cert}/${certDir}"
|
|
"acme/.lego/accounts/${accountHash}"
|
|
];
|
|
|
|
ReadWritePaths = commonServiceConfig.ReadWritePaths ++ webroots;
|
|
|
|
# Needs to be space separated, but can't use a multiline string because that'll include newlines
|
|
BindPaths = [
|
|
"${accountDir}:/tmp/accounts"
|
|
"/var/lib/acme/${cert}:/tmp/out"
|
|
"/var/lib/acme/.lego/${cert}/${certDir}:/tmp/certificates"
|
|
];
|
|
|
|
EnvironmentFile = lib.mkIf (data.environmentFile != null) data.environmentFile;
|
|
|
|
Environment = lib.mapAttrsToList (k: v: ''"${k}=%d/${k}"'') data.credentialFiles;
|
|
|
|
LoadCredential = lib.mapAttrsToList (k: v: "${k}:${v}") data.credentialFiles;
|
|
|
|
# Run as root (Prefixed with +)
|
|
ExecStartPost = "+" + (pkgs.writeShellScript "acme-postrun" ''
|
|
cd /var/lib/acme/${lib.escapeShellArg cert}
|
|
if [ -e renewed ]; then
|
|
rm renewed
|
|
${data.postRun}
|
|
${lib.optionalString (data.reloadServices != [])
|
|
"systemctl --no-block try-reload-or-restart ${lib.escapeShellArgs data.reloadServices}"
|
|
}
|
|
fi
|
|
'');
|
|
} // lib.optionalAttrs (data.listenHTTP != null && lib.toInt (lib.last (lib.splitString ":" data.listenHTTP)) < 1024) {
|
|
CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
|
|
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
|
|
};
|
|
|
|
# Working directory will be /tmp
|
|
script = (if (lockfileName == null) then lib.id else wrapInFlock "${lockdir}${lockfileName}") ''
|
|
${lib.optionalString data.enableDebugLogs "set -x"}
|
|
set -euo pipefail
|
|
|
|
# This reimplements the expiration date check, but without querying
|
|
# the acme server first. By doing this offline, we avoid errors
|
|
# when the network or DNS are unavailable, which can happen during
|
|
# nixos-rebuild switch.
|
|
is_expiration_skippable() {
|
|
pem=$1
|
|
|
|
# This function relies on set -e to exit early if any of the
|
|
# conditions or programs fail.
|
|
|
|
[[ -e $pem ]]
|
|
|
|
expiration_line="$(
|
|
set -euxo pipefail
|
|
openssl x509 -noout -enddate <"$pem" \
|
|
| grep notAfter \
|
|
| sed -e 's/^notAfter=//'
|
|
)"
|
|
[[ -n "$expiration_line" ]]
|
|
|
|
expiration_date="$(date -d "$expiration_line" +%s)"
|
|
now="$(date +%s)"
|
|
expiration_s=$((expiration_date - now))
|
|
expiration_days=$((expiration_s / (3600 * 24))) # rounds down
|
|
|
|
[[ $expiration_days -gt ${toString data.validMinDays} ]]
|
|
}
|
|
|
|
${lib.optionalString (data.webroot != null) ''
|
|
# Ensure the webroot exists. Fixing group is required in case configuration was changed between runs.
|
|
# Lego will fail if the webroot does not exist at all.
|
|
(
|
|
mkdir -p '${data.webroot}/.well-known/acme-challenge' \
|
|
&& chgrp '${data.group}' ${data.webroot}/.well-known/acme-challenge
|
|
) || (
|
|
echo 'Please ensure ${data.webroot}/.well-known/acme-challenge exists and is writable by acme:${data.group}' \
|
|
&& exit 1
|
|
)
|
|
''}
|
|
|
|
echo '${domainHash}' > domainhash.txt
|
|
|
|
# Check if we can renew.
|
|
# We can only renew if the list of domains has not changed.
|
|
# We also need an account key. Avoids #190493
|
|
if cmp -s domainhash.txt certificates/domainhash.txt && [ -e 'certificates/${keyName}.key' ] && [ -e 'certificates/${keyName}.crt' ] && [ -n "$(find accounts -name '${data.email}.key')" ]; then
|
|
|
|
# Even if a cert is not expired, it may be revoked by the CA.
|
|
# Try to renew, and silently fail if the cert is not expired.
|
|
# Avoids #85794 and resolves #129838
|
|
if ! lego ${renewOpts} --days ${toString data.validMinDays}; then
|
|
if is_expiration_skippable out/full.pem; then
|
|
echo 1>&2 "nixos-acme: Ignoring failed renewal because expiration isn't within the coming ${toString data.validMinDays} days"
|
|
else
|
|
# High number to avoid Systemd reserved codes.
|
|
exit 11
|
|
fi
|
|
fi
|
|
|
|
# Otherwise do a full run
|
|
elif ! lego ${runOpts}; then
|
|
# Produce a nice error for those doing their first nixos-rebuild with these certs
|
|
echo Failed to fetch certificates. \
|
|
This may mean your DNS records are set up incorrectly. \
|
|
${lib.optionalString (cfg.preliminarySelfsigned) "Selfsigned certs are in place and dependant services will still start."}
|
|
# Exit 10 so that users can potentially amend SuccessExitStatus to ignore this error.
|
|
# High number to avoid Systemd reserved codes.
|
|
exit 10
|
|
fi
|
|
|
|
mv domainhash.txt certificates/
|
|
|
|
# Group might change between runs, re-apply it
|
|
chown '${user}:${data.group}' certificates/*
|
|
|
|
# Copy all certs to the "real" certs directory
|
|
if ! cmp -s 'certificates/${keyName}.crt' out/fullchain.pem; then
|
|
touch out/renewed
|
|
echo Installing new certificate
|
|
cp -vp 'certificates/${keyName}.crt' out/fullchain.pem
|
|
cp -vp 'certificates/${keyName}.key' out/key.pem
|
|
cp -vp 'certificates/${keyName}.issuer.crt' out/chain.pem
|
|
ln -sf fullchain.pem out/cert.pem
|
|
cat out/key.pem out/fullchain.pem > out/full.pem
|
|
fi
|
|
|
|
# By default group will have no access to the cert files.
|
|
# This chmod will fix that.
|
|
chmod 640 out/*
|
|
'';
|
|
};
|
|
};
|
|
|
|
certConfigs = lib.mapAttrs certToConfig cfg.certs;
|
|
|
|
# These options can be specified within
|
|
# security.acme.defaults or security.acme.certs.<name>
|
|
inheritableModule = isDefaults: { config, ... }: let
|
|
defaultAndText = name: default: {
|
|
# When ! isDefaults then this is the option declaration for the
|
|
# security.acme.certs.<name> path, which has the extra inheritDefaults
|
|
# option, which if disabled means that we can't inherit it
|
|
default = if isDefaults || ! config.inheritDefaults then default else cfg.defaults.${name};
|
|
# The docs however don't need to depend on inheritDefaults, they should
|
|
# stay constant. Though notably it wouldn't matter much, because to get
|
|
# the option information, a submodule with name `<name>` is evaluated
|
|
# without any definitions.
|
|
defaultText = if isDefaults then default else lib.literalExpression "config.security.acme.defaults.${name}";
|
|
};
|
|
in {
|
|
imports = [
|
|
(lib.mkRenamedOptionModule [ "credentialsFile" ] [ "environmentFile" ])
|
|
];
|
|
|
|
options = {
|
|
validMinDays = lib.mkOption {
|
|
type = lib.types.int;
|
|
inherit (defaultAndText "validMinDays" 30) default defaultText;
|
|
description = "Minimum remaining validity before renewal in days.";
|
|
};
|
|
|
|
renewInterval = lib.mkOption {
|
|
type = lib.types.str;
|
|
inherit (defaultAndText "renewInterval" "daily") default defaultText;
|
|
description = ''
|
|
Systemd calendar expression when to check for renewal. See
|
|
{manpage}`systemd.time(7)`.
|
|
'';
|
|
};
|
|
|
|
enableDebugLogs = lib.mkEnableOption "debug logging for this certificate" // {
|
|
inherit (defaultAndText "enableDebugLogs" true) default defaultText;
|
|
};
|
|
|
|
webroot = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
inherit (defaultAndText "webroot" null) default defaultText;
|
|
example = "/var/lib/acme/acme-challenge";
|
|
description = ''
|
|
Where the webroot of the HTTP vhost is located.
|
|
{file}`.well-known/acme-challenge/` directory
|
|
will be created below the webroot if it doesn't exist.
|
|
`http://example.org/.well-known/acme-challenge/` must also
|
|
be available (notice unencrypted HTTP).
|
|
'';
|
|
};
|
|
|
|
server = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
inherit (defaultAndText "server" "https://acme-v02.api.letsencrypt.org/directory") default defaultText;
|
|
example = "https://acme-staging-v02.api.letsencrypt.org/directory";
|
|
description = ''
|
|
ACME Directory Resource URI.
|
|
Defaults to Let's Encrypt's production endpoint.
|
|
For testing Let's Encrypt's [staging endpoint](https://letsencrypt.org/docs/staging-environment/)
|
|
should be used to avoid the rather tight rate limit on the production endpoint.
|
|
'';
|
|
};
|
|
|
|
email = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
inherit (defaultAndText "email" null) default defaultText;
|
|
description = ''
|
|
Email address for account creation and correspondence from the CA.
|
|
It is recommended to use the same email for all certs to avoid account
|
|
creation limits.
|
|
'';
|
|
};
|
|
|
|
group = lib.mkOption {
|
|
type = lib.types.str;
|
|
inherit (defaultAndText "group" "acme") default defaultText;
|
|
description = "Group running the ACME client.";
|
|
};
|
|
|
|
reloadServices = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
inherit (defaultAndText "reloadServices" []) default defaultText;
|
|
description = ''
|
|
The list of systemd services to call `systemctl try-reload-or-restart`
|
|
on.
|
|
'';
|
|
};
|
|
|
|
postRun = lib.mkOption {
|
|
type = lib.types.lines;
|
|
inherit (defaultAndText "postRun" "") default defaultText;
|
|
example = "cp full.pem backup.pem";
|
|
description = ''
|
|
Commands to run after new certificates go live. Note that
|
|
these commands run as the root user.
|
|
|
|
Executed in the same directory with the new certificate.
|
|
'';
|
|
};
|
|
|
|
keyType = lib.mkOption {
|
|
type = lib.types.str;
|
|
inherit (defaultAndText "keyType" "ec256") default defaultText;
|
|
description = ''
|
|
Key type to use for private keys.
|
|
For an up to date list of supported values check the --key-type option
|
|
at <https://go-acme.github.io/lego/usage/cli/options/>.
|
|
'';
|
|
};
|
|
|
|
dnsProvider = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
inherit (defaultAndText "dnsProvider" null) default defaultText;
|
|
example = "route53";
|
|
description = ''
|
|
DNS Challenge provider. For a list of supported providers, see the "code"
|
|
field of the DNS providers listed at <https://go-acme.github.io/lego/dns/>.
|
|
'';
|
|
};
|
|
|
|
dnsResolver = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
inherit (defaultAndText "dnsResolver" null) default defaultText;
|
|
example = "1.1.1.1:53";
|
|
description = ''
|
|
Set the resolver to use for performing recursive DNS queries. Supported:
|
|
host:port. The default is to use the system resolvers, or Google's DNS
|
|
resolvers if the system's cannot be determined.
|
|
'';
|
|
};
|
|
|
|
environmentFile = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.path;
|
|
inherit (defaultAndText "environmentFile" null) default defaultText;
|
|
description = ''
|
|
Path to an EnvironmentFile for the cert's service containing any required and
|
|
optional environment variables for your selected dnsProvider.
|
|
To find out what values you need to set, consult the documentation at
|
|
<https://go-acme.github.io/lego/dns/> for the corresponding dnsProvider.
|
|
'';
|
|
example = "/var/src/secrets/example.org-route53-api-token";
|
|
};
|
|
|
|
credentialFiles = lib.mkOption {
|
|
type = lib.types.attrsOf (lib.types.path);
|
|
inherit (defaultAndText "credentialFiles" {}) default defaultText;
|
|
description = ''
|
|
Environment variables suffixed by "_FILE" to set for the cert's service
|
|
for your selected dnsProvider.
|
|
To find out what values you need to set, consult the documentation at
|
|
<https://go-acme.github.io/lego/dns/> for the corresponding dnsProvider.
|
|
This allows to securely pass credential files to lego by leveraging systemd
|
|
credentials.
|
|
'';
|
|
example = lib.literalExpression ''
|
|
{
|
|
"RFC2136_TSIG_SECRET_FILE" = "/run/secrets/tsig-secret-example.org";
|
|
}
|
|
'';
|
|
};
|
|
|
|
dnsPropagationCheck = lib.mkOption {
|
|
type = lib.types.bool;
|
|
inherit (defaultAndText "dnsPropagationCheck" true) default defaultText;
|
|
description = ''
|
|
Toggles lego DNS propagation check, which is used alongside DNS-01
|
|
challenge to ensure the DNS entries required are available.
|
|
'';
|
|
};
|
|
|
|
ocspMustStaple = lib.mkOption {
|
|
type = lib.types.bool;
|
|
inherit (defaultAndText "ocspMustStaple" false) default defaultText;
|
|
description = ''
|
|
Turns on the OCSP Must-Staple TLS extension.
|
|
Make sure you know what you're doing! See:
|
|
|
|
- <https://blog.apnic.net/2019/01/15/is-the-web-ready-for-ocsp-must-staple/>
|
|
- <https://blog.hboeck.de/archives/886-The-Problem-with-OCSP-Stapling-and-Must-Staple-and-why-Certificate-Revocation-is-still-broken.html>
|
|
'';
|
|
};
|
|
|
|
extraLegoFlags = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
inherit (defaultAndText "extraLegoFlags" []) default defaultText;
|
|
description = ''
|
|
Additional global flags to pass to all lego commands.
|
|
'';
|
|
};
|
|
|
|
extraLegoRenewFlags = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
inherit (defaultAndText "extraLegoRenewFlags" []) default defaultText;
|
|
description = ''
|
|
Additional flags to pass to lego renew.
|
|
'';
|
|
};
|
|
|
|
extraLegoRunFlags = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
inherit (defaultAndText "extraLegoRunFlags" []) default defaultText;
|
|
description = ''
|
|
Additional flags to pass to lego run.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
|
|
certOpts = { name, config, ... }: {
|
|
options = {
|
|
# user option has been removed
|
|
user = lib.mkOption {
|
|
visible = false;
|
|
default = "_mkRemovedOptionModule";
|
|
};
|
|
|
|
# allowKeysForGroup option has been removed
|
|
allowKeysForGroup = lib.mkOption {
|
|
visible = false;
|
|
default = "_mkRemovedOptionModule";
|
|
};
|
|
|
|
# extraDomains was replaced with extraDomainNames
|
|
extraDomains = lib.mkOption {
|
|
visible = false;
|
|
default = "_mkMergedOptionModule";
|
|
};
|
|
|
|
directory = lib.mkOption {
|
|
type = lib.types.str;
|
|
readOnly = true;
|
|
default = "/var/lib/acme/${name}";
|
|
description = "Directory where certificate and other state is stored.";
|
|
};
|
|
|
|
domain = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = name;
|
|
description = "Domain to fetch certificate for (defaults to the entry name).";
|
|
};
|
|
|
|
extraDomainNames = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
default = [];
|
|
example = lib.literalExpression ''
|
|
[
|
|
"example.org"
|
|
"mydomain.org"
|
|
]
|
|
'';
|
|
description = ''
|
|
A list of extra domain names, which are included in the one certificate to be issued.
|
|
'';
|
|
};
|
|
|
|
# This setting must be different for each configured certificate, otherwise
|
|
# two or more renewals may fail to bind to the address. Hence, it is not in
|
|
# the inheritableOpts.
|
|
listenHTTP = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
default = null;
|
|
example = ":1360";
|
|
description = ''
|
|
Interface and port to listen on to solve HTTP challenges
|
|
in the form [INTERFACE]:PORT.
|
|
If you use a port other than 80, you must proxy port 80 to this port.
|
|
'';
|
|
};
|
|
|
|
s3Bucket = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
default = null;
|
|
example = "acme";
|
|
description = ''
|
|
S3 bucket name to use for HTTP-01 based challenges. Challenges will be written to the S3 bucket.
|
|
'';
|
|
};
|
|
|
|
inheritDefaults = lib.mkOption {
|
|
default = true;
|
|
example = true;
|
|
description = "Whether to inherit values set in `security.acme.defaults` or not.";
|
|
type = lib.types.bool;
|
|
};
|
|
};
|
|
};
|
|
|
|
in {
|
|
|
|
options = {
|
|
security.acme = {
|
|
preliminarySelfsigned = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = true;
|
|
description = ''
|
|
Whether a preliminary self-signed certificate should be generated before
|
|
doing ACME requests. This can be useful when certificates are required in
|
|
a webserver, but ACME needs the webserver to make its requests.
|
|
|
|
With preliminary self-signed certificate the webserver can be started and
|
|
can later reload the correct ACME certificates.
|
|
'';
|
|
};
|
|
|
|
acceptTerms = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = ''
|
|
Accept the CA's terms of service. The default provider is Let's Encrypt,
|
|
you can find their ToS at <https://letsencrypt.org/repository/>.
|
|
'';
|
|
};
|
|
|
|
useRoot = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = ''
|
|
Whether to use the root user when generating certs. This is not recommended
|
|
for security + compatibility reasons. If a service requires root owned certificates
|
|
consider following the guide on "Using ACME with services demanding root
|
|
owned certificates" in the NixOS manual, and only using this as a fallback
|
|
or for testing.
|
|
'';
|
|
};
|
|
|
|
defaults = lib.mkOption {
|
|
type = lib.types.submodule (inheritableModule true);
|
|
description = ''
|
|
Default values inheritable by all configured certs. You can
|
|
use this to define options shared by all your certs. These defaults
|
|
can also be ignored on a per-cert basis using the
|
|
{option}`security.acme.certs.''${cert}.inheritDefaults` option.
|
|
'';
|
|
};
|
|
|
|
certs = lib.mkOption {
|
|
default = { };
|
|
type = with lib.types; attrsOf (submodule [ (inheritableModule false) certOpts ]);
|
|
description = ''
|
|
Attribute set of certificates to get signed and renewed. Creates
|
|
`acme-''${cert}.{service,timer}` systemd units for
|
|
each certificate defined here. Other services can add dependencies
|
|
to those units if they rely on the certificates being present,
|
|
or trigger restarts of the service if certificates get renewed.
|
|
'';
|
|
example = lib.literalExpression ''
|
|
{
|
|
"example.com" = {
|
|
webroot = "/var/lib/acme/acme-challenge/";
|
|
email = "foo@example.com";
|
|
extraDomainNames = [ "www.example.com" "foo.example.com" ];
|
|
};
|
|
"bar.example.com" = {
|
|
webroot = "/var/lib/acme/acme-challenge/";
|
|
email = "bar@example.com";
|
|
};
|
|
}
|
|
'';
|
|
};
|
|
maxConcurrentRenewals = lib.mkOption {
|
|
default = 5;
|
|
type = lib.types.int;
|
|
description = ''
|
|
Maximum number of concurrent certificate generation or renewal jobs. All other
|
|
jobs will queue and wait running jobs to finish. Reduces the system load of
|
|
certificate generation.
|
|
|
|
Set to `0` to allow unlimited number of concurrent job runs."
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
|
|
imports = [
|
|
(lib.mkRemovedOptionModule [ "security" "acme" "production" ] ''
|
|
Use security.acme.server to define your staging ACME server URL instead.
|
|
|
|
To use the let's encrypt staging server, use security.acme.server =
|
|
"https://acme-staging-v02.api.letsencrypt.org/directory".
|
|
'')
|
|
(lib.mkRemovedOptionModule [ "security" "acme" "directory" ] "ACME Directory is now hardcoded to /var/lib/acme and its permissions are managed by systemd. See https://github.com/NixOS/nixpkgs/issues/53852 for more info.")
|
|
(lib.mkRemovedOptionModule [ "security" "acme" "preDelay" ] "This option has been removed. If you want to make sure that something executes before certificates are provisioned, add a RequiredBy=acme-\${cert}.service to the service you want to execute before the cert renewal")
|
|
(lib.mkRemovedOptionModule [ "security" "acme" "activationDelay" ] "This option has been removed. If you want to make sure that something executes before certificates are provisioned, add a RequiredBy=acme-\${cert}.service to the service you want to execute before the cert renewal")
|
|
(lib.mkChangedOptionModule [ "security" "acme" "validMin" ] [ "security" "acme" "defaults" "validMinDays" ] (config: config.security.acme.validMin / (24 * 3600)))
|
|
(lib.mkChangedOptionModule [ "security" "acme" "validMinDays" ] [ "security" "acme" "defaults" "validMinDays" ] (config: config.security.acme.validMinDays))
|
|
(lib.mkChangedOptionModule [ "security" "acme" "renewInterval" ] [ "security" "acme" "defaults" "renewInterval" ] (config: config.security.acme.renewInterval))
|
|
(lib.mkChangedOptionModule [ "security" "acme" "email" ] [ "security" "acme" "defaults" "email" ] (config: config.security.acme.email))
|
|
(lib.mkChangedOptionModule [ "security" "acme" "server" ] [ "security" "acme" "defaults" "server" ] (config: config.security.acme.server))
|
|
(lib.mkChangedOptionModule [ "security" "acme" "enableDebugLogs" ] [ "security" "acme" "defaults" "enableDebugLogs" ] (config: config.security.acme.enableDebugLogs))
|
|
];
|
|
|
|
config = lib.mkMerge [
|
|
(lib.mkIf (cfg.certs != { }) {
|
|
|
|
# FIXME Most of these custom warnings and filters for security.acme.certs.* are required
|
|
# because using mkRemovedOptionModule/mkChangedOptionModule with attrsets isn't possible.
|
|
warnings = lib.filter (w: w != "") (lib.mapAttrsToList (cert: data: lib.optionalString (data.extraDomains != "_mkMergedOptionModule") ''
|
|
The option definition `security.acme.certs.${cert}.extraDomains` has changed
|
|
to `security.acme.certs.${cert}.extraDomainNames` and is now a list of strings.
|
|
Setting a custom webroot for extra domains is not possible, instead use separate certs.
|
|
'') cfg.certs);
|
|
|
|
assertions = let
|
|
certs = lib.attrValues cfg.certs;
|
|
in [
|
|
{
|
|
assertion = cfg.defaults.email != null || lib.all (certOpts: certOpts.email != null) certs;
|
|
message = ''
|
|
You must define `security.acme.certs.<name>.email` or
|
|
`security.acme.defaults.email` to register with the CA. Note that using
|
|
many different addresses for certs may trigger account rate limits.
|
|
'';
|
|
}
|
|
{
|
|
assertion = cfg.acceptTerms;
|
|
message = ''
|
|
You must accept the CA's terms of service before using
|
|
the ACME module by setting `security.acme.acceptTerms`
|
|
to `true`. For Let's Encrypt's ToS see https://letsencrypt.org/repository/
|
|
'';
|
|
}
|
|
] ++ (builtins.concatLists (lib.mapAttrsToList (cert: data: [
|
|
{
|
|
assertion = data.user == "_mkRemovedOptionModule";
|
|
message = ''
|
|
The option definition `security.acme.certs.${cert}.user' no longer has any effect; Please remove it.
|
|
Certificate user is now hard coded to the "acme" user. If you would
|
|
like another user to have access, consider adding them to the
|
|
"acme" group or changing security.acme.certs.${cert}.group.
|
|
'';
|
|
}
|
|
{
|
|
assertion = data.allowKeysForGroup == "_mkRemovedOptionModule";
|
|
message = ''
|
|
The option definition `security.acme.certs.${cert}.allowKeysForGroup' no longer has any effect; Please remove it.
|
|
All certs are readable by the configured group. If this is undesired,
|
|
consider changing security.acme.certs.${cert}.group to an unused group.
|
|
'';
|
|
}
|
|
# * in the cert value breaks building of systemd services, and makes
|
|
# referencing them as a user quite weird too. Best practice is to use
|
|
# the domain option.
|
|
{
|
|
assertion = ! lib.hasInfix "*" cert;
|
|
message = ''
|
|
The cert option path `security.acme.certs.${cert}.dnsProvider`
|
|
cannot contain a * character.
|
|
Instead, set `security.acme.certs.${cert}.domain = "${cert}";`
|
|
and remove the wildcard from the path.
|
|
'';
|
|
}
|
|
(let exclusiveAttrs = {
|
|
inherit (data) dnsProvider webroot listenHTTP s3Bucket;
|
|
}; in {
|
|
assertion = lib.length (lib.filter (x: x != null) (builtins.attrValues exclusiveAttrs)) == 1;
|
|
message = ''
|
|
Exactly one of the options
|
|
`security.acme.certs.${cert}.dnsProvider`,
|
|
`security.acme.certs.${cert}.webroot`,
|
|
`security.acme.certs.${cert}.listenHTTP` and
|
|
`security.acme.certs.${cert}.s3Bucket`
|
|
is required.
|
|
Current values: ${(lib.generators.toPretty {} exclusiveAttrs)}.
|
|
'';
|
|
})
|
|
{
|
|
assertion = lib.all (lib.hasSuffix "_FILE") (lib.attrNames data.credentialFiles);
|
|
message = ''
|
|
Option `security.acme.certs.${cert}.credentialFiles` can only be
|
|
used for variables suffixed by "_FILE".
|
|
'';
|
|
}
|
|
]) cfg.certs));
|
|
|
|
users.users.acme = {
|
|
home = "/var/lib/acme";
|
|
group = "acme";
|
|
isSystemUser = true;
|
|
};
|
|
|
|
users.groups.acme = {};
|
|
|
|
# for lock files, still use tmpfiles as they should better reside in /run
|
|
systemd.tmpfiles.rules = [
|
|
"d ${lockdir} 0700 ${user} - - -"
|
|
"Z ${lockdir} 0700 ${user} - - -"
|
|
];
|
|
|
|
systemd.services = let
|
|
renewServiceFunctions = lib.mapAttrs' (cert: conf: lib.nameValuePair "acme-${cert}" conf.renewService) certConfigs;
|
|
renewServices = if cfg.maxConcurrentRenewals > 0
|
|
then roundRobinApplyAttrs renewServiceFunctions concurrencyLockfiles
|
|
else lib.mapAttrs (_: f: f null) renewServiceFunctions;
|
|
selfsignServiceFunctions = lib.mapAttrs' (cert: conf: lib.nameValuePair "acme-selfsigned-${cert}" conf.selfsignService) certConfigs;
|
|
selfsignServices = if cfg.maxConcurrentRenewals > 0
|
|
then roundRobinApplyAttrs selfsignServiceFunctions concurrencyLockfiles
|
|
else lib.mapAttrs (_: f: f null) selfsignServiceFunctions;
|
|
in
|
|
{ "acme-fixperms" = userMigrationService; }
|
|
// (lib.optionalAttrs (cfg.maxConcurrentRenewals > 0) {"acme-lockfiles" = lockfilePrepareService; })
|
|
// renewServices
|
|
// (lib.optionalAttrs (cfg.preliminarySelfsigned) ({
|
|
"acme-selfsigned-ca" = selfsignCAService;
|
|
} // selfsignServices));
|
|
|
|
systemd.timers = lib.mapAttrs' (cert: conf: lib.nameValuePair "acme-${cert}" conf.renewTimer) certConfigs;
|
|
|
|
systemd.targets = let
|
|
# Create some targets which can be depended on to be "active" after cert renewals
|
|
finishedTargets = lib.mapAttrs' (cert: conf: lib.nameValuePair "acme-finished-${cert}" {
|
|
wantedBy = [ "default.target" ];
|
|
requires = [ "acme-${cert}.service" ];
|
|
after = [ "acme-${cert}.service" ];
|
|
}) certConfigs;
|
|
|
|
# Create targets to limit the number of simultaneous account creations
|
|
# How it works:
|
|
# - Pick a "leader" cert service, which will be in charge of creating the account,
|
|
# and run first (requires + after)
|
|
# - Make all other cert services sharing the same account wait for the leader to
|
|
# finish before starting (requiredBy + before).
|
|
# Using a target here is fine - account creation is a one time event. Even if
|
|
# systemd clean --what=state is used to delete the account, so long as the user
|
|
# then runs one of the cert services, there won't be any issues.
|
|
accountTargets = lib.mapAttrs' (hash: confs: let
|
|
leader = "acme-${(builtins.head confs).cert}.service";
|
|
dependantServices = map (conf: "acme-${conf.cert}.service") (builtins.tail confs);
|
|
in lib.nameValuePair "acme-account-${hash}" {
|
|
requiredBy = dependantServices;
|
|
before = dependantServices;
|
|
requires = [ leader ];
|
|
after = [ leader ];
|
|
}) (lib.groupBy (conf: conf.accountHash) (lib.attrValues certConfigs));
|
|
in finishedTargets // accountTargets;
|
|
})
|
|
];
|
|
|
|
meta = {
|
|
maintainers = lib.teams.acme.members;
|
|
doc = ./default.md;
|
|
};
|
|
}
|