diff --git a/NEWS.md b/NEWS.md index 931d0abd..6027aa08 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,14 @@ This file will contain a list of notable changes for each release. Note the information in this file is in reverse order. +## OpenRC-0.23 + +The tmpfiles.d processing code, which was part of previous versions of +OpenRC, has been separated into its own package [1]. If you need to +process systemd style tmpfiles.d files, please install this package. + +[1] https://github.com/openrc/opentmpfiles + ## OpenRC-0.22 In previous versions of OpenRC, configuration information was processed diff --git a/conf.d/Makefile b/conf.d/Makefile index a18ca749..6c7962b6 100644 --- a/conf.d/Makefile +++ b/conf.d/Makefile @@ -1,8 +1,7 @@ include ../mk/net.mk DIR= ${CONFDIR} -CONF= bootmisc fsck hostname localmount netmount swap urandom tmpfiles \ - ${CONF-${OS}} +CONF= bootmisc fsck hostname localmount netmount swap urandom ${CONF-${OS}} ifeq (${MKNET},yes) CONF+= network staticroute diff --git a/conf.d/tmpfiles b/conf.d/tmpfiles deleted file mode 100644 index c3f208fe..00000000 --- a/conf.d/tmpfiles +++ /dev/null @@ -1,3 +0,0 @@ -# Extra options for tmpfiles.sh -#tmpfiles_opts="--verbose" -tmpfiles_opts="" diff --git a/init.d/.gitignore b/init.d/.gitignore index 98748c7b..b8cbb487 100644 --- a/init.d/.gitignore +++ b/init.d/.gitignore @@ -45,5 +45,3 @@ syslogd termencoding ttys wscons -tmpfiles.dev -tmpfiles.setup diff --git a/init.d/Makefile b/init.d/Makefile index bec4eaf9..75c88adc 100644 --- a/init.d/Makefile +++ b/init.d/Makefile @@ -2,8 +2,8 @@ include ../mk/net.mk DIR= ${INITDIR} SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \ - netmount.in osclock.in root.in savecache.in swap.in tmpfiles.setup.in \ - swclock.in sysctl.in runsvdir.in urandom.in s6-svscan.in ${SRCS-${OS}} + netmount.in osclock.in root.in savecache.in swap.in swclock.in \ + sysctl.in runsvdir.in urandom.in s6-svscan.in ${SRCS-${OS}} BIN= ${OBJS} # Are we installing our network scripts? @@ -23,7 +23,7 @@ SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \ SRCS-Linux= binfmt.in devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \ killprocs.in modules.in modules-load.in mount-ro.in mtab.in numlock.in \ - procfs.in net-online.in sysfs.in termencoding.in tmpfiles.dev.in + procfs.in net-online.in sysfs.in termencoding.in # Generic BSD scripts SRCS-NetBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \ diff --git a/init.d/tmpfiles.dev.in b/init.d/tmpfiles.dev.in deleted file mode 100644 index c70a29e3..00000000 --- a/init.d/tmpfiles.dev.in +++ /dev/null @@ -1,20 +0,0 @@ -#!@SBINDIR@/openrc-run -# Copyright 1999-2012 Gentoo Foundation -# Released under the 2-clause BSD license. - -description="Set up tmpfiles.d entries" - -depend() -{ - use dev-mount - before dev - keyword -prefix -vserver -} - -start() -{ - ebegin "Setting up tmpfiles.d entries for /dev" - @LIBEXECDIR@/sh/tmpfiles.sh --prefix=/dev --create --boot ${tmpfiles_opts} - eend $? - return 0 -} diff --git a/init.d/tmpfiles.setup.in b/init.d/tmpfiles.setup.in deleted file mode 100644 index 5872feaa..00000000 --- a/init.d/tmpfiles.setup.in +++ /dev/null @@ -1,19 +0,0 @@ -#!@SBINDIR@/openrc-run -# Copyright 1999-2012 Gentoo Foundation -# Released under the 2-clause BSD license. - -description="Set up tmpfiles.d entries" - -depend() -{ - need localmount -} - -start() -{ - ebegin "Setting up tmpfiles.d entries" - @LIBEXECDIR@/sh/tmpfiles.sh --exclude-prefix=/dev --create --remove --boot \ - ${tmpfiles_opts} - eend $? - return 0 -} diff --git a/runlevels/Makefile b/runlevels/Makefile index 6abd8c52..103577ac 100644 --- a/runlevels/Makefile +++ b/runlevels/Makefile @@ -37,9 +37,8 @@ BOOT-FreeBSD+= hostid modules newsyslog savecore syslogd BOOT-FreeBSD+= adjkerntz dumpon syscons BOOT-Linux+= binfmt hwclock keymaps modules mtab procfs termencoding \ - tmpfiles.setup SHUTDOWN-Linux= killprocs mount-ro -SYSINIT-Linux= devfs dmesg sysfs tmpfiles.dev +SYSINIT-Linux= devfs dmesg sysfs # Generic BSD stuff BOOT-NetBSD+= hostid newsyslog savecore syslogd diff --git a/sh/.gitignore b/sh/.gitignore index f814f4a0..8a007103 100644 --- a/sh/.gitignore +++ b/sh/.gitignore @@ -6,6 +6,5 @@ cgroup-release-agent.sh init.sh init-early.sh rc-cgroup.sh -tmpfiles.sh migrate-to-run.sh binfmt.sh diff --git a/sh/Makefile b/sh/Makefile index 1af23ecd..4d7148fb 100644 --- a/sh/Makefile +++ b/sh/Makefile @@ -1,9 +1,9 @@ DIR= ${LIBEXECDIR}/sh SRCS= init.sh.in functions.sh.in gendepends.sh.in \ - openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}} + openrc-run.sh.in rc-functions.sh.in ${SRCS-${OS}} INC= rc-mount.sh functions.sh rc-functions.sh runit.sh s6.sh \ start-stop-daemon.sh supervise-daemon.sh -BIN= gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}} +BIN= gendepends.sh init.sh openrc-run.sh ${BIN-${OS}} INSTALLAFTER= _installafter diff --git a/sh/tmpfiles.sh.in b/sh/tmpfiles.sh.in deleted file mode 100644 index 87545ed5..00000000 --- a/sh/tmpfiles.sh.in +++ /dev/null @@ -1,457 +0,0 @@ -#!/bin/sh -# This is a reimplementation of the systemd tmpfiles.d code -# Control creation, deletion, and cleaning of volatile and temporary files -# -# Copyright (c) 2012 Gentoo Foundation -# Released under the 2-clause BSD license. -# -# This instance is a pure-POSIX sh version, written by Robin H Johnson -# , based on the Arch Linux version as of 2012/01/01: -# http://projects.archlinux.org/initscripts.git/tree/arch-tmpfiles -# -# See the tmpfiles.d manpage as well: -# https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html -# This script should match the old manpage -# http://0pointer.de/public/systemd-man/tmpfiles.d.html -# as of 2012/03/12 and also implements some more recent features -# - -DRYRUN=0 -CHECKPATH="@LIBEXECDIR@/bin/checkpath" - -checkprefix() { - n=$1 - shift - for x in $@; do - case $n in - ${x}*) return 0 ;; - esac - done - return 1 -} - -warninvalid() { - printf "tmpfiles: ignoring invalid entry on line %d of \`%s'\n" "$LINENUM" "$FILE" - error=$(( error+1 )) -} >&2 - -invalid_option() { - printf "tmpfiles: invalid option '%s'\n" "$1" >&2 - exit 1 -} - -dryrun_or_real() { - local dryrun= - [ $DRYRUN -eq 1 ] && dryrun=echo - $dryrun "$@" -} - -_chattr() { - local attr="$2" - case $attr in - [+-=]*) : ;; - '') return ;; - *) attr="+$attr" ;; - esac - local IFS= - dryrun_or_real chattr $1 "$attr" -- $3 -} - -relabel() { - local path - local paths=$1 mode=$2 uid=$3 gid=$4 - - for path in ${paths}; do - if [ -e "$path" ]; then - [ -x /sbin/restorecon ] && dryrun_or_real restorecon $CHOPTS "$path" - [ $uid != '-' ] && dryrun_or_real chown $CHOPTS "$uid" "$path" - [ $gid != '-' ] && dryrun_or_real chgrp $CHOPTS "$gid" "$path" - [ $mode != '-' ] && dryrun_or_real chmod $CHOPTS "$mode" "$path" - fi - done -} - -splitpath() { - local path=$1 - while [ -n "$path" ]; do - echo $path - path=${path%/*} - done -} - -_restorecon() { - local path=$1 - if [ -x /sbin/restorecon ]; then - dryrun_or_real restorecon -F $(splitpath "$path") - fi -} - -_b() { - # Create a block device node if it doesn't exist yet - local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 - if [ ! -e "$path" ]; then - dryrun_or_real mknod -m $mode $path b ${arg%:*} ${arg#*:} - _restorecon "$path" - dryrun_or_real chown $uid:$gid $path - fi -} - -_c() { - # Create a character device node if it doesn't exist yet - local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 - if [ ! -e "$path" ]; then - dryrun_or_real mknod -m $mode $path c ${arg%:*} ${arg#*:} - _restorecon "$path" - dryrun_or_real chown $uid:$gid $path - fi -} - -_C() { - # recursively copy a file or directory - local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 - if [ ! -e "$path" ]; then - dryrun_or_real cp -r "$arg" "$path" - _restorecon "$path" - [ $uid != '-' ] && dryrun_or_real chown "$uid" "$path" - [ $gid != '-' ] && dryrun_or_real chgrp "$gid" "$path" - [ $mode != '-' ] && dryrun_or_real chmod "$mode" "$path" - fi -} - -_f() { - # Create a file if it doesn't exist yet - local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 - - [ $CREATE -gt 0 ] || return 0 - - if [ ! -e "$path" ]; then - dryrun_or_real $CHECKPATH -fq -m "$mode" -o "$uid:$gid" "$path" - [ -z "$arg" ] || _w "$@" - fi -} - -_F() { - # Create or truncate a file - local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 - - [ $CREATE -gt 0 ] || return 0 - - dryrun_or_real $CHECKPATH -Fq -m "$mode" -o "$uid:$gid" "$path" - [ -z "$arg" ] || _w "$@" -} - -_d() { - # Create a directory if it doesn't exist yet - local path=$1 mode=$2 uid=$3 gid=$4 - - [ $CREATE -gt 0 ] || return 0 - - if [ ! -d "$path" ]; then - dryrun_or_real mkdir -p "$path" 2>/dev/null - _restorecon "$path" - dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path" - fi -} - -_D() { - # Create or empty a directory - local path=$1 mode=$2 uid=$3 gid=$4 - - if [ -d "$path" ] && [ $REMOVE -gt 0 ]; then - dryrun_or_real find "$path" -mindepth 1 -maxdepth 1 -xdev -exec rm -rf {} + - _restorecon "$path" - fi - - if [ $CREATE -gt 0 ]; then - dryrun_or_real mkdir -p "$path" 2>/dev/null - _restorecon "$path" - dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path" - fi -} - -_v() { - # Create a subvolume if the path does not exist yet and the file system - # supports this (btrfs). Otherwise create a normal directory. - # TODO: Implement btrfs subvol creation. - _d "$@" -} - -_q() { - # Similar to _v. However, make sure that the subvolume will be assigned - # to the same higher-level quota groups as the subvolume it has - # been created in. - # TODO: Implement btrfs subvol creation. - _d "$@" -} - -_Q() { - # Similar to q. However, instead of copying the higher-level quota - # group assignments from the parent as-is, the lowest quota group - # of the parent subvolume is determined that is not the - # leaf quota group. - # TODO: Implement btrfs subvol creation. - _d "$@" -} - -_h() { - # Set file/directory attributes. Lines of this type accept - # shell-style globs in place of normal path names. - # The format of the argument field matches chattr - _chattr '' "$6" "$1" -} - -_H() { - # Recursively set file/directory attributes. Lines of this type accept - # shell-syle globs in place of normal path names. - # Does not follow symlinks - _chattr -R "$6" "$1" -} - -_L() { - # Create a symlink if it doesn't exist yet - local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 - [ ! -e "$path" ] && dryrun_or_real ln -s "$arg" "$path" - _restorecon "$path" -} - -_p() { - # Create a named pipe (FIFO) if it doesn't exist yet - local path=$1 mode=$2 uid=$3 gid=$4 - - [ $CREATE -gt 0 ] || return 0 - - if [ ! -p "$path" ]; then - dryrun_or_real $CHECKPATH -pq -m $mode -o "$uid:$gid" "$path" - fi -} - -_x() { - # Ignore a path during cleaning. Use this type to exclude paths from clean-up as - # controlled with the Age parameter. Note that lines of this type do not - # influence the effect of r or R lines. Lines of this type accept shell-style - # globs in place of of normal path names. - : - # XXX: we don't implement this -} - -_X() { - # Ignore a path during cleanup. Use this type to prevent path - # removal as controled with the age parameter. Note that if path is - # a directory, the content of the directory is not excluded from - # clean-up, only the directory itself. - # Lines of this type accept shell-style globs in place of normal path names. - : - # XXX: we don't implement this -} - -_r() { - # Remove a file or directory if it exists. This may not be used to remove - # non-empty directories, use R for that. Lines of this type accept shell-style - # globs in place of normal path names. - local path - local paths=$1 - - [ $REMOVE -gt 0 ] || return 0 - - for path in ${paths}; do - if [ -f "$path" ]; then - dryrun_or_real rm -f "$path" - elif [ -d "$path" ]; then - dryrun_or_real rmdir "$path" - fi - done -} - -_R() { - # Recursively remove a path and all its subdirectories (if it is a directory). - # Lines of this type accept shell-style globs in place of normal path names. - local path - local paths=$1 - - [ $REMOVE -gt 0 ] || return 0 - - for path in ${paths}; do - [ -d "$path" ] && dryrun_or_real rm -rf --one-file-system "$path" - done -} - -_w() { - # Write the argument parameter to a file, if it exists. - local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 - if [ -f "$path" ]; then - if [ $DRYRUN -eq 1 ]; then - echo "echo \"$arg\" >>\"$path\"" - else - echo "$arg" >>"$path" - fi - fi -} - -_z() { - # Set ownership, access mode and relabel security context of a file or - # directory if it exists. Lines of this type accept shell-style globs in - # place of normal path names. - [ $CREATE -gt 0 ] || return 0 - - relabel "$@" -} - -_Z() { - # Recursively set ownership, access mode and relabel security context of a - # path and all its subdirectories (if it is a directory). Lines of this type - # accept shell-style globs in place of normal path names. - [ $CREATE -gt 0 ] || return 0 - - CHOPTS=-R relabel "$@" -} - -BOOT=0 CREATE=0 REMOVE=0 CLEAN=0 VERBOSE=0 DRYRUN=0 error=0 LINENO=0 -EXCLUDE= -PREFIX= -FILES= - -while [ $# -gt 0 ]; do - case $1 in - --boot) BOOT=1 ;; - --create) CREATE=1 ;; - --remove) REMOVE=1 ;; - --clean) CLEAN=1 ;; # TODO: Not implemented - --verbose) VERBOSE=1 ;; - --dryrun|--dry-run) DRYRUN=1 ;; - --exclude-prefix=*) EXCLUDE="${EXCLUDE}${1##--exclude-prefix=} " ;; - --prefix=*) PREFIX="${PREFIX}${1##--prefix=} " ;; - -*) invalid_option "$1" ;; - *) FILES="${FILES} $1" - esac - shift -done - -if [ $(( CLEAN )) -eq 1 ] ; then - printf '%s clean mode is not implemented\n' "${0##*/}" - exit 1 -fi - -if [ "$CREATE$REMOVE" = '00' ]; then - printf 'usage: %s [--exclude-prefix=path] [--prefix=path] [--boot] [--create] [--remove] [--clean] [--verbose] [--dry-run]\n' "${0##*/}" - exit 1 -fi - -# XXX: The harcoding of /usr/lib/ is an explicit choice by upstream -tmpfiles_dirs='/usr/lib/tmpfiles.d /run/tmpfiles.d /etc/tmpfiles.d' -tmpfiles_basenames='' - -if [ -z "${FILES}" ]; then - # Build a list of sorted unique basenames - # directories declared later in the tmpfiles_d array will override earlier - # directories, on a per file basename basis. - # `/etc/tmpfiles.d/foo.conf' supersedes `/usr/lib/tmpfiles.d/foo.conf'. - # `/run/tmpfiles/foo.conf' will always be read after `/etc/tmpfiles.d/bar.conf' - for d in ${tmpfiles_dirs} ; do - [ -d $d ] && for f in ${d}/*.conf ; do - case "${f##*/}" in - systemd.conf|systemd-*.conf) continue;; - esac - [ -f $f ] && tmpfiles_basenames="${tmpfiles_basenames}\n${f##*/}" - done # for f in ${d} - done # for d in ${tmpfiles_dirs} - FILES="$(printf "${tmpfiles_basenames}\n" | sort -u )" -fi - -tmpfiles_d='' - -for b in ${FILES} ; do - if [ "${b##*/}" != "${b}" ]; then - # The user specified a path on the command line - # Just pass it through unaltered - tmpfiles_d="${tmpfiles_d} ${b}" - else - real_f='' - for d in $tmpfiles_dirs ; do - f=${d}/${b} - [ -f "${f}" ] && real_f=$f - done - [ -f "${real_f}" ] && tmpfiles_d="${tmpfiles_d} ${real_f}" - fi -done - -error=0 - -# loop through the gathered fragments, sorted globally by filename. -# `/run/tmpfiles/foo.conf' will always be read after `/etc/tmpfiles.d/bar.conf' -FILE= -for FILE in $tmpfiles_d ; do - LINENUM=0 - - ### FILE FORMAT ### - # XXX: We ignore the 'Age' parameter - # 1 2 3 4 5 6 7 - # Cmd Path Mode UID GID Age Argument - # d /run/user 0755 root root 10d - - # Mode, UID, GID, Age, Argument may be omitted! - # If Cmd ends with !, the line is only processed if --boot is passed - - # XXX: Upstream says whitespace is NOT permitted in the Path argument. - # But IS allowed when globs are expanded for the x/r/R/z/Z types. - while read cmd path mode uid gid age arg; do - LINENUM=$(( LINENUM+1 )) - FORCE=0 - - # Unless we have both command and path, skip this line. - if [ -z "$cmd" -o -z "$path" ]; then - continue - fi - - case $cmd in - \#*) continue ;; - esac - - while [ ${#cmd} -gt 1 ]; do - case $cmd in - *!) cmd=${cmd%!}; [ "$BOOT" -eq "1" ] || continue 2 ;; - *+) cmd=${cmd%+}; FORCE=1; ;; - *) warninvalid ; continue 2 ;; - esac - done - - # whine about invalid entries - case $cmd in - f|F|w|d|D|v|p|L|c|C|b|x|X|r|R|z|Z|q|Q|h|H) ;; - *) warninvalid ; continue ;; - esac - - # fall back on defaults when parameters are passed as '-' - if [ "$mode" = '-' -o "$mode" = '' ]; then - case "$cmd" in - p|f|F) mode=0644 ;; - d|D|v) mode=0755 ;; - C|z|Z|x|r|R|L) ;; - esac - fi - - [ "$uid" = '-' -o "$uid" = '' ] && uid=0 - [ "$gid" = '-' -o "$gid" = '' ] && gid=0 - [ "$age" = '-' -o "$age" = '' ] && age=0 - [ "$arg" = '-' -o "$arg" = '' ] && arg='' - set -- "$path" "$mode" "$uid" "$gid" "$age" "$arg" - - [ -n "$EXCLUDE" ] && checkprefix $path $EXCLUDE && continue - [ -n "$PREFIX" ] && ! checkprefix $path $PREFIX && continue - - if [ $FORCE -gt 0 ]; then - case $cmd in - p|L|c|b) [ -f "$path" ] && dryrun_or_real rm -f "$path" - esac - fi - - [ "$VERBOSE" -eq "1" ] && echo _$cmd "$@" - _$cmd "$@" - rc=$? - if [ "${DRYRUN}" -eq "0" ]; then - [ $rc -ne 0 ] && error=$((error + 1)) - fi - done <$FILE -done - -exit $error - -# vim: set ts=2 sw=2 sts=2 noet ft=sh: