diff --git a/hosts/bekkalokk/services/website/fetch-gallery.nix b/hosts/bekkalokk/services/website/fetch-gallery.nix index 0271971..a5be54c 100644 --- a/hosts/bekkalokk/services/website/fetch-gallery.nix +++ b/hosts/bekkalokk/services/website/fetch-gallery.nix @@ -1,5 +1,61 @@ { pkgs, lib, config, ... }: -{ +let + galleryDir = config.services.pvv-nettsiden.settings.GALLERY.DIR; + transferDir = "${config.services.pvv-nettsiden.settings.GALLERY.DIR}-transfer"; +in { + users.users.${config.services.pvv-nettsiden.user} = { + useDefaultShell = true; + # This is pushed from microbel:/var/www/www-gallery/build-gallery.sh + openssh.authorizedKeys.keys = [ + ''command="${pkgs.rrsync}/bin/rrsync -wo ${transferDir}",restrict,no-agent-forwarding,no-port-forwarding,no-pty,no-X11-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIjHhC2dikhWs/gG+m7qP1eSohWzTehn4ToNzDSOImyR gallery-publish'' + ]; + }; + + systemd.paths.pvv-nettsiden-gallery-update = { + wantedBy = [ "multi-user.target" ]; + pathConfig = { + PathChanged = "${transferDir}/gallery.tar.gz"; + Unit = "pvv-nettsiden-gallery-update.service"; + MakeDirectory = true; + }; + }; + + systemd.services.pvv-nettsiden-gallery-update = { + path = with pkgs; [ imagemagick gnutar gzip ]; + + script = '' + tar ${lib.cli.toGNUCommandLineShell {} { + extract = true; + file = "${transferDir}/gallery.tar.gz"; + directory = "."; + }} + + # Delete files and directories that exists in the gallery that don't exist in the tarball + filesToRemove=$(uniq -u <(sort <(find . -not -path "./.thumbnails*") <(tar -tf ${transferDir}/gallery.tar.gz | sed 's|/$||'))) + while IFS= read fname; do + rm -f $fname ||: + rm -f .thumbnails/$fname.png ||: + done <<< "$filesToRemove" + + find . -type d -empty -delete + + mkdir -p .thumbnails + images=$(find . -type f -not -path "./.thumbnails*") + + while IFS= read fname; do + [ -f ".thumbnails/$fname.png" ] && continue ||: + + echo "Creating thumbnail for $fname" + mkdir -p $(dirname ".thumbnails/$fname") + convert -define jpeg:size=200x200 "$fname" -thumbnail 500 ".thumbnails/$fname.png" ||: + done <<< "$images" + ''; + + serviceConfig = { + WorkingDirectory = galleryDir; + User = config.services.pvv-nettsiden.user; + Group = config.services.pvv-nettsiden.group; + }; + }; } -