From 978a3acd5c7e4dfe4ffdb23c81fd507f3edfccd4 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Wed, 13 May 2020 13:44:18 +0200 Subject: build-initramfs.sh: new-gen bootstrap --- build-initramfs.sh | 146 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 134 insertions(+), 12 deletions(-) (limited to 'build-initramfs.sh') diff --git a/build-initramfs.sh b/build-initramfs.sh index 31f39118..ae8384ff 100755 --- a/build-initramfs.sh +++ b/build-initramfs.sh @@ -4,6 +4,7 @@ # Copyright Torben Sickert (info["~at~"]torben.website) 29.10.2015 # Janosch Dobler (info["~at~"]jandob.com) 29.10.2015 # Jonathan Bauer (jonathan.bauer@rz.uni-freiburg.de) 19.09.2019 +# Thiago Abdo (tjabdo@inf.ufpr.br) 06.11.2019 # License # ------- @@ -12,10 +13,15 @@ # see http://creativecommons.org/licenses/by/3.0/deed.de ## endregion -# I think this are the same... +# Afaik the idea here was to have the root dir where build-initramfs.sh +# is called from and the repo dir where the systemd-init.git is cloned to: +# +# |- build-initramfs.sh +# |- dracut +# |- systemd-init declare -rg _root_dir="$(readlink -f $(dirname ${BASH_SOURCE[0]}))" -declare -rg _repo_dir="${_root_dir}" +# TODO clean these up file_path='/boot/initramfs.img' dracut_parameter=(--force --no-hostonly) verbose='no' @@ -25,6 +31,118 @@ cleanup='no' full_cleanup='no' use_systemd_in_initramfs='no' + +declare -rg _bootstrap_modules="bootstrap.conf" + +bootstrap() { + if [ ! -f "$_bootstrap_modules" ]; then + echo "Missing modules definition file: $_bootstrap_modules" + print_help_message 1 + exit 1 + fi + + . "$_bootstrap_modules" + + if [[ ! -v core_dracut[@] ]] || [[ ! -v core_repo[@] ]]; then + echo "Missing core modules for dracut & systemd-init" + exit 1 + fi + + declare -rg _repo_dir="$(readlink -f ${core_repo[path]})" + declare -rg _dracut_dir="$(readlink -f ${core_dracut[path]})" + + echo "Modules file: $_bootstrap_modules" + echo "Core modules: ${!core_*}" + echo "Modules: ${!module_*}" + echo "" + + + for module in "${!core_@}" "${!module_@}"; do + declare -n _ref="$module" + if [ -n "$(ls -A "${_ref[path]}" 2> /dev/null)" ]; then + echo "'${_ref[path]}' not empty, skipping..." + continue + fi + echo "######################### $module #########################" + echo "Handler: ${_ref[handler]}" + echo " URL: ${_ref[url]}" + echo " Branch: ${_ref[branch]}" + echo " Commit: ${_ref[commit]}" + echo " Path: ${_ref[path]}" + handler_${_ref[handler]} \ + "${_ref[path]}" \ + "${_ref[url]}" \ + "${_ref[branch]}" \ + "${_ref[commit]}" + + # apply patches if any are required + shopt -s nullglob + pushd "${_ref[path]}" + for patch in "${_repo_dir}/patches/${_ref[path]##*/}/"*.patch; do + patch -p1 < "$patch" + done + popd + + done +} + +handler_git() { + local path="$1" + local url="$2" + local branch="$3" + local commit="$4" + + mkdir -p "$path" + + local gitargs=( \ + "--depth" "1" \ + "--single-branch" \ + ) + if [ -n "$branch" ]; then + gitargs+=("--branch" "$branch") + fi + git clone "${gitargs[@]}" "${url}" "${path}" + + [ -z "$commit" ] && return 0 + + # make sure given commit in in the fetched history + local revision="$branch" + if [ -n "$commit" ]; then + revision="$commit" + fi + + # manual "shallow clone" since not all server allow it... + pushd "$path" + local i=50 + while ! git rev-parse --quiet --verify $revision^{commit}; do + git fetch --depth=$(( i+=50 )) + done + git reset --hard "$revision" + popd +} + +handler_http() { + local path="$1" + local url="$2" + + mkdir --parents "$path" + + curl \ + --location \ + --max-redirs 5 \ + --max-time 7 \ + --connect-timeout 2 \ + --retry 3 \ + --retry-max-time 12 \ + "$url" \ + | tar \ + --extract \ + --gzip \ + --directory "$path" \ + --strip-components 1 +} + + print_help_message() { echo "TODO" } @@ -141,8 +259,8 @@ parse_command_line() { } ## endregion ## region helper -initialize_dracut() { - pushd "${_root_dir}/dracut" +compile_dracut() { + pushd "${_dracut_dir}" # NOTE: On virtualbox shared folder symlinks are not allowed. # NOTE: make the dracut-install binary (dracut-install resolves # dependencies etc.) @@ -155,8 +273,8 @@ initialize_dracut() { # If symlinks would be available we could simply use: # >>> make dracut-install popd - cp "${_root_dir}/dracut/install/dracut-install" \ - "${_root_dir}/dracut/dracut-install" + cp "${_dracut_dir}/install/dracut-install" \ + "${_dracut_dir}/dracut-install" return $? } @@ -165,17 +283,20 @@ initialize_dracut() { # TODO: Does this still work? cleanup() { local plugin_path - plugin_path="${_root_dir}/modules.d/dnbd3-rootfs" + plugin_path="${_repo_dir}/modules.d/dnbd3-rootfs" source "${plugin_path}/module-setup.sh" moddir="$(cd "$plugin_path" &>/dev/null && pwd)" clean return $? } + main() { if ! parse_command_line "$@"; then print_help_message "$0" exit 1 fi + # prepare submodules for the dnbd3-rootfs module + bootstrap # if no kernel was specified as dracut argument, use the running kernel's version echo "Building for:" if [ -z "$kernel_version" ]; then @@ -200,16 +321,16 @@ main() { fi echo 'Checking dracut...' - if [[ ! -f "${_root_dir}/dracut/dracut-install" ]]; then + if [ ! -f "${_dracut_dir}/dracut-install" ]; then echo "Dracut isn't available yet loading it." - initialize_dracut + compile_dracut fi for _dracut_module_dir in "${_repo_dir}/modules.d/"*; do [ -d "${_dracut_module_dir}" ] || continue _dracut_module="$(basename $_dracut_module_dir)" # TODO allow module-specific priority - _dracut_module_target="${_root_dir}/dracut/modules.d/00${_dracut_module}" + _dracut_module_target="${_dracut_dir}/modules.d/00${_dracut_module}" if [[ ! -L "$_dracut_module_target" || "$(readlink \ "$_dracut_module_target")" != "$_dracut_module_dir" ]]; then echo \ @@ -241,7 +362,7 @@ main() { # Preprocess done - start build, cleanup or full cleanup if [[ "$full_cleanup" == 'yes' ]]; then echo 'Removing all modules.' - rm "${_repo_dir}" "${_root_dir}/dracut" --recursive --force + rm "${_repo_dir}" "${_dracut_dir}" --recursive --force elif [[ "$cleanup" == 'yes' ]]; then echo 'Removing distribution specific files.' cleanup @@ -254,7 +375,7 @@ main() { fi echo 'Build initramfs.' - "${_root_dir}/dracut/dracut.sh" --local \ + "${_dracut_dir}/dracut.sh" --local \ $_loglevel --modules "${_modules[*]}" --conf /etc/dracut.conf \ --confdir /etc/dracut.conf.d "${dracut_parameter[@]}" \ --kver "${kernel_version}" "$file_path" @@ -267,4 +388,5 @@ main() { chmod 0644 "${file_path}" fi } + main "$@" -- cgit v1.2.3-55-g7522