[arch-projects] [mkinitcpio][PATCH] functions: add_udev_rules and add_systemd_unit
Tom Gundersen
teg at jklm.no
Fri Apr 12 21:43:35 EDT 2013
add_udev_rules() adds a rules file and pulls in the necessary binaries udev
rules by automatically pulling in the necessary binaries.
add_systemd_unit() pulls in the necessary binaries, and also Requires= and
OnFailure= units.
Moreover, it pulls in any symlinks to the unit in any .wants or .requires
directories.
---
functions | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 98 insertions(+)
diff --git a/functions b/functions
index 432d700..12df3cd 100644
--- a/functions
+++ b/functions
@@ -569,6 +569,104 @@ add_binary() {
return 0
}
+add_udev_rules() {
+ # Add an udev rules file to the initcpio image. Dependencies on binaries
+ # will be discovered and added.
+ # $1: path to rules file (or name of rules file)
+
+ local udevdir= rules= rule= entry= key= value= binary=
+
+ udevdir=$(pkg-config --variable=udevdir udev)
+
+ if [[ ${1:0:1} != '/' ]]; then
+ rules="${udevdir}/rules.d/${1}"
+ else
+ rules=$1
+ fi
+
+ add_file "${rules}"
+
+ while read rule; do
+ if [[ ${rule:0:1} == '#' ]]; then
+ continue
+ fi
+
+ IFS=', '
+ for entry in ${rule}; do
+
+ IFS='=' read key value <<< "${entry}"
+
+ if [[ ( ${key:0:3} == "RUN" &&
+ ${key:4:7} != "builtin" ) ||
+ ${key:0:7} == "PROGRAM" ||
+ ${key:0:15} == "IMPORT{program}" ||
+ ${key:0:15} == "ENV{REMOVE_CMD}" ]]; then
+
+ binary=${value//\"/}
+ if [[ ${binary:0:1} != '/' ]]; then
+ binary="${udevdir}/${binary}"
+ fi
+
+ read -d ' ' binary <<< "${binary} "
+ add_binary "${binary}"
+ fi
+ done
+ done < "$rules"
+}
+
+add_systemd_unit() {
+ # Add a systemd unit file to the initcpio image. Dependencies on binaries
+ # and other unit files will be discovered and added.
+ # $1: path to rules file (or name of rules file)
+
+ local unitdir= unit= rule= entry= key= value= binary= dep=
+
+ unitdir=$(pkg-config --variable=systemdsystemunitdir systemd)
+
+ if [[ ${1:0:1} != '/' ]]; then
+ unit="${unitdir}/${1}"
+ else
+ unit=$1
+ fi
+
+ add_file "${unit}"
+
+ while read entry; do
+ if [[ ${entry:0:1} == '#' ]]; then
+ continue
+ fi
+
+ IFS='=' read key value <<< "${entry}"
+
+ if [[ ${key:0:4} == 'Exec' ]]; then
+ binary=${value//\"/}
+ if [[ ${binary:0:1} != '-' ]]; then
+ read -d ' ' binary <<< "${binary} "
+ add_binary "${binary}"
+ fi
+ fi
+
+ if [[ ${key} == 'Requires' || ${key} == 'OnFailure' ]]; then
+ for dep in ${value}; do
+ add_systemd_unit ${dep}
+ done
+ fi
+
+ done < "$unit"
+
+ for dep in "${unitdir}"/*.{wants,requires}/$(basename $unit); do
+ if [[ -h "${dep}" ]]; then
+ add_symlink "${dep}"
+ fi
+ done
+
+ if [[ -d "${unit}.requires" ]]; then
+ for dep in "${unit}".requires/*; do
+ add_systemd_unit $(basename $dep)
+ done
+ fi
+}
+
parse_config() {
# parse key global variables set by the config file.
--
1.8.2.1
More information about the arch-projects
mailing list