| #!/bin/sh |
| # |
| # The systemd-tmpfiles has the ability to grab information |
| # from the filesystem (instead from the running system). |
| # |
| # tmpfs directories (/tmp, /proc, ...) are skipped since they're not |
| # relevant for the rootfs image. |
| # |
| # However there are a few specifiers that *always* will grab |
| # information from the running system examples are %a, %b, %m, %H |
| # (Architecture, Boot UUID, Machine UUID, Hostname). |
| # |
| # See [1] for historic information. |
| # |
| # This script will (conservatively) skip tmpfiles lines that have |
| # such an specifier to prevent leaking host information. |
| # |
| # shell expansion is critical to be POSIX compliant, |
| # this script wont work with zsh in its default mode for example. |
| # |
| # The script takes several measures to handle more complex stuff |
| # like passing this correctly: |
| # f+ "/var/example" - - - - %B\n%o\n%w\n%W%%\n |
| # |
| # [1] - https://github.com/systemd/systemd/pull/16187 |
| |
| [ -n "${HOST_SYSTEMD_TMPFILES-}" ] || |
| HOST_SYSTEMD_TMPFILES=systemd-tmpfiles |
| |
| [ -n "${1-}" -a -d "${1-}"/usr/lib/tmpfiles.d ] || |
| { echo 1>&2 "$0: need ROOTFS argument"; exit 1; } |
| |
| ${HOST_SYSTEMD_TMPFILES} --no-pager --cat-config --root="$1" | |
| sed -e '/^[[:space:]]*#/d' -e 's,^[[:space:]]*,,' -e '/^$/d' | |
| while read -r line; do |
| # it is allowed to use quotes around arguments, |
| # so let the shell pack the arguments |
| eval "set -- $line" |
| |
| # dont output warnings for directories we dont process |
| [ "${2#/dev}" = "${2}" ] && [ "${2#/proc}" = "${2}" ] && |
| [ "${2#/run}" = "${2}" ] && [ "${2#/sys}" = "${2}" ] && |
| [ "${2#/tmp}" = "${2}" ] && [ "${2#/mnt}" = "${2}" ] || |
| continue |
| |
| # blank out all specs that are ok to use, |
| # test if some remain. (Specs up to date with v250) |
| if echo "$2 ${7-}" | sed -e 's,%[%BCEgGhLMosStTuUVwW],,g' | grep -v -q '%'; then |
| # no "bad" specifiers, pass the line unmodified |
| eval "printf '%s\n' '$line'" |
| else |
| # warn |
| eval "printf 'ignored spec: %s\n' '$line' 1>&2" |
| fi |
| done | |
| TMPDIR= TEMP= TMP= ${HOST_SYSTEMD_TMPFILES} --create --boot --root="$1" \ |
| --exclude-prefix=/dev --exclude-prefix=/proc --exclude-prefix=/run \ |
| --exclude-prefix=/sys --exclude-prefix=/tmp --exclude-prefix=/mnt \ |
| - |