auto_modules () { aliases=$(find /sys/devices/ -name modalias -exec cat {} \;) mods=$(modprobe --set-version ${KERNELVERSION} --show-depends -a \ $aliases 2>/dev/null | sed 's|insmod \(.*\)|\1|' | grep ${@} | sort -u) echo "${mods}" [ "x${mods}" = "x" ] && return 1 return 0 } all_modules () { mods=$(find ${MODULEDIR} -name *.ko 2>/dev/null | grep ${@} | sort -u) echo "${mods}" [ "x${mods}" = "x" ] && return 1 return 0 } checked_modules () { ret=1 if [ -e "${MODULE_FILE}" ]; then for mod in $(all_modules ${@}); do if grep "$(basename ${mod%%\.ko})" "${MODULE_FILE}" >/dev/null 2>&1; then ret=0 echo ${mod} fi done return $ret else all_modules ${@} fi } msg () { [ "${QUIET}" = "n" ] && echo "${@}"; } err () { echo "ERROR: ${@}" >&2; } die () { echo "FATAL: ${@}" >&2; exit 1; } add_dir () { if [ "x${1}" != "x" -a "${1}" != "/" ]; then if ! grep "dir ${1} " "${FILELIST}" 2>&1 > /dev/null; then add_dir $(dirname "${1}") msg " adding dir ${1}" echo "dir ${1} 755 0 0" >> "${FILELIST}" fi fi } # add_device /dev/foo type major minor [permissions] add_device () { if [ $# -ge 4 ]; then local perms perms="${5:-644}" if ! grep "nod ${1}" "${FILELIST}" 2>&1 > /dev/null; then add_dir $(dirname "${1}") msg " adding node ${1}" echo "nod ${1} ${perms} 0 0 ${2} ${3} ${4}" >> "${FILELIST}" fi else err "invalid device node format: $@" return 1 fi } add_symlink () { local fil dest dir if [ -L ${1} ]; then fil="${1}" dest="${2##$BASEDIR}" add_dir $(dirname "${dest}") if ! grep "slink ${dest} " "${FILELIST}" 2>&1 > /dev/null; then msg " adding link ${fil} -> ${dest}" echo "slink ${dest} ${fil} $(stat -c '%a %u %g' ${fil})" >> "${FILELIST}" fi fi #fail quietly } add_file () { local fil lnk dir dest if [ -e "${1}" ]; then fil="${1}" lnk=$(readlink -f "${fil}") if [ -n "${lnk}" ]; then add_symlink "${fil}" "${lnk}" fil="${lnk}" fi if [ $# -eq 2 ]; then dest="${2}" else dest="${fil##$BASEDIR}" fi add_dir $(dirname "${dest}") if ! grep "file ${dest} " "${FILELIST}" 2>&1 > /dev/null; then msg " adding file ${dest}" echo "file ${dest} ${fil} $(stat -c '%a %u %g' ${fil})" >> "${FILELIST}" fi else err "file '${1}' does not exist" return 1 fi } HAS_MODULES="n" #modules are handled specially in order to enable autodetection add_module () { local fil path mod deps #cleanup - remove .ko, replace - and _ with [-_] to match either fil=$(basename "${1}" | sed -e "s|[-_]|\[-_\]|g" -e "s|\.ko$||g") for path in $(find "${MODULEDIR}" -type f -name "${fil}.ko"); do for mod in $(modinfo -F depends "${path}" | tr ',' ' '); do if [ "x${mod}" != "x" ]; then add_module "${mod}" HAS_MODULES="y" fi done add_file "${path}" done } _finish_modules () { echo "wtf!" } add_binary () { local bin type lib bin=$(which "${1}") if [ $? -ne 0 ]; then bin="${1}" fi if [ ! -f "${bin}" ]; then err "'${bin}' is not a file" return 1 fi if [ $? -eq 0 ]; then type=$(file -b "${bin}") case "${type}" in *script*) msg " adding '${type}' script, ensure proper interp exists..." add_file "${bin}" ;; *executable*) add_file "${bin}" #note, this will also handle 'not a dynamic executable' spit out by # static binaries... the deps will produce nothing for lib in $(ldd ${bin} 2>/dev/null | sed "s|.*=>\(.*\)|\1|"); do if [ "x${lib}" != "x" ]; then #remove TLS libraries notls=$(echo ${lib} | sed 's|/lib/tls.*/\(lib.*\)|/lib/\1|') [ -e "${notls}" ] && lib="${notls}" [ -f "${lib}" ] && add_file "${lib}" fi done ;; *) err "unknown type '${type}' for binary '${bin}'" return 1 ;; esac fi } parse_hook () { local mod bin fil for mod in $MODULES; do if [ "x${mod}" != "x" ]; then add_module "${mod}" fi done for bin in $BINARIES; do if [ "x${bin}" != "x" ]; then add_binary "${bin}" fi done for fil in $FILES; do if [ "x${fil}" != "x" ]; then add_file "${fil}" fi done if [ "x${SCRIPT}" != "x" ]; then add_file "${HOOKDIR}/${SCRIPT}" "/hooks/${SCRIPT}" fi } # vim: set ft=sh ts=4 sw=4 et: