Files
nixarr/nixarr/nixarr-command/default.nix
T
2025-06-16 08:53:16 +02:00

216 lines
10 KiB
Nix

{
inputs,
config,
pkgs,
lib,
...
}:
with lib; let
nixarr = config.nixarr;
globals = config.util-nixarr.globals;
nixarr-command = pkgs.writeShellApplication {
name = "nixarr";
runtimeInputs = with pkgs; [
util-linux
yq
gnugrep
gnused
];
text = ''
command="''${1:-}"
# Check if a parameter is provided
if [ -z "$command" ]; then
echo "Usage: nixarr <command>"
echo ""
echo "Commands:"
echo " fix-permissions Sets correct permissions for any directory managed by Nixarr."
echo " list-api-keys Lists API keys of supported enabled services."
echo " list-unlinked <path> Lists unlinked directories and files, in the given directory."
echo " Use the jdupes command to hardlink duplicates from there."
echo " wipe-uids-gids The update on 2025-06-03 causes issues with UID/GIDs,"
echo " run this command, then rebuild and finally run"
echo " nixarr fix-permissions, to fix these issues."
exit 1
fi
fix-permissions() {
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit
fi
find "${nixarr.mediaDir}" \( -type d -exec chmod 0775 {} + -true \) -o \( -exec chmod 0664 {} + \)
${strings.optionalString nixarr.jellyfin.enable ''
chown -R ${globals.libraryOwner.user}:${globals.libraryOwner.group} "${nixarr.mediaDir}/library"
chown -R ${globals.jellyfin.user}:root "${nixarr.jellyfin.stateDir}"
find "${nixarr.jellyfin.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.plex.enable ''
chown -R ${globals.libraryOwner.user}:${globals.libraryOwner.group} "${nixarr.mediaDir}/library"
chown -R ${globals.plex.user}:root "${nixarr.plex.stateDir}"
find "${nixarr.plex.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.audiobookshelf.enable ''
chown -R ${globals.libraryOwner.user}:${globals.libraryOwner.group} "${nixarr.mediaDir}/library"
chown -R ${globals.audiobookshelf.user}:root "${nixarr.audiobookshelf.stateDir}"
find "${nixarr.audiobookshelf.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.transmission.enable ''
chown -R ${globals.transmission.user}:${globals.transmission.group} "${nixarr.mediaDir}/torrents"
chown -R ${globals.transmission.user}:${globals.cross-seed.group} "${nixarr.transmission.stateDir}"
find "${nixarr.transmission.stateDir}" \( -type d -exec chmod 0750 {} + -true \) -o \( -exec chmod 0640 {} + \)
''}
${strings.optionalString nixarr.sabnzbd.enable ''
chown -R ${globals.sabnzbd.user}:${globals.sabnzbd.group} "${nixarr.mediaDir}/usenet"
chown -R ${globals.sabnzbd.user}:root "${nixarr.sabnzbd.stateDir}"
find "${nixarr.sabnzbd.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.transmission.privateTrackers.cross-seed.enable ''
chown -R ${globals.cross-seed.user}:root "${nixarr.transmission.privateTrackers.cross-seed.stateDir}"
find "${nixarr.transmission.privateTrackers.cross-seed.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.prowlarr.enable ''
chown -R ${globals.prowlarr.user}:root "${nixarr.prowlarr.stateDir}"
find "${nixarr.prowlarr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.sonarr.enable ''
chown -R ${globals.sonarr.user}:root "${nixarr.sonarr.stateDir}"
find "${nixarr.sonarr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.radarr.enable ''
chown -R ${globals.radarr.user}:root "${nixarr.radarr.stateDir}"
find "${nixarr.radarr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.lidarr.enable ''
chown -R ${globals.lidarr.user}:root "${nixarr.lidarr.stateDir}"
find "${nixarr.lidarr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.bazarr.enable ''
chown -R ${globals.bazarr.user}:root "${nixarr.bazarr.stateDir}"
find "${nixarr.bazarr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.readarr.enable ''
chown -R ${globals.readarr.user}:root "${nixarr.readarr.stateDir}"
find "${nixarr.readarr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.readarr-audiobook.enable ''
chown -R ${globals.readarr.user}:root "${nixarr.readarr-audiobook.stateDir}"
find "${nixarr.readarr-audiobook.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.jellyseerr.enable ''
chown -R ${globals.jellyseerr.user}:root "${nixarr.jellyseerr.stateDir}"
find "${nixarr.jellyseerr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.autobrr.enable ''
chown -R ${globals.autobrr.user}:root "${nixarr.autobrr.stateDir}"
find "${nixarr.autobrr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
${strings.optionalString nixarr.recyclarr.enable ''
chown -R ${globals.recyclarr.user}:root "${nixarr.recyclarr.stateDir}"
find "${nixarr.recyclarr.stateDir}" \( -type d -exec chmod 0700 {} + -true \) -o \( -exec chmod 0600 {} + \)
''}
}
list-unlinked() {
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters. Usage: nixarr list-unlinked <path>"
fi
find "$1" -type f -links 1 -exec du -h {} + | sort -h
}
list-api-keys() {
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit
fi
${strings.optionalString nixarr.bazarr.enable ''
BAZARR=$(yq '.auth.apikey' "${nixarr.bazarr.stateDir}/config/config.yaml")
echo "Bazarr api-key: $BAZARR"
''}
${strings.optionalString nixarr.jellyseerr.enable ''
JELLYSEERR=$(yq '.main.apiKey' "${nixarr.jellyseerr.stateDir}/settings.json")
echo "Jellyseerr api-key: $JELLYSEERR"
''}
${strings.optionalString nixarr.lidarr.enable ''
LIDARR=$(xq '.Config.ApiKey' "${nixarr.lidarr.stateDir}/config.xml")
echo "Lidarr api-key: $LIDARR"
''}
${strings.optionalString nixarr.prowlarr.enable ''
PROWLARR=$(xq '.Config.ApiKey' "${nixarr.prowlarr.stateDir}/config.xml")
echo "Prowlarr api-key: $PROWLARR"
''}
${strings.optionalString nixarr.radarr.enable ''
RADARR=$(xq '.Config.ApiKey' "${nixarr.radarr.stateDir}/config.xml")
echo "Radarr api-key: $RADARR"
''}
${strings.optionalString nixarr.readarr.enable ''
READARR=$(xq '.Config.ApiKey' "${nixarr.readarr.stateDir}/config.xml")
echo "Readarr api-key: $READARR"
''}
${strings.optionalString nixarr.readarr-audiobook.enable ''
READARR_AUDIOBOOK=$(xq -r '.Config.ApiKey' "${nixarr.readarr-audiobook.stateDir}/config.xml")
echo "Readarr Audiobook api-key: $READARR_AUDIOBOOK"
''}
${strings.optionalString nixarr.sabnzbd.enable ''
SABNZBD=$(grep api_key ${nixarr.sabnzbd.stateDir}/sabnzbd.ini | sed 's/^api_key.*= *//g')
echo "Sabnzbd api-key: \"$SABNZBD\""
''}
${strings.optionalString nixarr.sonarr.enable ''
SONARR=$(xq '.Config.ApiKey' "${nixarr.sonarr.stateDir}/config.xml")
echo "Sonarr api-key: $SONARR"
''}
${strings.optionalString nixarr.sonarr.enable ''
TRANSMISSION_RPC_USER=$(yq '.["rpc-username"]' "${nixarr.transmission.stateDir}/.config/transmission-daemon/settings.json")
TRANSMISSION_RPC_PASS=$(yq '.["rpc-password"]' "${nixarr.transmission.stateDir}/.config/transmission-daemon/settings.json")
echo "Transmission rpc-username: $TRANSMISSION_RPC_USER"
echo "Transmission rpc-password: $TRANSMISSION_RPC_PASS"
''}
}
wipe-uids-gids() {
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit
fi
echo "Backing up /etc/passwd and /etc/group..."
mkdir -p "${nixarr.stateDir}/migration-backup"
cp /etc/passwd "${nixarr.stateDir}/migration-backup/passwd.bak"
cp /etc/group "${nixarr.stateDir}/migration-backup/group.bak"
echo "Wiping all nixarr users and groups from /etc/passwd and /etc/group..."
sed -i -E '/^(audiobookshelf|autobrr|bazarr|cross-seed|jellyfin|jellyseerr|lidarr|plex|prowlarr|radarr|readarr|recyclarr|sabnzbd|sonarr|streamer|torrenter|transmission|usenet)/d' /etc/passwd
sed -i -E '/^(autobrr|cross-seed|jellyseerr|media|prowlarr|recyclarr|sabnzbd|streamer|torrenter|transmission|usenet)/d' /etc/group
echo ""
echo "Done, please rebuild your configuration to get back the users and groups. This time, they will have the correct permissions."
echo "After rebuilding, make sure to run: nixarr fix-permissions"
}
COMMAND="$1"
shift
case "$COMMAND" in
fix-permissions)
fix-permissions
;;
list-unlinked)
list-unlinked "$@"
;;
list-api-keys)
list-api-keys
;;
wipe-uids-gids)
wipe-uids-gids
;;
esac
'';
};
in mkIf nixarr.enable {
config.environment.systemPackages = [nixarr-command];
}