confz

git mirror of https://ccx.te2000.cz/bzr/confz
git clone https://ccx.te2000.cz/git/confz
Log | Files | Refs

commit 1c4e1e32601fdc6c053d0f7c53b9be115a0017db
parent 5083b0361a9096944671668922a504b16e426266
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date:   Thu, 19 Jun 2014 19:46:31 +0200

variable tracing
Diffstat:
Mbin/confz | 42+++++++++++++++++++++++++++++++++---------
Mzsh-functions/confz_fs_init | 59+++++++++++++++++------------------------------------------
Mzsh-functions/confz_vserver_init | 4++--
3 files changed, 52 insertions(+), 53 deletions(-)

diff --git a/bin/confz b/bin/confz @@ -7,9 +7,10 @@ setopt extended_glob warn_create_global typeset -gA vars vars_prev typeset -ga do_command -typeset -g confz_indent check_only +typeset -g confz_indent check_only verbose -check_only=0 +: ${check_only:=0} +: ${verbose:=0} # helper that prints out error message and exits die() { @@ -38,6 +39,29 @@ confz_do() { "$@" || die "command failed with error $?: ${(q)@}" } +# trace-printing helper for setting $vars values +setvar() { + if (($verbose)); then + print -r - "$confz_indent$fg[cyan]$1$fg[default]=${(qqq)2}" + fi + vars[$1]=$2 +} + +# set $vars parameter if it's empty (ie. set default value) +defvar() { + [[ -z $1 ]] && setvar $1 $2 +} + +# check if variables are nonempty +checkvars() { + local var + local -a empty + for var in "$@"; do + [[ -z $vars[$var] ]] && empty+=( $var ) + done + (( $#empty )) && die "required parameters are empty: ${(q)empty}" +} + # autoload all relevant functions and run confz_*_init confz_load() { local func @@ -86,10 +110,10 @@ require() { # parse variable assignments while (( $# )); do case $1 in - (:*) vars[${1#:}]=${vars_prev[${1#:}]};; + (:*) setvar ${1#:} ${vars_prev[${1#:}]};; (%*=*) lift[${${1#%}%%=*}]=${${1#%}#*=};; (%*) lift[${1#%}]=${1#%};; - (*=*) vars[${1%%=*}]=${1#*=};; + (*=*) setvar ${1%%=*} ${1#*=};; (--) shift; break;; (*) die "$name: unrecognised argument: ${(qqq)1}";; esac @@ -122,15 +146,15 @@ require() { # restore $do_command do_command=( "${do_command_prev[@]}" ) - # lift %variables from calee to caller - for outer inner in ${(kv)lift}; do - vars_prev[$outer]=${vars[$inner]} - done - # restore old $vars and put calee's $vars into $vars_prev vars_switch=( "${(kv)vars[@]}" ) vars=( "${(kv)vars_prev[@]}" ) vars_prev=( "${(kv)vars_switch[@]}" ) + + # lift %variables from calee to caller + for outer inner in ${(kv)lift}; do + setvar $outer ${vars_prev[$inner]} + done } # "dependency" that represents toplevel and gets it's deps out of argv diff --git a/zsh-functions/confz_fs_init b/zsh-functions/confz_fs_init @@ -7,16 +7,17 @@ # configure LVM2 logical volume confz_logical_volume_check() { - [[ -n ${vars[vg_name]:=$DEFAULT_VG} ]] || \ + defvar vg_name $DEFAULT_VG + [[ -n ${vars[vg_name]} ]] || \ die "$0: DEFAULT_VG is unset and no 'vg_name' was passed" - [[ -n ${vars[size]:=$DEFAULT_VOLUME_SIZE} ]] || \ + defvar size $DEFAULT_VOLUME_SIZE + [[ -n ${vars[size]} ]] || \ die "$0: DEFAULT_VOLUME_SIZE is unset and no 'size' was passed" - [[ -n ${vars[lv_name]} ]] || \ - die "$0: no 'lv_name' was passed" + checkvars lv_name - vars[device]=/dev/mapper/$vars[vg_name]-$vars[lv_name] + setvar device /dev/mapper/$vars[vg_name]-$vars[lv_name] do_command=( lvcreate @@ -31,14 +32,11 @@ confz_logical_volume_check() { # create filesystem on block device confz_filesystem_check() { - [[ -n ${vars[device]} ]] || \ - die "$0: no 'device' was passed" - - [[ -n ${vars[filesystem]:=$DEFAULT_FS} ]] || \ + defvar filesystem $DEFAULT_FS + [[ -n ${vars[filesystem]} ]] || \ die "$0: DEFAULT_FS is unset and no 'filesystem' was passed" - [[ -n ${vars[label]} ]] || \ - die "$0: no 'label' was passed" + checkvars label device filesystem [[ -b ${vars[device]} ]] || \ die "$0: not a block device: ${(qqq)vars[device]}" @@ -69,20 +67,9 @@ confz_filesystem_check() { # put mountpoint for device into /etc/fstab confz_fstab_check() { - [[ -n ${vars[device]} ]] || \ - die "$0: no 'device' was passed" - - [[ -n ${vars[mountpoint]} ]] || \ - die "$0: no 'mountpoint' was passed" - - [[ -n ${vars[filesystem]} ]] || \ - die "$0: no 'filesystem' was passed" - - [[ -n ${vars[opts]} ]] || \ - die "$0: no 'opts' was passed" - - : ${vars[dump]:=0} - : ${vars[pass]:=2} + checkvars device mountpoint filesystem opts + defvar dump 0 + defvar pass 2 local device mountpoint filesystem opts dump pass sed '/^[ \t]*#/d;s/#.*//;s/[ \t]\+/ /g' /etc/fstab | \ @@ -121,11 +108,7 @@ confz_fstab_do() { # make device mounted on mountpoint confz_mounted_check() { - [[ -n ${vars[device]} ]] || \ - die "$0: no 'device' was passed" - - [[ -n ${vars[mountpoint]} ]] || \ - die "$0: no 'mountpoint' was passed" + checkvars device mountpoint grep -q "^${vars[device]} ${vars[mountpoint]} " /proc/mounts } @@ -138,18 +121,10 @@ confz_mounted_check() { # create LVM2 logical volume, and make sure it's in fstab and mounted confz_mounted_volume_check() { - [[ -n ${vars[lv_name]} ]] || \ - die "$0: no 'lv_name' was passed" - - [[ -n ${vars[mountpoint]} ]] || \ - die "$0: no 'mountpoint' was passed" - - [[ -n ${vars[size]} ]] || \ - die "$0: no 'size' was passed" - - : ${vars[filesystem]:=xfs} - : ${vars[opts]:=noatime} - : ${vars[label]:=${vars[lv_name]}} + checkvars lv_name opts label + defvar filesystem xfs + defvar opts noatime + defvar label $vars[lv_name] require logical_volume %device :vg_name :size :lv_name require filesystem :device :label :filesystem diff --git a/zsh-functions/confz_vserver_init b/zsh-functions/confz_vserver_init @@ -38,8 +38,8 @@ confz_vserver_check() { [[ -n ${vars[source]} ]] || \ die "$0: no 'source' was passed" - vars[etcdir]=/etc/vservers/${vars[name]} - vars[vdir]=/vservers/${vars[name]} + setvar etcdir /etc/vservers/${vars[name]} + setvar vdir /vservers/${vars[name]} local ctx ret ret=1