3 # This script emulate the behaviour of vconftool
5 # author: jose.bollo@open.eurogiciel.org
16 reset=$(printf '\e[0m')
17 red=$(printf '\e[1;31m')
18 yellow=$(printf '\e[1;33m')
19 green=$(printf '\e[1;32m')
28 $verbose && echo "${green}$*${reset}"
33 $quiet || echo "${yellow}WARNING: $*${reset}"
38 $quiet || echo "${red}ERROR: $*${reset}" >&2
45 error "$exe $cmd: bad arguments $*"
53 if buxtonctl -s check >/dev/null 2>&1
56 elif buxtonctl -d check >/dev/null 2>&1
60 error "unable to detect buxton mode"
68 buxtonctl $buxmode -- "$@"
72 buxton check > /dev/null
76 local layer="$1" group="$2"
77 buxton list-groups "${layer}" 2>/dev/null |
78 grep -q "found group ${group}\$"
82 local layer="$1" group="$2" name="$3"
83 buxton list-keys "${layer}" "${group}" 2>/dev/null |
84 grep -q "found key ${name}\$"
88 local layer="$1" group="$2"
89 if buxton create-group "$layer" "$group" > /dev/null
91 info "group $group succesfully created for layer $layer"
93 error "can not create group $group for layer $layer"
100 local layer="$1" group="$2" result=
101 if ! result=$(buxton get-label "$layer" "$group" 2> /dev/null |
102 grep "\[$layer] $group:(null) - " |
105 error "can not get the label $label of group $group of layer $layer"
106 elif [[ -z "$result" ]]
108 error "invalid label gotten for group $group of layer $layer"
113 local layer="$1" group="$2" name="$3" result=
114 if ! result=$(buxton get-label "$layer" "$group" "$name" 2> /dev/null |
115 grep "\[$layer] $group:$name - " |
118 error "can not get the label $label of key $name in group $group of layer $layer"
119 elif [[ -z "$result" ]]
121 error "invalid label gotten for key $name in group $group of layer $layer"
131 local layer="$1" group="$2" label="$3"
132 if ! buxton set-label "$layer" "$group" "$label" > /dev/null
134 error "can not set label $label to group $group of layer $layer"
135 elif [[ "$label" != "$(buxton_get_label "$layer" "$group")" ]]
137 error "check failed when setting label $label to group $group of layer $layer"
139 info "label $label set to group $group of layer $layer"
142 local layer="$1" group="$2" name="$3" label="$4"
143 if ! buxton set-label "$layer" "$group" "$name" "$label" > /dev/null
145 error "can not set label $label to key $name in group $group of layer $layer"
146 elif [[ "$label" != "$(buxton_get_label "$layer" "$group" "$name")" ]]
148 error "check failed when setting label $label to key $name in group $group of layer $layer"
150 info "label $label set to key $name in group $group of layer $layer"
155 buxton_ensure_group() {
156 local layer="$1" group="$2" label="$3"
157 if buxton_has_group "$layer" "$group"
159 info "group $group exists in layer $layer"
161 buxton_make_group "$layer" "$group" || return
163 if [[ -n "$label" ]] && [[ "$label" != "$(buxton_get_label "$layer" "$group")" ]]
165 buxton_set_label "$layer" "$group" "$label"
167 info "group $group in layer $layer already has label $label"
171 buxton_ensure_ready() {
174 error "can not connect to buxton service"
180 local layer="$1" group="$2" name="$3"
183 if ! buxton_has_key "$layer" "$group" "$name"
185 info "key $name in group $group of layer $layer is already unset"
186 elif ! buxton "unset-value" "$layer" "$group" "$name" > /dev/null
188 error "can not unset key $name in group $group of layer $layer"
189 elif buxton_has_key "$layer" "$group" "$name"
191 error "check failed when unsetting key $name in group $group of layer $layer"
193 info "key $name in group $group of layer $layer is unset"
198 #############################################################################################
204 # get the layer of the key
207 user/*) echo -n "user";;
209 if [[ "$buxmode" = '-d' ]]
211 error "the layer temp isn't available in direct mode"
220 # get the standard value
222 local typ="$1" val="$2"
223 case "$typ:${val,,}" in
224 bool:0|bool:false|bool:off) echo -n "false";;
225 bool:1|bool:true|bool:on) echo -n "true";;
230 # get buxton-type from vconf-type
233 int) echo -n "int32";;
234 string) echo -n "string";;
235 double) echo -n "double";;
236 bool) echo -n "bool";;
237 *) error "unknown vconf-type $1"; exit;;
241 # get vconf-type from buxton-type
244 int32) echo -n "int";;
245 string) echo -n "string";;
246 double) echo -n "double";;
247 bool) echo -n "bool";;
248 *) error "unknown buxton-type $1"; exit;;
254 local typ="$1" name="$2" value="$3" smack="$4" layer=
256 layer="$(layer_of_key "$name")"
257 typ="$(v2btype "$typ")"
258 value="$(stdval "$typ" "$value")"
260 if buxton "set-$typ" "$layer" "$group" "$name" "$value" > /dev/null
262 info "key $name in group $group of layer $layer set to $typ: $value"
263 [[ -z "$smack" ]] || buxton_set_label "$layer" "$group" "$name" "$smack"
265 error "can not set key $name in group $group of layer $layer with $typ: $value"
269 # calls getopt with negative numbers protection
271 local name="$exe $1" long="$2" short="$3" x=
276 sed "s:\(.\)'\(.\):\\1\\\\'\\2:g ; s/^'\(-[0-9.]*\)'\$/'protect-sign:\1'/ ; s/^.*/& /"
279 getopt -n "$name" -l "$long" -o "$short" -- "$@" |
280 sed "s/'protect-sign:/'/g"
284 # ensure existing the group for vconf
286 buxton_ensure_group "base" "$group" "$context" || exit
290 local typ= name= layer= value= smack= force=false instal=false
293 eval set -- $(mygetopt set force,install,type:,smack:,group:,user: fit:s:g:u: "$@")
313 -u|-g|--user|--group)
314 info "option $1 $2 ignored!"
326 [[ "$#" -eq 2 ]] || badargs set "$*"
329 [[ -n "$typ" ]] || badargs set no type given
330 [[ -n "$name" ]] || badargs set no keyname given
335 if expr "$name" : memory/ >/dev/null
337 setkey "$typ" "memory_init/$name" "$value" "$smack" || exit
338 [[ "$buxmode" = -d ]] && exit
340 warning only keys beginning with memory/ are allowing option -i
343 setkey "$typ" "$name" "$value" "$smack"
349 local name= layer= rec=false val=
352 eval set -- $(mygetopt get recursive r "$@")
353 if [[ "$1" = "-r" || "$1" = "--recursive" ]]
358 [[ "$1" = -- ]] || badargs get unexpected error
360 [[ $# -eq 1 && -n "$1" ]] || badargs get "$@"
364 layer="$(layer_of_key "$name")"
367 set -- $(buxton list-keys "$layer" "$group" "$name" 2> /dev/null |
375 val="$(buxton get "$layer" "$group" "$name" 2> /dev/null |
376 grep "\[$layer] $group:$name = " |
377 sed 's/.* = // ; s/^int32:/int:/ ; s/^\(.*\): \(.*\)$/\2 (\1)/')"
380 error "key $name not found in group $group of layer $layer"
382 echo "$name, value = $val"
393 [[ $# -eq 1 && -n "$name" ]] || badargs unset
395 layer="$(layer_of_key "$name")"
398 buxton_unset "$layer" "$group" "$name"
404 local name= smack= layer=
407 [[ $# -eq 2 && -n "$name" && -n "$smack" ]] || badargs label
410 layer="$(layer_of_key "$name")"
413 buxton_set_label "$layer" "$group" "$name"
426 -v|--verbose) verbose=true; cmd="${1,,}"; shift;;
427 -q|--quiet) quiet=true; cmd="${1,,}"; shift;;
433 unset) dounset "$@";;
434 label) dolabel "$@";;
435 help|-h|--help) cat << EOC
437 Usage: $exe [-v|--verbose|-q|--quiet] command ...
439 Command set: set a value (create or update)
441 $exe set -t <TYPE> <KEY-NAME> <VALUE> <OPTIONS>
443 <TYPE> = int | bool | double | string
447 -u, --user <UID> ignored! (compatibility)
448 -g, --group <GID> ignored! (compatibility)
449 -i, --install for keys starting with memory/
450 installs in db the startup value
451 -s, --smack <LABEL> tells to set the security label <LABEL>
452 -f, --force tells force updating the value
454 Ex) $exe set -t string db/testapp/key1 "This is test"
456 Command get: get a value
458 $exe get <OPTIONS> <KEY-NAME>
462 -r, --recursive retrieve all keys having the given prefix
464 Ex) $exe get db/testapp/key1
465 $exe get -r db/testapp/
467 Command unset: remove a value
469 $exe unset <KEY-NAME>
471 Ex) $exe unset db/testapp/key1
473 Command label: set the security label
475 $exe label <KEY-NAME> <SMACK-LABEL>
477 Ex) $exe label db/testapp/key1 User::Share