From 76c321d8e85683091ecbcd3afe8c56fb7c45c00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 20 Jun 2018 10:00:44 +0200 Subject: [PATCH] services: cleanup: Expect file names to be UTF-8-encoded. Fixes . Reported by Danny Milosavljevic . * gnu/services.scm (cleanup-gexp): Add 'setenv' and 'setlocale' calls before 'delete-file-recursively'. * gnu/tests/base.scm (%cleanup-os, %test-cleanup): New variables. (run-cleanup-test): New procedure. --- gnu/services.scm | 6 ++++ gnu/tests/base.scm | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/gnu/services.scm b/gnu/services.scm index 3162c6ba05..55ad5c9368 100644 --- a/gnu/services.scm +++ b/gnu/services.scm @@ -394,8 +394,14 @@ boot." (delete-file "/etc/passwd.lock") (delete-file "/etc/.pwd.lock") ;from 'lckpwdf' + ;; Force file names to be decoded as UTF-8. See + ;; . + (setenv "GUIX_LOCPATH" + #+(file-append glibc-utf8-locales "/lib/locale")) + (setlocale LC_CTYPE "en_US.utf8") (delete-file-recursively "/tmp") (delete-file-recursively "/var/run") + (mkdir "/tmp") (chmod "/tmp" #o1777) (mkdir "/var/run") diff --git a/gnu/tests/base.scm b/gnu/tests/base.scm index 05c846264d..d209066a74 100644 --- a/gnu/tests/base.scm +++ b/gnu/tests/base.scm @@ -30,6 +30,8 @@ #:use-module (gnu services mcron) #:use-module (gnu services shepherd) #:use-module (gnu services networking) + #:use-module (gnu packages base) + #:use-module (gnu packages bash) #:use-module (gnu packages imagemagick) #:use-module (gnu packages ocr) #:use-module (gnu packages package-management) @@ -37,11 +39,13 @@ #:use-module (gnu packages tmux) #:use-module (guix gexp) #:use-module (guix store) + #:use-module (guix monads) #:use-module (guix packages) #:use-module (srfi srfi-1) #:export (run-basic-test %test-basic-os %test-halt + %test-cleanup %test-mcron %test-nss-mdns)) @@ -471,6 +475,73 @@ in a loop. See .") (guix combinators))))) (run-halt-test (virtual-machine os)))))) + +;;; +;;; Cleanup of /tmp, /var/run, etc. +;;; + +(define %cleanup-os + (simple-operating-system + (simple-service 'dirty-things + boot-service-type + (with-monad %store-monad + (let ((script (plain-file + "create-utf8-file.sh" + (string-append + "echo $0: dirtying /tmp...\n" + "set -e; set -x\n" + "touch /witness\n" + "exec touch /tmp/λαμβδα")))) + (with-imported-modules '((guix build utils)) + (return #~(begin + (setenv "PATH" + #$(file-append coreutils "/bin")) + (invoke #$(file-append bash "/bin/sh") + #$script))))))))) + +(define (run-cleanup-test name) + (define os + (marionette-operating-system %cleanup-os + #:imported-modules '((gnu services herd) + (guix combinators)))) + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (gnu build marionette) + (srfi srfi-64) + (ice-9 match)) + + (define marionette + (make-marionette (list #$(virtual-machine os)))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "cleanup") + + (test-assert "dirty service worked" + (marionette-eval '(file-exists? "/witness") marionette)) + + (test-equal "/tmp cleaned up" + '("." "..") + (marionette-eval '(begin + (use-modules (ice-9 ftw)) + (scandir "/tmp")) + marionette)) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "cleanup" test)) + +(define %test-cleanup + ;; See . + (system-test + (name "cleanup") + (description "Make sure the 'cleanup' service can remove files with +non-ASCII names from /tmp.") + (value (run-cleanup-test name)))) + ;;; ;;; Mcron.