From 7e0e141273032c7afc1a9129512aa42c672fcf5d Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 23 Aug 2018 17:36:06 +0300 Subject: Always serialize reference submit result manifest value if available and restructure handlers dir --- brep/handler/handler.bash.in | 151 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 brep/handler/handler.bash.in (limited to 'brep/handler/handler.bash.in') diff --git a/brep/handler/handler.bash.in b/brep/handler/handler.bash.in new file mode 100644 index 0000000..89e7e21 --- /dev/null +++ b/brep/handler/handler.bash.in @@ -0,0 +1,151 @@ +# file : brep/handler/handler.bash.in +# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +# Utility functions useful for implementing request handlers. + +if [ "$brep_handler" ]; then + return 0 +else + brep_handler=true +fi + +@import libbutl/manifest-parser@ +@import libbutl/manifest-serializer@ + +# Diagnostics. +# +# We expect the user to set the verbose variable either to true or empty +# (false). +# +if [ ! -v verbose ]; then + echo "error: variable 'verbose' is not set" >&2 + exit 1 +fi + +# Normally the brep module's log record looks like this: +# +# [Mon Jul 23 17:48:46.945079 2018] [brep:error] [pid 123:tid 456] [brep::submit::init]: error description +# +# We will use the (almost) same format for our diagnostics (redirected to the +# Apache's error_log), so it can easily be attributed to the brep module. +# +info_self="$(basename $0)" + +if [ "$#" -gt 0 ]; then + # Last argument is the request data directory which leaf component normally + # identifies the posted entity. A handler may overwrite this value if that's + # not the case. + # + info_ref="$(basename "${!#/}")" +fi + +function info () # +{ + local severity="$1" + shift + + # Note: %N is Linux-specific. + # + local ts + if ! ts="$(date +"%a %b %d %H:%M:%S.%6N %Y")"; then + ts= + fi + + echo "[$ts] [brep:$severity] [ref $info_ref] [$info_self]: $*" 1>&2; +} + +function error () { info "error" "$*"; exit 1; } + +function trace () { if [ "$verbose" ]; then info "info" "$*"; fi } + +# Trace a command line, quoting empty arguments as well as those that contain +# spaces. +# +function trace_cmd () # ... +{ + if [ "$verbose" ]; then + local s="+" + while [ $# -gt 0 ]; do + if [ -z "$1" -o -z "${1##* *}" ]; then + s="$s '$1'" + else + s="$s $1" + fi + + shift + done + + info "info" "$s" + fi +} + +# Trace the current function name and arguments. +# +function trace_func () # ... +{ + trace_cmd "${FUNCNAME[1]}" "$@" +} + +# Trace and run a command. +# +function run () # ... +{ + trace_cmd "$@" + "$@" +} + +# Same as above but also redirect the command stderr to /dev/null, unless +# running in the verbose mode. +# +# Note that we don't redirect stdout, so it can still be captured. +# +function run_silent () # ... +{ + trace_cmd "$@" + + if [ "$verbose" ]; then + "$@" + else + "$@" 2>/dev/null + fi +} + +# Wrap libbutl manifest parsing/serializing functions to shorten names and to +# add tracing. +# +function manifest_parser_start () # [] +{ + trace_func "$@" + butl_manifest_parser_start "$@" + + manifest_parser_ofd="$butl_manifest_parser_ofd" +} + +function manifest_parser_finish () +{ + trace_func + butl_manifest_parser_finish +} + +function manifest_serializer_start () # [] +{ + trace_func "$@" + butl_manifest_serializer_start "$@" + + manifest_serializer_ifd="$butl_manifest_serializer_ifd" +} + +function manifest_serializer_finish () +{ + trace_func + butl_manifest_serializer_finish +} + +# Serialize one manifest name/value pair. +# +function manifest_serialize () # +{ +# trace "$1: $2" + printf "%s:%s\0" "$1" "$2" >&"$manifest_serializer_ifd" +} -- cgit v1.1