Intégration de la branche uenv-modifs

This commit is contained in:
Jephté Clain 2015-06-22 10:25:03 +04:00
commit 2a3eb76ab1
21 changed files with 118 additions and 67 deletions

2
.udir
View File

@ -18,7 +18,7 @@ kvm_service=
openvz_service= openvz_service=
configure_variables=(dest uninst_utools rm_utools kvm_service openvz_service) configure_variables=(dest uninst_utools rm_utools kvm_service openvz_service)
configure_dest_for=(bashrc profile lib/uinst/conf lib/uinst/rootconf lib/profile.d/nutools lib/bashrc.d/bash_completion lib/init.d/kvm-stop-all legacy/sysinc/utools legacy/sysinc/system_caps legacy/sysinc/private/init) configure_dest_for=(bashrc profile lib/uinst/conf lib/uinst/rootconf lib/profile.d/nutools.shared lib/bashrc.d/bash_completion.shared lib/init.d/kvm-stop-all legacy/sysinc/utools legacy/sysinc/system_caps legacy/sysinc/private/init)
config_scripts=(lib/uinst/conf lib/uinst/system_caps.legacy) config_scripts=(lib/uinst/conf lib/uinst/system_caps.legacy)
install_profiles=true install_profiles=true
profiledir=lib/profile.d profiledir=lib/profile.d

2
bashrc
View File

@ -2,5 +2,5 @@
function uprovide() { :; } function uprovide() { :; }
source @@dest@@/lib/ulib/uenv || return source @@dest@@/lib/ulib/uenv || return
__uenv_source_dirs @@dest@@/bashrc.d "$HOME/etc/bashrc.d" "$HOME/etc/${HOSTNAME%%.*}-bashrc.d" __uenv_source_dirs @@dest@@/bashrc.d "$HOME/etc/bashrc.${HOSTNAME%%.*}.d"
__uenv_cleanup __uenv_cleanup

View File

@ -3962,7 +3962,10 @@ function get_defaults_files() {
__gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f")
__gd_found=1 __gd_found=1
fi fi
if [ -r "$HOME/etc/default/$__gd_f" ]; then if [ -r "$HOME/etc/default.${HOSTNAME%%.*}/$__gd_f" ]; then
__gd_fs=("${__gd_fs[@]}" "$HOME/etc/default.${HOSTNAME%%.*}/$__gd_f")
__gd_found=1
elif [ -r "$HOME/etc/default/$__gd_f" ]; then
__gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f")
__gd_found=1 __gd_found=1
fi fi
@ -3976,9 +3979,9 @@ function get_defaults_files() {
} }
function set_defaults() { function set_defaults() {
# Pour chaque argument, sourcer /etc/default/$arg *et* ~/etc/default/$arg si # Pour chaque argument, sourcer /etc/default/$arg *et* (en priorité
# ceux-ci existent. *Sinon*, lire $scriptdir/lib/default/$arg si ce fichier # ~/etc/default.$HOSTNAME/$arg ou à défaut ~/etc/default/$arg) si ceux-ci
# existe # existent. *Sinon*, lire $scriptdir/lib/default/$arg si ce fichier existe
local -a __sd_fs local -a __sd_fs
local __sd_f local __sd_f
get_defaults_files __sd_fs "$@" get_defaults_files __sd_fs "$@"

View File

@ -57,7 +57,8 @@ function __uenv_source_dirs() {
source "$sio" source "$sio"
else else
for file in "$dir/"*; do for file in "$dir/"*; do
if __uenv_check_file "$(dirname -- "$file")" "$(basename -- "$file")"; then [ -f "$file" ] || continue
if __uenv_check_file "$dir" "$(basename -- "$file")"; then
source "$file" source "$file"
fi fi
done done

View File

@ -7,18 +7,20 @@ uprovide uenv_update
urequire base uenv urequire base uenv
function __uenv_move_after() { function __uenv_move_after() {
# Dans le fichier $1, déplacer la ligne $2 après la ligne $3. # Dans le fichier $1, déplacer la ligne $2 après la ligne commençant par
# l'expression régulière '^$3:'
# Si la ligne $2 n'existe pas, ne rien faire # Si la ligne $2 n'existe pas, ne rien faire
# Si la ligne $3 n'existe pas ou vaut '*', mettre la ligne $2 en dernier. # Si la ligne $3 n'existe pas ou vaut '*', mettre la ligne $2 en dernier.
# Si $4 est spécifié, l'utiliser comme fichier temporaire. # Si $4 est spécifié, l'utiliser comme fichier temporaire.
local tmpfile="$4" local tmpfile="$4"
[ -n "$tmpfile" ] || ac_set_tmpfile tmpfile [ -n "$tmpfile" ] || ac_set_tmpfile tmpfile
# XXX Il faudrait quoter $2 et $3 pour éviter les caractères spéciaux de # XXX Il faudrait quoter $3 pour éviter les caractères spéciaux de grep!
# grep! if quietgrep -F "$2" "$1"; then
if quietgrep "^$2$" "$1"; then local re_after="$3"
if [ "$3" != "*" ] && quietgrep "^$3$" "$1"; then [ "$re_after" != "*" ] && re_after="^$re_after:"
awkrun line="$2" after="$3" ' if [ "$re_after" != "*" ] && quietgrep "$re_after" "$1"; then
awkrun line="$2" re_after="$re_after" '
BEGIN { BEGIN {
found_line = 0 found_line = 0
found_after = 0 found_after = 0
@ -29,10 +31,10 @@ BEGIN {
next next
} }
} }
! found_after && $0 == after { ! found_after && $0 ~ re_after {
found_after = 1 found_after = 1
if (found_line) { if (found_line) {
# si nous avons trouvé la ligne avant after, la mettre juste après # si nous avons trouvé la ligne avant re_after, la mettre juste après
# sinon, pas la peine de faire de modification # sinon, pas la peine de faire de modification
print print
print line print line
@ -41,7 +43,7 @@ BEGIN {
} }
{ print } { print }
END { END {
if (! found_after && after == "*") { if (! found_after && re_after == "*") {
if (found_line) { if (found_line) {
print line print line
} }
@ -49,7 +51,7 @@ END {
}' <"$1" >"$tmpfile" && }' <"$1" >"$tmpfile" &&
cat "$tmpfile" >"$1" cat "$tmpfile" >"$1"
else else
grep -v "^$2$" "$1" >"$tmpfile" grep -vF "$2" "$1" >"$tmpfile"
echo "$2" >>"$tmpfile" echo "$2" >>"$tmpfile"
cat "$tmpfile" >"$1" cat "$tmpfile" >"$1"
fi fi
@ -57,18 +59,20 @@ END {
} }
function __uenv_move_before() { function __uenv_move_before() {
# Dans le fichier $1, déplacer la ligne $2 avant la ligne $3. # Dans le fichier $1, déplacer la ligne $2 avant la ligne commençant par
# l'expression régulière '^$3:'
# Si la ligne $2 n'existe pas, ne rien faire # Si la ligne $2 n'existe pas, ne rien faire
# Si la ligne $3 n'existe pas ou vaut '*', mettre la ligne $2 en premier. # Si la ligne $3 n'existe pas ou vaut '*', mettre la ligne $2 en premier.
# Si $4 est spécifié, l'utiliser comme fichier temporaire. # Si $4 est spécifié, l'utiliser comme fichier temporaire.
local tmpfile="$4" local tmpfile="$4"
[ -n "$tmpfile" ] || ac_set_tmpfile tmpfile [ -n "$tmpfile" ] || ac_set_tmpfile tmpfile
# XXX Il faudrait quoter $2 et $3 pour éviter les caractères spéciaux de # XXX Il faudrait quoter $3 pour éviter les caractères spéciaux de grep!
# grep! if quietgrep -F "$2" "$1"; then
if quietgrep "^$2$" "$1"; then local re_before="$3"
if [ "$3" != "*" ] && quietgrep "^$3$" "$1"; then [ "$re_before" != "*" ] && re_before="^$re_before:"
awkrun line="$2" before="$3" ' if [ "$re_before" != "*" ] && quietgrep "$re_before" "$1"; then
awkrun line="$2" re_before="$re_before" '
BEGIN { BEGIN {
found_line = 0 found_line = 0
found_before = 0 found_before = 0
@ -79,7 +83,7 @@ BEGIN {
next next
} }
} }
! found_before && ($0 == before || before == "*") { ! found_before && ($0 ~ re_before || re_before == "*") {
found_before = 1 found_before = 1
if (! found_line) { if (! found_line) {
print line print line
@ -92,7 +96,7 @@ BEGIN {
cat "$tmpfile" >"$1" cat "$tmpfile" >"$1"
else else
echo "$2" >"$tmpfile" echo "$2" >"$tmpfile"
grep -v "^$2$" "$1" >>"$tmpfile" grep -vF "$2" "$1" >>"$tmpfile"
cat "$tmpfile" >"$1" cat "$tmpfile" >"$1"
fi fi
fi fi
@ -107,36 +111,47 @@ function uenv_update_dir() {
# $3(=$1) est le répertoire de destination. Si $1 est un répertoire de # $3(=$1) est le répertoire de destination. Si $1 est un répertoire de
# préparation temporaire, on peut spécifier grâce à $3 quel est le # préparation temporaire, on peut spécifier grâce à $3 quel est le
# répertoire final après préparation. # répertoire final après préparation.
local dir="$(abspath "$1")" # S'ils sont spécifiés, les arguments $4..* sont des répertoires contenant
local destdir="${3:-$dir}" # des fichiers de profils supplémentaires qu'il faut considérer aussi. Dans
local tmpfile="$2" # ce cas, $3 est ignoré.
[ -n "$tmpfile" ] || ac_set_tmpfile tmpfile local dir="$(abspath "$1")"; shift
local tmpfile="$1"; shift
local destdir="${1:-$dir}"; shift
local sio="$dir/.source_in_order" local sio="$dir/.source_in_order"
local before after file local before after file filename
local -a files local -a files
[ -n "$tmpfile" ] || ac_set_tmpfile tmpfile
[ $# -gt 0 ] && destdir=
set -- "$dir" "$@"
local __uname_system="$UNAME_SYSTEM" local __uname_system="$UNAME_SYSTEM"
local __myhostname="$MYHOSTNAME" local __myhostname="$MYHOSTNAME"
>"$sio" >"$sio"
for file in "$dir/"*; do for dir in "$@"; do
[ -f "$file" ] || continue for file in "$dir/"*; do
file="$(basename "$file")" [ -f "$file" ] || continue
files=("${files[@]}" "$file") files=("${files[@]}" "$file")
__uenv_check_file "$dir" "$file" && echo "$file" >>"$sio" filename="$(basename -- "$file")"
__uenv_check_file "$dir" "$filename" && echo "$filename:$file" >>"$sio"
done
done done
# traiter d'abord les fichiers qui ont '@before *' ou '@after *' # traiter d'abord les fichiers qui ont '@before *' ou '@after *'
local -a nfiles local -a nfiles
for file in "${files[@]}"; do for file in "${files[@]}"; do
before="$(<"$dir/$file" awk '$0 ~ /^##@before / { print $2; exit 0 }')" filename="$(basename -- "$file")"
before="$(<"$file" awk '$0 ~ /^##@before / { print $2; exit 0 }')"
if [ "$before" == "*" ]; then if [ "$before" == "*" ]; then
__uenv_move_before "$sio" "$file" "$before" "$tmpfile" __uenv_move_before "$sio" "$filename:$file" "$before" "$tmpfile"
else else
array_set nfiles "$file" array_set nfiles "$file"
fi fi
after="$(<"$dir/$file" awk '$0 ~ /^##@after / { print $2; exit 0 }')"
after="$(<"$file" awk '$0 ~ /^##@after / { print $2; exit 0 }')"
if [ "$after" == "*" ]; then if [ "$after" == "*" ]; then
__uenv_move_after "$sio" "$file" "$after" "$tmpfile" __uenv_move_after "$sio" "$filename:$file" "$after" "$tmpfile"
else else
array_set nfiles "$file" array_set nfiles "$file"
fi fi
@ -146,13 +161,29 @@ function uenv_update_dir() {
# est avant *, si A est traité avant B, A risque de se trouver après B si B # est avant *, si A est traité avant B, A risque de se trouver après B si B
# est déplacé au début de la liste. # est déplacé au début de la liste.
for file in "${nfiles[@]}"; do for file in "${nfiles[@]}"; do
before="$(<"$dir/$file" awk '$0 ~ /^##@before / { print $2; exit 0 }')" filename="$(basename -- "$file")"
[ -n "$before" -a "$before" != "*" ] && __uenv_move_before "$sio" "$file" "$before" "$tmpfile"
after="$(<"$dir/$file" awk '$0 ~ /^##@after / { print $2; exit 0 }')" before="$(<"$file" awk '$0 ~ /^##@before / { print $2; exit 0 }')"
[ -n "$after" -a "$after" != "*" ] && __uenv_move_after "$sio" "$file" "$after" "$tmpfile" [ -n "$before" -a "$before" != "*" ] && __uenv_move_before "$sio" "$filename:$file" "$before" "$tmpfile"
after="$(<"$file" awk '$0 ~ /^##@after / { print $2; exit 0 }')"
[ -n "$after" -a "$after" != "*" ] && __uenv_move_after "$sio" "$filename:$file" "$after" "$tmpfile"
done done
awkrun destdir="$destdir" '{ print "source " destdir "/" $0 }' <"$sio" >"$tmpfile" && awkrun destdir="$destdir" '{
pos = match($0, /:/)
if (pos != 0) {
filename = substr($0, 1, pos - 1)
file = substr($0, pos + 1)
if (destdir != "") {
print "source " destdir "/" filename
} else {
print "source " file
}
} else {
print "source " destdir "/" $0
}
}' <"$sio" >"$tmpfile" &&
cat "$tmpfile" >"$sio" cat "$tmpfile" >"$sio"
} }
@ -161,9 +192,9 @@ function uenv_set_destdirs() {
shared_profiledestdir="$HOME/etc/profile.d" shared_profiledestdir="$HOME/etc/profile.d"
shared_bashrcdestdir="$HOME/etc/bashrc.d" shared_bashrcdestdir="$HOME/etc/bashrc.d"
shared_defaultdestdir="$HOME/etc/default" shared_defaultdestdir="$HOME/etc/default"
profiledestdir="$HOME/etc/${hostname}-profile.d" profiledestdir="$HOME/etc/profile.${hostname}.d"
bashrcdestdir="$HOME/etc/${hostname}-bashrc.d" bashrcdestdir="$HOME/etc/bashrc.${hostname}.d"
defaultdestdir="$HOME/etc/${hostname}-default" defaultdestdir="$HOME/etc/default.${hostname}"
} }
function uenv_sourced_in() { function uenv_sourced_in() {
@ -224,7 +255,8 @@ cas, il faut décommenter la ligne dans ~/.bash_profile qui source ~/.profile"
function uenv_install_profiles() { function uenv_install_profiles() {
local projdir="$1" profiledir="$2" bashrcdir="$3" defaultdir="$4" local projdir="$1" profiledir="$2" bashrcdir="$3" defaultdir="$4"
local tmpfile local tmpfile
local prefix envsrcdir envdestdir envfiles envfile envsrc envdest local prefix envsrcdir envdestdir shadestdir envfiles envfile envsrc envdest shadest
local shared_profiledestdir shared_bashrcdestdir shared_defaultdestdir
local profiledestdir bashrcdestdir defaultdestdir local profiledestdir bashrcdestdir defaultdestdir
uenv_set_destdirs uenv_set_destdirs
@ -234,22 +266,32 @@ function uenv_install_profiles() {
envdestdir="${prefix}destdir"; envdestdir="${!envdestdir}" envdestdir="${prefix}destdir"; envdestdir="${!envdestdir}"
shadestdir="shared_${prefix}destdir"; shadestdir="${!shadestdir}" shadestdir="shared_${prefix}destdir"; shadestdir="${!shadestdir}"
[ -n "$envsrcdir" -a -d "$envsrcdir" ] || continue [ -n "$envsrcdir" -a -d "$envsrcdir" ] || continue
mkdir -p "$envdestdir" "$shadestdir"
array_from_lines envfiles "$(list_files "$envsrcdir")" array_from_lines envfiles "$(list_files "$envsrcdir")"
for envfile in "${envfiles[@]}"; do for envfile in "${envfiles[@]}"; do
envsrc="$envsrcdir/$envfile" if [ "${envfile%.shared}" != "$envfile" ]; then
envdest="$envdestdir/$envfile" # Avec l'extension .shared, toujours installer dans le
shadest="$shadestdir/$envfile" # répertoire des profils partagés
envsrc="$envsrcdir/$envfile"
mkdir -p "$envdestdir" "$shadestdir" envfile="${envfile%.shared}"
if [ ! -f "$envdest" -a -f "$shadest" ]; then shadest="$shadestdir/$envfile"
# Si déjà installé en partagé, continuer à mettre à jour ce
# fichier-là
envdest="$shadest" envdest="$shadest"
else
envsrc="$envsrcdir/$envfile"
envdest="$envdestdir/$envfile"
shadest="$shadestdir/$envfile"
if [ ! -f "$envdest" -a -f "$shadest" ]; then
# Si déjà installé en partagé, continuer à mettre à jour ce
# fichier-là
envdest="$shadest"
fi
fi fi
local actual_envdestdir="$(dirname -- "$envdest")"
if [ ! -f "$envdest" ]; then if [ ! -f "$envdest" ]; then
estep "Installation du profil par défaut $envfile dans $(ppath "$envdestdir")" estep "Installation du profil par défaut $envfile dans $(ppath "$actual_envdestdir")"
/bin/cp -f "$envsrc" "$envdestdir" /bin/cp -f "$envsrc" "$envdest"
elif [ "$prefix" == "default" ]; then elif [ "$prefix" == "default" ]; then
# ne jamais mettre à jour dans default # ne jamais mettre à jour dans default
if testdiff "$envdest" "$envsrc"; then if testdiff "$envdest" "$envsrc"; then
@ -261,7 +303,7 @@ function uenv_install_profiles() {
estepi "Le profil $(ppath "$envdest") a été conservé" estepi "Le profil $(ppath "$envdest") a été conservé"
fi fi
elif testdiff "$envdest" "$envsrc"; then elif testdiff "$envdest" "$envsrc"; then
estep "Le profil par défaut $envfile dans $(ppath "$envdestdir") a été modifié" estep "Le profil par défaut $envfile dans $(ppath "$actual_envdestdir") a été modifié"
if show_info; then if show_info; then
eecho "Voici les différences détectées:" eecho "Voici les différences détectées:"
eecho "" eecho ""
@ -269,15 +311,15 @@ function uenv_install_profiles() {
eecho "" eecho ""
fi fi
if ask_yesno "Faut-il remplacer $(ppath "$envdestdir/$envfile") par le profil par défaut?" O; then if ask_yesno "Faut-il remplacer $(ppath "$envdest") par le profil par défaut?" O; then
/bin/cp -f "$envsrc" "$envdestdir" /bin/cp -f "$envsrc" "$envdest"
fi fi
fi fi
done done
if [ "$prefix" != "default" ]; then if [ "$prefix" != "default" ]; then
estep "Mise à jour de l'ordre de lecture de $(ppath "$envdestdir")" estep "Mise à jour de l'ordre de lecture de $(ppath "$envdestdir")"
uenv_update_dir "$envdestdir" "$tmpfile" uenv_update_dir "$envdestdir" "$tmpfile" "" "$shadestdir"
fi fi
done done
ac_clean "$tmpfile" ac_clean "$tmpfile"

View File

@ -4,5 +4,5 @@
function uprovide() { :; } function uprovide() { :; }
source @@dest@@/lib/ulib/uenv || return source @@dest@@/lib/ulib/uenv || return
__uenv_source_dirs @@dest@@/profile.d "$HOME/etc/profile.d" "$HOME/etc/${HOSTNAME%%.*}-profile.d" __uenv_source_dirs @@dest@@/profile.d "$HOME/etc/profile.${HOSTNAME%%.*}.d"
__uenv_cleanup __uenv_cleanup

13
uenv
View File

@ -100,9 +100,14 @@ if [ -n "$update" ]; then
else else
## Mettre uniquement à jour l'ordre de chargement des fichiers ## Mettre uniquement à jour l'ordre de chargement des fichiers
## ~/etc/{profile.d,bashrc.d} ## ~/etc/{profile.d,bashrc.d}
for dir in "$shared_profiledestdir" "$shared_bashrcdestdir" "$profiledestdir" "$bashrcdestdir"; do ac_set_tmpfile tmpfile
[ -d "$dir" ] || continue for prefix in profile bashrc; do
estep "Mise à jour de $(ppath "$dir")" envdir="${prefix}dir"; envdir="${!envdir}"
uenv_update_dir "$dir" "$envsetup_tmpfile" shadir="shared_${prefix}dir"; shadir="${!shadir}"
[ -d "$envdir" ] || continue
estep "Mise à jour de $(ppath "$envdir")"
uenv_update_dir "$envdir" "$tmpfile" "" "$shadir"
done done
ac_clean "$tmpfile"
fi fi