1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #!/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 \
- -
|