From f7bdab1bdbcc481b05b1a5d6e51ed56fa39eb18b Mon Sep 17 00:00:00 2001 From: fatalerrors Date: Thu, 16 Oct 2025 15:36:35 +0200 Subject: [PATCH] created var management lib, embryo removed from filefct lib --- lib/filefct.sh | 219 +++++++++++++++++++------------------------------ lib/vars.sh | 106 ++++++++++++++++++++++++ 2 files changed, 192 insertions(+), 133 deletions(-) create mode 100644 lib/vars.sh diff --git a/lib/filefct.sh b/lib/filefct.sh index 4cc39df..c8a2f03 100644 --- a/lib/filefct.sh +++ b/lib/filefct.sh @@ -25,35 +25,35 @@ export COMM_REPO_PATH=${COMM_REPO_PATH:-"$MYPATH/repo/common"} backup_dist() { if [[ $# -lt 1 ]]; then - prnt E "backup_dist(): At least one argument is required." - exit 11 + prnt E "backup_dist(): At least one argument is required." + exit 11 fi local file= for file in $@; do - local tmstmp=$(stdtime) - if [[ -L ${file} ]]; then - # With symbolik links we call again backup_dist to treat target - prnt I "Following the symbolic link $file to do a proper backup..." - backup_dist $(readlink -f "${file}") - elif [[ -f ${file} ]]; then - prnt I "Creating a backup of ${file} on $tmstmp..." - cp -av $file ${file}.dist.${tmstmp} - if [[ $? -ne 0 ]]; then - prnt E "backup_dist(): Failed copying file." - die 12 - fi - elif [[ -d ${file} ]]; then - prnt I "Creating a backup of the directory ${file} on $tmstmp..." - cp -av $file ${file}.dist.${tmstmp} - if [[ $? -ne 0 ]]; then - prnt E "backup_dist(): Failed copying directory recursively." - die 12 - fi - else - prnt W "backup_dist(): $file don't exists, nothing to do." - fi - unset tmstmp + local tmstmp=$(stdtime) + if [[ -L ${file} ]]; then + # With symbolik links we call again backup_dist to treat target + prnt I "Following the symbolic link $file to do a proper backup..." + backup_dist $(readlink -f "${file}") + elif [[ -f ${file} ]]; then + prnt I "Creating a backup of ${file} on $tmstmp..." + cp -av $file ${file}.dist.${tmstmp} + if [[ $? -ne 0 ]]; then + prnt E "backup_dist(): Failed copying file." + die 12 + fi + elif [[ -d ${file} ]]; then + prnt I "Creating a backup of the directory ${file} on $tmstmp..." + cp -av $file ${file}.dist.${tmstmp} + if [[ $? -ne 0 ]]; then + prnt E "backup_dist(): Failed copying directory recursively." + die 12 + fi + else + prnt W "backup_dist(): $file don't exists, nothing to do." + fi + unset tmstmp done unset file } @@ -74,20 +74,20 @@ select_file() { local infile=$1 if [[ -f $RLMHST_REPO_PATH/$infile ]]; then - local source="$RLMHST_REPO_PATH/$infile" + local source="$RLMHST_REPO_PATH/$infile" elif [[ -f $RLMGRP_REPO_PATH/$infile ]]; then - local source="$RLMGRP_REPO_PATH/$infile" + local source="$RLMGRP_REPO_PATH/$infile" elif [[ -f $HOST_REPO_PATH/$infile ]]; then - local source="$HOST_REPO_PATH/$infile" + local source="$HOST_REPO_PATH/$infile" elif [[ -f $GROUP_REPO_PATH/$infile ]]; then - local source="$GROUP_REPO_PATH/$infile" + local source="$GROUP_REPO_PATH/$infile" elif [[ -f $REALM_REPO_PATH/$infile ]]; then - local source="$REALM_REPO_PATH/$infile" + local source="$REALM_REPO_PATH/$infile" elif [[ -f $COMM_REPO_PATH/$infile ]]; then - local source="$COMM_REPO_PATH/$infile" + local source="$COMM_REPO_PATH/$infile" else - # Not found in repository, we expect full name - local source="$infile" + # Not found in repository, we expect full name + local source="$infile" fi unset infile echo $source @@ -103,20 +103,20 @@ select_directory() { local indir=$1 if [[ -d $RLMHST_REPO_PATH/$indir ]]; then - local source="$RLMHST_REPO_PATH/$indir" + local source="$RLMHST_REPO_PATH/$indir" elif [[ -d $RLMGRP_REPO_PATH/$indir ]]; then - local source="$RLMGRP_REPO_PATH/$indir" + local source="$RLMGRP_REPO_PATH/$indir" elif [[ -d $HOST_REPO_PATH/$indir ]]; then - local source="$HOST_REPO_PATH/$indir" + local source="$HOST_REPO_PATH/$indir" elif [[ -d $GROUP_REPO_PATH/$indir ]]; then - local source="$GROUP_REPO_PATH/$indir" + local source="$GROUP_REPO_PATH/$indir" elif [[ -d $REALM_REPO_PATH/$indir ]]; then - local source="$REALM_REPO_PATH/$indir" + local source="$REALM_REPO_PATH/$indir" elif [[ -d $COMM_REPO_PATH/$indir ]]; then - local source="$COMM_REPO_PATH/$indir" + local source="$COMM_REPO_PATH/$indir" else - # Not found in repository, we expect full name - local source="$indir" + # Not found in repository, we expect full name + local source="$indir" fi unset indir echo $source @@ -135,41 +135,41 @@ install_file() local i=0 if [[ $# -lt 2 ]]; then - prnt E "install_file(): At least two arguments are required." - die 11 + prnt E "install_file(): At least two arguments are required." + die 11 fi if [[ -n $(echo $@ | grep "\*\|\?") ]]; then - prnt E "install_file(): Wildcards are not authorized." - die 7 + prnt E "install_file(): Wildcards are not authorized." + die 7 fi local arg= for arg in $@; do - filelist="$filelist $(select_file $arg)" + filelist="$filelist $(select_file $arg)" # We always replace until the last argument being the target target="$arg" done unset arg if [[ ! $target == /* ]]; then - prnt E "install_file(): Target must be on the root filesystem and full path must be provided." - die 13 + prnt E "install_file(): Target must be on the root filesystem and full path must be provided." + die 13 fi unset target if [[ -d $(dirname $i) ]]; then - prnt I "Creating required target directory $(dirname $i)..." - mkdir -pv $(dirname $i) - if [[ $? -ne 0 ]]; then - prnt E "install_file(): Can't create target directory!" - die 12 - fi + prnt I "Creating required target directory $(dirname $i)..." + mkdir -pv $(dirname $i) + if [[ $? -ne 0 ]]; then + prnt E "install_file(): Can't create target directory!" + die 12 + fi fi prnt I "Copying files ${filelist} to target directory $(dirname $i)..." cp -av $filelist if [[ $? -ne 0 ]]; then - prnt E "install_file(): Couldn't copy some required files!" - die 12 + prnt E "install_file(): Couldn't copy some required files!" + die 12 fi } export -f install_file @@ -181,26 +181,26 @@ export -f install_file append_file() { if [[ $# -ne 2 ]]; then - prnt E "append_file(): Two arguments are required, source and destination." - die 11 + prnt E "append_file(): Two arguments are required, source and destination." + die 11 fi local srcfile=$(select_file $1) local dstfile=$2 if [[ ! $dstfile == /* ]]; then - prnt E "append_file(): Target must be on the root filesystem and full path must be provided." - die 13 + prnt E "append_file(): Target must be on the root filesystem and full path must be provided." + die 13 fi if [[ -e $dstfile ]]; then - prnt E "append_file(): Target file must exist (use touch first to create it if required)." - die 13 + prnt E "append_file(): Target file must exist (use touch first to create it if required)." + die 13 fi prnt I "Adding content to file $dstfile..." cat $srcfile >> $dstfile if [[ $? -ne 0 ]]; then - prnt E "append_file(): Couldn't append a file!" - die 12 + prnt E "append_file(): Couldn't append a file!" + die 12 fi } export -f append_file @@ -214,16 +214,16 @@ is_dir_empty() dir=$1 if [[ -f $dir ]]; then - prnt E "is_dir_empty(): The given parameter is not a directory." - die 15 + prnt E "is_dir_empty(): The given parameter is not a directory." + die 15 fi if [[ ! -d $dir ]]; then - return 0 + return 0 fi nbfiles=$(ls -a1 $dir | grep -Evc '^.$|^..$') if [[ $nbfiles -eq 0 ]]; then - return 0 + return 0 fi return 1 } @@ -231,64 +231,17 @@ export -f is_dir_empty # ------------------------------------------------------------------------------ -# ------------------------------------------------------------------------------ -# copy and patch a file replacing all @var@ by the corresponding value in -# the environment or the variable list given in parameter -patch_file() -{ - local srcfile=$(select_file $1) && shift - local dstfile=$1 && shift - local workfile=${dstfile}.work - - if [[ ! -s $srcfile ]]; then - prnt E "patch_file(): Source file is empty, is not a file or don't exists!" - die 10 - fi - - # Create a sub-process, to avoid bash environment pollution - ( - local varlist='' pattern='' - if [[ $# -eq 0 ]] ; then - pattern="-e s/<\(.*\)>/\$\1\$\1/g" - else - local var= - for var in $* ; do - if ! declare -p $var >/dev/null 2>&1 ; then - local $var=$(eval echo \$$var) - fi - pattern="$pattern -e s/@$var@/\$$var/g" - varlist=$varlist\$$var - done - fi - - # sed replace with \$$VAR and envsubst do the replace by value - sed $pattern $srcfile | envsubst ${varlist:+"$varlist"} > "$workfile" - ) - - local -a rights=( $(stat --printf="%a %u %g" "$srcfile") ) - unset srcfile - mv "$workfile" "$dstfile" - chmod ${rights[0]} "$dstfile" - chown ${rights[1]}:${rights[2]} "$dstfile" - - unset rights dstfile -} -export -f patch_file -# ------------------------------------------------------------------------------ - - # ------------------------------------------------------------------------------ # Put a small header in a file showing it have been automatically modified tag_file() { for f in $@; do - local text="# File automatically modified by init.sh on $(stdtime)." - if [[ -e $f ]]; then - sed -i "1s/^/$text\n/" $f - else - echo $text > $f - sed -i -e "s/modified/generated/" $f - fi + local text="# File automatically modified by init.sh on $(stdtime)." + if [[ -e $f ]]; then + sed -i "1s/^/$text\n/" $f + else + echo $text | sed "s/modified/generated/" > $f + fi done } export -f tag_file @@ -300,10 +253,10 @@ export -f tag_file file_exists() { for f in $@; do - if [[ ! -f $(select_file $f) ]]; then - echo $f - return 1 - fi + if [[ ! -f $(select_file $f) ]]; then + echo $f + return 1 + fi done return 0 } @@ -318,8 +271,8 @@ file_must_exists() prnt I "Checking $@ files existance..." local mf=$(file_exists $@) if [[ $? -ne 0 ]]; then - prnt E "file_must_exists(): The $mf file is missing, can't continue." - die 10 + prnt E "file_must_exists(): The $mf file is missing, can't continue." + die 10 fi unset mf } @@ -332,10 +285,10 @@ export -f file_must_exists directory_exists() { for d in $@; do - if [[ ! -d $(select_directory $d) ]]; then - echo $d - return 1 - fi + if [[ ! -d $(select_directory $d) ]]; then + echo $d + return 1 + fi done return 0 } @@ -350,8 +303,8 @@ directory_must_exists() prnt I "Checking $@ directories existance..." local md=$(directory_exists $@) if [[ $? -ne 0 ]]; then - prnt E "directory_must_exists(): The $md directory is missing, can't continue." - die 10 + prnt E "directory_must_exists(): The $md directory is missing, can't continue." + die 10 fi unset md } diff --git a/lib/vars.sh b/lib/vars.sh new file mode 100644 index 0000000..7faf985 --- /dev/null +++ b/lib/vars.sh @@ -0,0 +1,106 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# Variables substitution function +# This file is part of the init.sh project +# Copyright (c) 2019-2024 Geoffray Levasseur +# ------------------------------------------------------------------------------ +# This file is distributed under 3-clause BSD license. +# The complete license agreement can be obtained at: +# https://opensource.org/licenses/BSD-3-Clause +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# Replace @VAR@ in a text file by the corresponding $VAR value +# The --delimiter or -d option allow to use something else than @ +setvar() { + local delimiter="@" + local vars=() + local file + + # Parse arguments + while [[ $# -gt 0 ]]; do + case "$1" in + --delimiter|-d) + shift + delimiter="${1:-@}" + ;; + -*) + prnt E "setvar(): Unknown option: $1" + die + ;; + *) + if [[ -f $1 && $# -eq 1 ]]; then + file="$1" + else + vars+=("$1") + fi + ;; + esac + shift + done + + if [[ -z $file ]]; then + prnt E "Usage: setvar [--delimiter D] VAR1 [VAR2 ...] " + die 1 + fi + if [[ ${#vars[@]} -eq 0 ]]; then + prnt E "No variable name(s) provided." + die 1 + fi + + local var val escaped pattern + for var in "${vars[@]}"; do + val="${!var}" + if [[ -z $val ]]; then + prnt W "Variable '$var' is unset or empty; skipped." + continue + fi + + # Échapper les caractères spéciaux pour sed + escaped=$(printf '%s' "$val" | sed -e 's/[\/&]/\\&/g') + + pattern="${delimiter}${var}${delimiter}" + + prnt I "Replacing $pattern with $val in $file" + sed -i -e "s|$pattern|$escaped|g" "$file" + done +} +export -f setvar +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# Replace @VAR@ in a text file by the corresponding values available in the +# environment. The --delimiter or -d option allow to use something else than @ +setvars_from_env() { + local file delimiter="@" + while [[ $# -gt 0 ]]; do + case "$1" in + -d|--delimiter) + shift + delimiter="${1:-@}" + ;; + *) + file="$1" + ;; + esac + shift + done + + [[ -f $file ]] || { + prnt E "File not found: $file" + die 1 + } + + local vars + vars=$(grep -o "${delimiter}[A-Z0-9_]\+${delimiter}" "$file" | sort -u | tr -d "$delimiter") + [[ -z $vars ]] && return 0 + + setvar --delimiter "$delimiter" $vars "$file" +} +export -f setvars_from_env +# ------------------------------------------------------------------------------ + + +# EOF \ No newline at end of file