Added stuf for installing packages and such

This commit is contained in:
2026-03-09 15:46:41 +01:00
parent ec4b5bf1f6
commit 9c79023fad
4 changed files with 206 additions and 92 deletions
+22
View File
@@ -0,0 +1,22 @@
##############################################
# These files are just for reference.
# If you want to change anything, edit the source files in:
# ~/henrovnix/assets/conf
#
# After that, run:
# cd ~/henrovnix && emacs README.org --batch -f org-babel-tangle && git add . && git commit -m "Adjusted conf files" && sudo nixos-rebuild switch --flake .#<yourhost>
#
# If everything still works, you can use the same command but:
# - keep "switch"
# - and add a reboot:
#
# cd ~/henrovnix && sudo nixos-rebuild switch --flake .#<yourhost> && systemctl reboot
#
# NOTE:
# Make sure the lines starting with: cd ~/henrovnix
# are written as ONE single line.
##############################################
#app.zen_browser.zen
com.github.tchx84.Flatseal
eu.betterbird.Betterbird
com.todoist.Todoist
+79
View File
@@ -0,0 +1,79 @@
##############################################
# These files are just for reference.
# If you want to change anything, edit the source files in:
# ~/henrovnix/assets/conf
#
# After that, run:
# cd ~/henrovnix && emacs README.org --batch -f org-babel-tangle && git add . && git commit -m "Adjusted conf files" && sudo nixos-rebuild switch --flake .#<yourhost>
#
# If everything still works, you can use the same command but:
# - keep "switch"
# - and add a reboot:
#
# cd ~/henrovnix && sudo nixos-rebuild switch --flake .#<yourhost> && systemctl reboot
#
# Make sure the lines starting with: cd ~/henrovnix
# are written as ONE single line.
#
#IMPORTANT:
# Only packages/attributes that exist in Nixpkgs can be installed.
# Check names on https://search.nixos.org/packages
# A wrong package name (or attribute path) will cause the Nix build to fail.
###############################################
# system
nixVersions.latest
wofi
xdg-utils
desktop-file-utils
playerctl
mpv
networkmanagerapplet
#productivity
todoist
# browsers
brave
vivaldi
chromium
# hyprland
hyprpaper
# utils
wget
kdePackages.kdeconnect-kde
_1password-gui
tree
gparted
file
htop
wev
solaar
baobab
duf
zed-editor
# office
obsidian
onlyoffice-desktopeditors
# development
postman
tea
#jetbrains.pycharm
python3
# communication
nextcloud-talk-desktop
signal-desktop
openssl
# multimedia
audacity
handbrake
spotify
vlc
@@ -1,101 +1,111 @@
{ config, pkgs, lib, flakeRoot, ... }:
{
config,
pkgs,
lib,
flakeRoot,
...
}:
let
moduleName = "install-flatpaks";
flatpakConfPath = flakeRoot.outPath + "/assets/conf/apps/flatpaks.conf";
flatpakConfPath = flakeRoot.outPath + "/assets/common/apps/flatpaks.conf";
raw = builtins.readFile flatpakConfPath;
# Explicit "\n" so we never accidentally split into characters
rawLines = lib.splitString "\n" raw;
# Guard: if we accidentally split into characters, rawLines length ~= stringLength raw
_guard = assert !(
builtins.stringLength raw > 1 &&
builtins.length rawLines == builtins.stringLength raw
); true;
_guard =
assert !(builtins.stringLength raw > 1 && builtins.length rawLines == builtins.stringLength raw);
true;
cleanLine = l:
let
noCR = lib.replaceStrings [ "\r" ] [ "" ] l;
noInlineComment = lib.head (lib.splitString "#" noCR);
in
lib.strings.trim noInlineComment;
cleanLine =
l:
let
noCR = lib.replaceStrings [ "\r" ] [ "" ] l;
noInlineComment = lib.head (lib.splitString "#" noCR);
in
lib.strings.trim noInlineComment;
entries =
builtins.filter (l: l != "")
(map cleanLine rawLines);
entries = builtins.filter (l: l != "") (map cleanLine rawLines);
# Flatpak app IDs are reverse-DNS style like org.example.App (at least 2 dots).
# We'll validate and fail early with a clear message.
dotCount = s: builtins.length (lib.splitString "." s) - 1;
isValidId = s:
(dotCount s) >= 2; # matches the error you're seeing: "at least 2 periods"
isValidId = s: (dotCount s) >= 2; # matches the error you're seeing: "at least 2 periods"
_validate =
builtins.seq _guard (
builtins.map (id:
if isValidId id then true else
throw ''
${moduleName}: invalid Flatpak ID in flatpaks.conf (needs reverse-DNS with at least 2 dots)
_validate = builtins.seq _guard (
builtins.map (
id:
if isValidId id then
true
else
throw ''
${moduleName}: invalid Flatpak ID in flatpaks.conf (needs reverse-DNS with at least 2 dots)
Token : ${builtins.toJSON id}
flatpaks.conf : ${toString flatpakConfPath}
Token : ${builtins.toJSON id}
flatpaks.conf : ${toString flatpakConfPath}
Fix: remove stray tokens/headers, or comment them out with '#'.
''
) entries
Fix: remove stray tokens/headers, or comment them out with '#'.
''
) entries
);
# Use validated entries
flatpakApps = builtins.seq _validate entries;
syncFlatpaks = pkgs.writeShellScript "sync-flatpaks" ''
set -euo pipefail
set -euo pipefail
# Use the deployed config path (matches environment.etc below)
CONF="/etc/flatpak/flatpaks.conf"
if [[ -f "$CONF" ]]; then
echo "flatpak-sync: using $CONF"
else
echo "flatpak-sync: WARNING: $CONF not found, using embedded list"
fi
# Use the deployed config path (matches environment.etc below)
CONF="/etc/flatpak/flatpaks.conf"
if [[ -f "$CONF" ]]; then
echo "flatpak-sync: using $CONF"
else
echo "flatpak-sync: WARNING: $CONF not found, using embedded list"
fi
if ! flatpak remotes --system --columns=name | grep -qx flathub; then
flatpak remote-add --system --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
fi
if ! flatpak remotes --system --columns=name | grep -qx flathub; then
flatpak remote-add --system --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
fi
desired_apps=(
${lib.concatStringsSep "\n" (map (a: ''"${a}"'') flatpakApps)}
)
desired_apps=(
${lib.concatStringsSep "\n" (map (a: ''"${a}"'') flatpakApps)}
)
for app in "''${desired_apps[@]}"; do
if ! flatpak info --system "$app" >/dev/null 2>&1; then
flatpak install --system -y --noninteractive flathub "$app"
fi
done
for app in "''${desired_apps[@]}"; do
if ! flatpak info --system "$app" >/dev/null 2>&1; then
flatpak install --system -y --noninteractive flathub "$app"
fi
done
'';
in
{
services.flatpak.enable = true;
xdg.portal = {
enable = true;
enable = true;
};
# Deploy the config file for runtime visibility/debugging
environment.etc."flatpak/flatpaks.conf".source = lib.mkForce flatpakConfPath;
systemd.services.flatpak-sync = {
description = "Install Flatpak apps listed in flatpaks.conf";
wantedBy = [ "multi-user.target" ];
wants = [ "network-online.target" ];
after = [ "network-online.target" ];
description = "Install Flatpak apps listed in flatpaks.conf";
wantedBy = [ "multi-user.target" ];
wants = [ "network-online.target" ];
after = [ "network-online.target" ];
serviceConfig = {
Type = "oneshot";
ExecStart = syncFlatpaks;
};
serviceConfig = {
Type = "oneshot";
ExecStart = syncFlatpaks;
};
restartTriggers = [ flatpakConfPath ];
path = [ pkgs.flatpak pkgs.coreutils pkgs.gnugrep pkgs.gnused ];
restartTriggers = [ flatpakConfPath ];
path = [
pkgs.flatpak
pkgs.coreutils
pkgs.gnugrep
pkgs.gnused
];
};
}
@@ -1,43 +1,46 @@
{ config, lib, pkgs, flakeRoot, inputs, ... }:
{
config,
lib,
pkgs,
flakeRoot,
inputs,
...
}:
let
packagesConfPath = flakeRoot.outPath + "/assets/conf/apps/packages.conf";
packagesConfPath = flakeRoot.outPath + "/assets/common/apps/packages.conf";
raw = builtins.readFile packagesConfPath;
# IMPORTANT: explicit "\n" so we never accidentally split into characters
rawLines = lib.splitString "\n" raw;
# Guard: if we accidentally split into characters, rawLines length ~= stringLength raw
_guard = assert !(
builtins.stringLength raw > 1 &&
builtins.length rawLines == builtins.stringLength raw
); true;
cleanLine = l:
let
noCR = lib.replaceStrings [ "\r" ] [ "" ] l;
noInlineComment = lib.head (lib.splitString "#" noCR);
in
lib.strings.trim noInlineComment;
entries =
builtins.filter (l: l != "")
(map cleanLine rawLines);
resolvePkg = name:
let
parts = lib.splitString "." name;
found = lib.attrByPath parts null pkgs;
in
if found == null then
throw ''
packages.nix: package not found in pkgs
Token : ${builtins.toJSON name}
packages.conf : ${toString packagesConfPath}
Hint : check the attribute name on search.nixos.org/packages
''
else
found;
_guard =
assert !(builtins.stringLength raw > 1 && builtins.length rawLines == builtins.stringLength raw);
true;
cleanLine =
l:
let
noCR = lib.replaceStrings [ "\r" ] [ "" ] l;
noInlineComment = lib.head (lib.splitString "#" noCR);
in
lib.strings.trim noInlineComment;
entries = builtins.filter (l: l != "") (map cleanLine rawLines);
resolvePkg =
name:
let
parts = lib.splitString "." name;
found = lib.attrByPath parts null pkgs;
in
if found == null then
throw ''
packages.nix: package not found in pkgs
Token : ${builtins.toJSON name}
packages.conf : ${toString packagesConfPath}
Hint : check the attribute name on search.nixos.org/packages
''
else
found;
packages = builtins.seq _guard (map resolvePkg entries);
zenBrowser =
inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default;
zenBrowser = inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default;
in
{
environment.systemPackages =
packages
++ [ zenBrowser ];
environment.systemPackages = packages ++ [ zenBrowser ];
}