diff --git a/functions.sh b/functions.sh index e10750b..69a60bb 100755 --- a/functions.sh +++ b/functions.sh @@ -1,12 +1,88 @@ +####################################### +# Print error message +# +# Arguments: +# Error message +####################################### miria_error() { - echo "error: $1" 1>&2 + echo "[miria-cli] error: $1" 1>&2 } +####################################### +# Get Mira API URL +# +# Arguments: +# None +####################################### miria_get_url() { if [ -e ~/.miria-url ]; then miria_url="$(cat ~/.miria-url)" else - echo 'error: file ~/.miria-url not found' 1>&2 + miria_error 'file ~/.miria-url not found' exit 1 fi -} \ No newline at end of file +} + +####################################### +# Execute Mira API command +# +# Arguments: +# API command, +# command argument 1 (key=value), +# ... +# command argument n (key=value) +# Outputs: +# miria_last_xml : last XML answer +# miria_last_status : last return code +# miria_last_error : last error message +####################################### +miria_api_cmd() { + local url_args=() + local cmd="$1" + + miria_get_url + shift + for a in "$@"; do + url_args+=('--data-urlencode') + url_args+=("${a}") + done + miria_last_xml="$(curl -sG "${url_args[@]}" "${miria_url}/${cmd}")" + miria_last_status="$(miria_xml_get_attribute "${miria_last_xml}" '//ReturnCode' 'ADARetCode')" + miria_last_error="$(miria_xml_get_string "${miria_last_xml}" '//ErrorMsg')" + if [[ "${miria_last_status}" != "1" ]]; then + miria_error "Miria API call returned status ${miria_last_status}" + miria_error "${miria_last_error}" + exit 1 + fi +} + +####################################### +# Get XML string(s) +# +# Arguments: +# XML data (in string form), +# XPath of string +####################################### +miria_xml_get_string() { + local xml="$1" + local xpath="$2" + + echo "${xml}" | xmllint --xpath "string(${xpath})" - +} + +####################################### +# Get XML attribute value(s) +# +# Arguments: +# XML data (in string form), +# XPath of attribute (without @attribute) +# Attribute name +####################################### +miria_xml_get_attribute() { + local xml="$1" + local xpath="$2" + local attr="$3" + + echo "${xml}" | xmllint --xpath "${xpath}/@${attr}" - \ + | sed -E "s/ *${attr}=\"(.+)\"/\1/g" +} diff --git a/miria-find b/miria-find index 4d19862..fae5175 100755 --- a/miria-find +++ b/miria-find @@ -37,19 +37,16 @@ if [[ -z "${pattern}" ]]; then print_usage exit 1 fi -tmp_xml="$(mktemp)" base="$(basename "${pattern}")" dir="$(dirname "${pattern}")" if [[ "${dir}" == "." ]]; then dir='' fi -curl -s "${miria_url}/fileSearch?filename=${base}&path=${project}@/${dir}" > ${tmp_xml} +miria_api_cmd fileSearch "filename=${base}" "path=${project}@/${dir}" if [[ "${xml}" == "true" ]]; then - cat ${tmp_xml} + echo "${miria_last_xml}" else - xmllint --xpath '//file/@name' ${tmp_xml} \ - | sed -E 's/ *name="(.+)"/\1/g' \ - | sed -E "s/archive@${project}://g" \ - | sed -E 's/\/\//\//g' + miria_xml_get_attribute "${miria_last_xml}" '//file' 'name' \ + | sed -E "s/archive@${project}://g" \ + | sed -E 's/\/\//\//g' fi -rm -f ${tmp_xml}