#!/bin/bash # Copyright (c) 2012-2013 Kaarle Ritvanen # See LICENSE file for license details function parse_var { echo "$2" | sed "s/^$1: \\(.\\+\\)"$'\r'"\$/\\1/;ta;d;:a;q" } function _acf_req { local url=$ACF_URL$1 shift local resp resp=$(curl -s -w $'\n\nStatus: %{response_code}\r\n' \ ${ACF_AUTH_TOKEN:+-H "X-ACF-Auth-Token: $ACF_AUTH_TOKEN"} \ ${ACF_TXN_ID:+-H "X-ACF-Transaction-ID: $ACF_TXN_ID"} \ "$@" $url) local code=$? if [ $code -gt 0 ]; then echo "Request failed, code $code" >&2 return 1 fi echo "$resp" local status=$(parse_var Status "$resp") [ "${status:0:1}" = 2 ] && return echo "Request failed" >&2 return 1 } function _acf_start_req { local url=$1 local hdr=X-ACF-$2 local var=ACF_$3 shift 3 local current=${!var} eval $var= local status= local resp resp=$(_acf_req "$url" "$@" -D /proc/self/fd/1 -o /proc/self/fd/3) [ $? -eq 0 ] || return local id=$(parse_var $hdr "$resp") eval export $var=$id bash --rcfile "$ACF_QD_CLI" && _acf_req $url -X DELETE eval $var=$current } if [ "$ACF_AUTH_TOKEN" ]; then if [ "$ACF_TXN_ID" ]; then cat >&2 <&2 < Create/update object: put Add member to list/set or perform action: post Delete object: delete Fetch metadata: meta Start transaction: start Example: put /awall/zone/internet '{"iface": ["eth0"]}' EOF fi PS1="$ACF_USER@acf2-dev-shell${ACF_TXN_ID:+($ACF_TXN_ID)}> " function start { _acf_start_req / Transaction-ID TXN_ID -X POST } function meta { _acf_req "/meta$1" } function _acf_obj_req { local path=/config$1 shift _acf_req "$path" "$@" } function _acf_post_req { _acf_obj_req "$2" -d "$3" -X $1 } function get { _acf_obj_req "$1" } function put { _acf_post_req PUT "$@" } function post { _acf_post_req POST "$@" } function delete { _acf_obj_req "$1" -X DELETE } function commit { if [ "$ACF_TXN_ID" ]; then if _acf_req / -X PUT; then echo Committed >&2 exit 1 fi else echo "No transaction started" >&2 fi return 1 } else cat >&2 <&1 export ACF_QD_CLI=$0 export ACF_URL=http://localhost export ACF_USER=`whoami` PASSWORD= function usage { echo "Usage: $0 [-H ] [-u ] [-p ]" >&2 exit $1 } ARGS=$(getopt -o hH:p:u: -- "$@") [ $? -gt 0 ] && usage 1 eval set -- $ARGS while :; do case $1 in -h) usage 0 ;; -H) shift ACF_URL=$1 ;; -p) shift PASSWORD=$1 ;; -u) shift ACF_USER=$1 ;; --) break esac shift done if [ -z "$PASSWORD" ]; then echo -n "Password: " >&2 read PASSWORD echo >&2 fi ACF_TXN_ID= _acf_start_req /login Auth-Token AUTH_TOKEN \ -d "{\"username\": \"$ACF_USER\", \"password\": \"$PASSWORD\"}" fi