1
0
mirror of https://github.com/limosek/zaf.git synced 2025-11-01 01:57:38 +01:00

First useable version

This commit is contained in:
Lukas Macura
2016-03-24 15:46:42 +01:00
parent cd564544c5
commit 692c25a775
8 changed files with 540 additions and 59 deletions

280
lib/jshn.sh Normal file
View File

@@ -0,0 +1,280 @@
# functions for parsing and generating json
_json_get_var() {
# dest=$1
# var=$2
eval "$1=\"\$${JSON_PREFIX}$2\""
}
_json_set_var() {
# var=$1
local ___val="$2"
eval "${JSON_PREFIX}$1=\"\$___val\""
}
__jshn_raw_append() {
# var=$1
local value="$2"
local sep="${3:- }"
eval "export -- \"$1=\${$1:+\${$1}\${value:+\$sep}}\$value\""
}
_jshn_append() {
# var=$1
local _a_value="$2"
eval "${JSON_PREFIX}$1=\"\${${JSON_PREFIX}$1} \$_a_value\""
}
_get_var() {
# var=$1
# value=$2
eval "$1=\"\$$2\""
}
_set_var() {
# var=$1
local __val="$2"
eval "$1=\"\$__val\""
}
_json_inc() {
# var=$1
# dest=$2
let "${JSON_PREFIX}$1 += 1" "$2 = ${JSON_PREFIX}$1"
}
_json_add_generic() {
# type=$1
# name=$2
# value=$3
# cur=$4
local var
if [ "${4%%[0-9]*}" = "J_A" ]; then
_json_inc "S_$4" var
else
var="${2//[^a-zA-Z0-9_]/_}"
[[ "$var" == "$2" ]] || export -- "${JSON_PREFIX}N_${4}_${var}=$2"
fi
export -- \
"${JSON_PREFIX}${4}_$var=$3" \
"${JSON_PREFIX}T_${4}_$var=$1"
_jshn_append "JSON_UNSET" "${4}_$var"
_jshn_append "K_$4" "$var"
}
_json_add_table() {
# name=$1
# type=$2
# itype=$3
local cur seq
_json_get_var cur JSON_CUR
_json_inc JSON_SEQ seq
local table="J_$3$seq"
_json_set_var "U_$table" "$cur"
export -- "${JSON_PREFIX}K_$table="
unset "${JSON_PREFIX}S_$table"
_json_set_var JSON_CUR "$table"
_jshn_append "JSON_UNSET" "$table"
_json_add_generic "$2" "$1" "$table" "$cur"
}
_json_close_table() {
local _s_cur
_json_get_var _s_cur JSON_CUR
_json_get_var "${JSON_PREFIX}JSON_CUR" "U_$_s_cur"
}
json_set_namespace() {
local _new="$1"
local _old="$2"
[ -n "$_old" ] && _set_var "$_old" "$JSON_PREFIX"
JSON_PREFIX="$_new"
}
json_cleanup() {
local unset tmp
_json_get_var unset JSON_UNSET
for tmp in $unset J_V; do
unset \
${JSON_PREFIX}U_$tmp \
${JSON_PREFIX}K_$tmp \
${JSON_PREFIX}S_$tmp \
${JSON_PREFIX}T_$tmp \
${JSON_PREFIX}N_$tmp \
${JSON_PREFIX}$tmp
done
unset \
${JSON_PREFIX}JSON_SEQ \
${JSON_PREFIX}JSON_CUR \
${JSON_PREFIX}JSON_UNSET
}
json_init() {
json_cleanup
export -n ${JSON_PREFIX}JSON_SEQ=0
export -- \
${JSON_PREFIX}JSON_CUR="J_V" \
${JSON_PREFIX}K_J_V=
}
json_add_object() {
_json_add_table "$1" object T
}
json_close_object() {
_json_close_table
}
json_add_array() {
_json_add_table "$1" array A
}
json_close_array() {
_json_close_table
}
json_add_string() {
local cur
_json_get_var cur JSON_CUR
_json_add_generic string "$1" "$2" "$cur"
}
json_add_int() {
local cur
_json_get_var cur JSON_CUR
_json_add_generic int "$1" "$2" "$cur"
}
json_add_boolean() {
local cur
_json_get_var cur JSON_CUR
_json_add_generic boolean "$1" "$2" "$cur"
}
json_add_double() {
local cur
_json_get_var cur JSON_CUR
_json_add_generic double "$1" "$2" "$cur"
}
# functions read access to json variables
json_load() {
eval "`jshn -r "$1"`"
}
json_dump() {
jshn "$@" ${JSON_PREFIX:+-p "$JSON_PREFIX"} -w
}
json_get_type() {
local __dest="$1"
local __cur
_json_get_var __cur JSON_CUR
local __var="${JSON_PREFIX}T_${__cur}_${2//[^a-zA-Z0-9_]/_}"
eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
}
json_get_keys() {
local __dest="$1"
local _tbl_cur
if [ -n "$2" ]; then
json_get_var _tbl_cur "$2"
else
_json_get_var _tbl_cur JSON_CUR
fi
local __var="${JSON_PREFIX}K_${_tbl_cur}"
eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
}
json_get_values() {
local _v_dest="$1"
local _v_keys _v_val _select=
local _json_no_warning=1
unset "$_v_dest"
[ -n "$2" ] && {
json_select "$2" || return 1
_select=1
}
json_get_keys _v_keys
set -- $_v_keys
while [ "$#" -gt 0 ]; do
json_get_var _v_val "$1"
__jshn_raw_append "$_v_dest" "$_v_val"
shift
done
[ -n "$_select" ] && json_select ..
return 0
}
json_get_var() {
local __dest="$1"
local __cur
_json_get_var __cur JSON_CUR
local __var="${JSON_PREFIX}${__cur}_${2//[^a-zA-Z0-9_]/_}"
eval "export -- \"$__dest=\${$__var:-$3}\"; [ -n \"\${$__var+x}\${3+x}\" ]"
}
json_get_vars() {
while [ "$#" -gt 0 ]; do
local _var="$1"; shift
if [ "$_var" != "${_var#*:}" ]; then
json_get_var "${_var%%:*}" "${_var%%:*}" "${_var#*:}"
else
json_get_var "$_var" "$_var"
fi
done
}
json_select() {
local target="$1"
local type
local cur
[ -z "$1" ] && {
_json_set_var JSON_CUR "J_V"
return 0
}
[[ "$1" == ".." ]] && {
_json_get_var cur JSON_CUR
_json_get_var cur "U_$cur"
_json_set_var JSON_CUR "$cur"
return 0
}
json_get_type type "$target"
case "$type" in
object|array)
json_get_var cur "$target"
_json_set_var JSON_CUR "$cur"
;;
*)
[ -n "$_json_no_warning" ] || \
echo "WARNING: Variable '$target' does not exist or is not an array/object"
return 1
;;
esac
}
json_is_a() {
local type
json_get_type type "$1"
[ "$type" = "$2" ]
}

View File

@@ -1,4 +1,11 @@
. /etc/zaf.conf
. ${ZAF_LIB_DIR}/jshn.sh
ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}-$$"
trap "rm -rif ${ZAF_TMP_DIR}" EXIT
! [ -d "${ZAF_TMP_DIR}" ] && mkdir "${ZAF_TMP_DIR}"
# Fetch url to stdout
# $1 url
# It supports real file, file:// and other schemes known by curl
@@ -48,14 +55,11 @@ zaf_check_agent_config() {
# Update repo
zaf_update_repo() {
[ "$ZAF_GIT" != 1 ] && { echo "Git is not installed."; return 1; }
! [ -d ${ZAF_REPO_DIR} ] && git clone "${ZAF_PLUGINS_REPO}" "${ZAF_REPO_DIR}"
[ -n "${ZAF_PLUGINS_REPO}" ] && cd ${ZAF_REPO_DIR} && git pull
}
# List installed plugins
zaf_list_installed_plugins() {
cd ${ZAF_PLUGINS_DIR}; ls --hide '.'
}
# Check plugin url
# $1 plugin uri
# $2 local file to fetch
@@ -69,7 +73,20 @@ zaf_plugin_fetch_control() {
# $1 control file
# $2 option
zaf_ctrl_get_option() {
grep -E '^(.*): ' "$1" | grep -F "$2:" | cut -d ' ' -f 2-
awk 'BEGIN { FS=": "; }; /^'$2': / { printf $2$3$4$5"\n"; }' <$1
}
# Get description from control file
# $1 control file
# $2 option
zaf_ctrl_get_description() {
awk \
"/^$2/"' { i=1;
while (1) {
getline; if (substr($0,0,1) != " ") exit;
printf $0"\n";
}
}' <$1
}
zaf_ctrl_binary_deps() {
@@ -100,8 +117,11 @@ zaf_ctrl_install_bin() {
zaf_ctrl_generate_cfg() {
local items
local cmd
local ilock
items=$(zaf_ctrl_get_option "$1" Item)
for i in $items; do
ilock=$(echo $i | tr -d '[]*&;:')
cmd=$(zaf_ctrl_get_option "$1" "Item-cmd-$i")
echo "UserParameter=$2.${i},$cmd"
done
@@ -120,45 +140,118 @@ zaf_install_plugin() {
else
url="$1"
fi
plugin=$(basename "$url")
echo Installing plugin $plugin from $url...
plugin="plug$$"
rm -rf ${ZAF_TMP_DIR}/${plugin}
control=${ZAF_TMP_DIR}/${plugin}/control
plugindir="${ZAF_PLUGINS_DIR}/${plugin}"
mkdir -p "${ZAF_TMP_DIR}/${plugin}"
if zaf_plugin_fetch_control "$url" "${control}"; then
set -e
zaf_ctrl_binary_deps "${control}"
mkdir -p $plugindir
zaf_ctrl_install_bin "${control}" "${plugin}"
zaf_ctrl_generate_cfg "${control}" "${plugin}" | zaf_far '{PLUGINDIR}' "$plugindir" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf
zaf_restart_agent
cp $control "$plugindir"/
zaf_fetch_url $url/template.xml >"$plugindir"/template.xml
plugin=$(zaf_ctrl_get_option "${control}" Plugin)
if [ -n "$plugin" ]; then
echo Installing plugin $plugin from $url...
plugindir="${ZAF_PLUGINS_DIR}/${plugin}"
zaf_ctrl_binary_deps "${control}"
mkdir -p $plugindir
zaf_ctrl_install_bin "${control}" "${plugin}"
zaf_ctrl_generate_cfg "${control}" "${plugin}" | \
zaf_far '{PLUGINDIR}' "$plugindir" | \
zaf_far '{ZAFLIB}' ". ${ZAF_LIB_DIR}/zaf.lib.sh; " | \
zaf_far '{ZAFLOCK}' "${ZAF_LIB_DIR}/zaflock '$plugin' " \
>${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf
zaf_restart_agent
cp $control "$plugindir"/
zaf_fetch_url $url/template.xml >"$plugindir"/template.xml
else
echo "Bad control file!"
cat $control
exit 4
fi
else
echo "Cannot fetch control file!"
exit 4
fi
}
zaf_plugin_info() {
# Show installed plugins (human readable)
# $1 - plugin
zaf_show_installed_plugins() {
local cfile
local plugin
cd ${ZAF_PLUGINS_DIR}; ls --hide '.' -1 | while read plugin; do
cfile=${ZAF_PLUGINS_DIR}/$plugin/control
echo Plugin $plugin:
zaf_ctrl_get_description $cfile Plugin:
echo "Homepage:" $(zaf_ctrl_get_option $cfile Web)
echo "Maintainer:" $(zaf_ctrl_get_option $cfile Maintainer)
echo
done
}
# List installed plugins
# $1 - plugin
zaf_list_plugins() {
local cfile
local plugin
cd ${ZAF_PLUGINS_DIR}; ls --hide '.' -1
}
zaf_show_plugin() {
local items
local plugindir
local cfile
local tst
if [ -z "$1" ]; then
echo "Missing plugin name";
exit 1
fi
[ -n "$2" ] && tst=1
plugindir="${ZAF_PLUGINS_DIR}/$1"
if [ -d "$plugindir" ]; then
items=$(zaf_ctrl_get_option "$plugindir/control" Item)
echo "Items supported:"
echo "$items"
cfile="$plugindir/control"
if [ -d "$plugindir" ] ; then
echo "Plugin $1:"
zaf_ctrl_get_description "$cfile" "Plugin:"
echo "Homepage:" $(zaf_ctrl_get_option $cfile Web)
echo "Maintainer:" $(zaf_ctrl_get_option $cfile Maintainer)
items=$(zaf_list_plugin_items $1)
echo
echo "Supported items:"
for i in $items; do
echo -n "$1.$i: "
[ -n "$tst" ] && ${ZAF_AGENT_BIN} -t "$1.$i"
echo
zaf_ctrl_get_description "$cfile" "Item: $i";
echo
done
else
echo "Plugin $1 not installed"
fi
}
zaf_list_plugin_items() {
if [ -z "$1" ]; then
echo "Missing plugin name";
exit 1
fi
plugindir="${ZAF_PLUGINS_DIR}/$1"
cfile="$plugindir/control"
if [ -d "$plugindir" ] ; then
zaf_ctrl_get_option "$cfile" Item
else
echo "Plugin $1 not installed"
fi
}
zaf_list_items() {
for p in $(zaf_list_plugins); do
zaf_list_plugin_items $p
done
}
zaf_remove_plugin() {
! [ -d ${ZAF_PLUGINS_DIR}/$1 ] && { echo "Plugin $1 not installed!"; exit 2; }
rm -rf ${ZAF_PLUGINS_DIR}/$1
rm -f ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf
}

37
lib/zaflock Normal file
View File

@@ -0,0 +1,37 @@
#!/bin/sh
. /etc/zaf.conf
. ${ZAF_LIB_DIR}/zaf.lib.sh
help() {
echo "$0 key cmd"
exit 2
}
lkey="$1"
[ -z "$lkey" ] && help
shift
[ -z "${ZAF_LOCK_SECONDS}" ] && seconds=5
[ -z "${ZAF_LOCK_FORCE}" ] && force=1
lockfile="${ZAF_TMP_DIR}/zaflock_${lkey}"
i=0
while [ -f "$lockfile" ] && [ $i -lt $seconds ]; do
sleep 1
i=$(expr $i + 1)
done
if [ -f "$lockfile" ] && [ -n "$force" ]; then
logger -s -t "zlock" -p daemon.warn "Releasing $lockfile!"
rm -f "$lockfile"
fi
if [ -f "$lockfile" ] && [ -z "$force" ]; then
logger -s -t "zlock" -p daemon.err "Could not get lock for $lockfile!"
exit 1
fi
touch "$lockfile"
[ -n "$*" ] && $@
rm -f "$lockfile"