# ------------------------------------------------------------------------------ # File manipulation function # This file is part of the init.sh project # Copyright (c) 2019-2021 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 # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Define normalised time display, filename friendly stdtime() { date --rfc-3339=seconds | sed -e 's/ /-/' -e 's/://g' } export -f stdtime # ------------------------------------------------------------------------------ # Backup original installation files # (or any old files if runned several time on same file) backupdist() { if [[ $# -lt 1 ]]; then prnt E "backupdist(): 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 backupdist to treat target backupdist $(readlink -f ${file}) elif [[ -f ${file} ]]; then prnt I "Création d'une sauvegarde de ${file} du $tmstmp..." cp -av $file ${file}.dist.${tmstmp} if [[ $? -ne 0 ]]; then prnt E "backupdist(): Échec de copie du fichier." die 12 fi elif [[ -d ${file} ]]; then prnt I "Création d'une sauvegarde du répertoire ${file} du $tmstmp..." cp -av $file ${file}.dist.${tmstmp} if [[ $? -ne 0 ]]; then prnt E "backupdist(): Échec de copie du répertoire." die 12 fi else prnt W "backupdist(): $file n'existe pas, rien à faire." fi unset tmstmp done unset file } export -f backupdist # ------------------------------------------------------------------------------ # Install file to the host (specific first then general) # Todo: implement wildcard support installfile() { local filelist="" local i=0 if [[ $# -lt 2 ]]; then prnt E "installfile(): At least two arguments are required." die 11 fi if [[ $(echo $@ | grep "\*\|\?") ]]; then prnt E "installfile(): Wildcards are not authorized." die 7 fi local arg= for arg in $@; do if [[ -f $MYPATH/repo/hosts/$HOSTNAME/$arg ]]; then filelist="$filelist $MYPATH/repo/hosts/$HOSTNAME/$arg" elif [[ -f $MYPATH/repo/common/$arg ]]; then filelist="$filelist $MYPATH/repo/common/$arg" else # Not found in repository, we expect full name filelist="$filelist $arg" fi done unset arg # Empty to just obtain the target which is the last element of the list local file= for file in $filelist; do : done if [[ ! $file == /* ]]; then prnt E "installfile(): Target must be on the root filesystem and full path must be provided." die 13 fi unset file if [[ -d $(dirname $i) ]]; then prnt I "Création du répertoire $(dirname $i) d'accueil..." mkdir -pv $(dirname $i) if [[ $? -ne 0 ]]; then prnt E "installfile(): Can't create target dirrectory!" die 12 fi fi prnt I "Copie des fichiers ${filelist}..." cp -av $filelist if [[ $? -ne 0 ]]; then prnt E "installfile(): Couldn't copy some required files!" die 12 fi } export -f installfile # ------------------------------------------------------------------------------ # determine if a directory is empty isdirempty() { dir=$1 if [[ ! -d $dir ]]; then return 0 fi nbfiles=$(ls -a1 $dir | egrep -v '^.$|^..$' | wc -l) if [[ $nbfiles -eq 0 ]]; then return 0 fi return 1 } # ------------------------------------------------------------------------------ # patch a file replacing all @var@ by the corresponding value in environment patchfile() { : # todo } # EOF