#!/bin/bash # # webbuild functions # Copyright (c) 2012 by Silvan Calarco # . /etc/autodist/config SUDO_WRAPPER="sudo /usr/libexec/webbuild-sudo" #STATEDIR=$WEBBUILD_STATEDIR LOG=$WEBBUILD_STATEDIR/access_log DEFAULT_ENVIRONMENT=0 [ "`uname -m`" = "x86_64" ] && HOST_IS_X86_64=1 function set_user_state_var() { local statevar=$1 local statevalue=$2 local stateuser=$3 [ ! "$stateuser" ] && stateuser=$USER [ "$1" ] || return [ -e $WEBBUILD_STATEDIR/users/$stateuser.state ] || touch $WEBBUILD_STATEDIR/users/$stateuser.state sed -i "/^$statevar=/d" $WEBBUILD_STATEDIR/users/$stateuser.state [ "$statevalue" ] && echo "$statevar=$statevalue" >> $WEBBUILD_STATEDIR/users/$stateuser.state } function social_log() { local line=$1 [ "$line" ] || return if [ ! "$STATE_FAKEUSER" ]; then STATE_SOCIALLOG_ID=0 . $WEBBUILD_STATEDIR/users/webbuild.state STATE_SOCIALLOG_ID=$(($STATE_SOCIALLOG_ID + 1)) set_user_state_var STATE_SOCIALLOG_ID $STATE_SOCIALLOG_ID webbuild echo "SID=$STATE_SOCIALLOG_ID SPRIVACY=$STATE_PRIVACYMODE $line" >> $WEBBUILD_STATEDIR/social_log fi } function cgi_encodevar() { local string="${1}" local strlen=${#string} local encoded="" for (( pos=0 ; pos and flipflip industries # (internal) routine to store POST data function cgi_get_POST_vars() { # check content type # FIXME: not sure if we could handle uploads with this.. [ "${CONTENT_TYPE}" != "application/x-www-form-urlencoded" ] && \ echo "Warning: you should probably use MIME type "\ "application/x-www-form-urlencoded!" 1>&2 # save POST variables (only first time this is called) [ -z "$QUERY_STRING_POST" \ -a "$REQUEST_METHOD" = "POST" -a ! -z "$CONTENT_LENGTH" ] && read -n $CONTENT_LENGTH QUERY_STRING_POST return } # (internal) routine to decode urlencoded strings function cgi_decodevar() { [ $# -ne 1 ] && return local v t h # replace all + with whitespace and append %% t="${1//+/ }%%" while [ ${#t} -gt 0 -a "${t}" != "%" ]; do v="${v}${t%%\%*}" # digest up to the first % t="${t#*%}" # remove digested part # decode if there is anything to decode and if not at end of string if [ ${#t} -gt 0 -a "${t}" != "%" ]; then h=${t:0:2} # save first two chars t="${t:2}" # remove these if [ "${h}" = "22" ]; then v="${v}\\\"" elif [ "${h}" = "0A" ]; then v="${v}\\\n" elif [ "${h}" = "24" ]; then v="${v}\\\$" elif [ "${h}" = "60" ]; then v="${v}\\\`" else v="${v}"`echo -e \\\\x${h}` # convert hex to special char fi fi done # return decoded string echo "${v}" return } # routine to get variables from http requests # usage: cgi_getvars method varname1 [.. varnameN] # method is either GET or POST or BOTH # the magic varible name ALL gets everything function cgi_getvars() { [ $# -lt 2 ] && return local q p k v s # get query case $1 in GET) [ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&" ;; POST) cgi_get_POST_vars [ ! -z "${QUERY_STRING_POST}" ] && q="${QUERY_STRING_POST}&" ;; BOTH) [ ! -z "${QUERY_STRING}" ] && q="${QUERY_STRING}&" cgi_get_POST_vars [ ! -z "${QUERY_STRING_POST}" ] && q="${q}${QUERY_STRING_POST}&" ;; esac shift s=" $* " # parse the query data while [ ! -z "$q" ]; do p=`echo $q | sed "s|&.*||"` q=`echo $q | sed "s|[^&]*&||"` k="${p%%=*}" # get the key (variable name) from it [ "$k" = "REMOTE_ADDR" -o "$k" = "REMOTE_HOST" -o "$k" = "REMOTE_PORT" -o "$k" = "REMOTE_USER" ] && continue v="${p#*=}" # get the value from it # decode and evaluate var if requested if [ "$k" != "SPECTEXT" ]; then v=`cgi_decodevar "$v"` fi eval "$k=\"$v\"" done return } function kill_tree() { local killpid=$1 [ $1 ] || return kill `pstree -p $killpid | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" " "` return $? } function parse_search_output() { local SEARCHARCH=$1 echo -n "" while read line; do [ "$line" ] || continue set -- $line local REPOSITORY=${1/(*} local ARCH=`echo $1 | sed "s|.*(\(.*\)):|\1|"` local PKG=`echo $2 | sed "s|\(.*\)-[^-]*-[^-]*|\1|"` if [ "$ARCH" = "source" ]; then echo -n "" elif [ "$ARCH" = "$SEARCHARCH" ]; then echo -n "" else echo -n "" fi echo -n "$REPOSITORY($ARCH): " echo -n "$2
" echo -n "
" # if [ "$ARCH" ] # $SUDO_WRAPPER 0 local "$USER" "" "openmamba-repository search -i $REPSEARCHTEXT" | \ # sed "s|\(.*(source).*\)|\1|; # s|\(.*(${AUTOPORT_ARCH[$ENVIRONMENT]}).*\)|\1|" done echo -n "
" } function parse_patch_output() { local PATCH_STARTED SAVE_IFS=$IFS IFS='' echo -n "" while read line; do [ "${line:0:3}" = "+++" ] && echo -n "" echo "$line" | sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g; s|^\(+++.*\)|\1|; s|^\(---.*\)|\1|; s|^\(-.*\)|\1|; s|^\(+.*\)|\1|; s|^ |\ |;" done IFS=$SAVE_IFS } function parse_build_output() { sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g; s|<font|\1|; s|\(ftp[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|\1|; s|\(http[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|\1|; s|\(.*\)\(error[^0-9A-Za-z]*:[[:space:]]*.*\)|\1\2|i; s|^\(== =.*\)|\1|; s|^[[:cntrl:]]*\([!%?=][!%!=>] .*\)|\1|; s|[[:cntrl:]]||g;" | google_search $1 } function parse_generic_output() { sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g; s|<font|\1|; s|\(ftp[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|\1|; s|\(http[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|\1|;" | google_search $1 } function google_search() { while read line; do local SEARCH_STRING=`echo "$line" | sed "s|.*%SRCURL%\(.*\)%SRCURLEND%.*|\1|"` if [ "$SEARCH_STRING" = "$line" ]; then echo "$line" else SEARCH_STRING=`echo $SEARCH_STRING | sed "s|\<|<|"` local SEARCH_STRING_ENCODED=`cgi_encodevar "$1 $SEARCH_STRING"` echo "$line" | sed "s|%SRCURL%.*%SRCURLEND%|href=\"http://www.google.com/search?q=$SEARCH_STRING_ENCODED\" target=_new title=\"Search this error on the Web\"|g" fi done } function print_environment_descr() { local i=$1 if [ "${AUTOPORT_CHROOT[$i]}" ]; then echo -n "${AUTOPORT_CHROOT[$i]} - " elif [ "${AUTOPORT_CHROOT_USER[$i]}" ]; then echo -n "${AUTOPORT_CHROOT_USER[$i]} - " else echo -n "autodist - " fi if [ "${AUTOPORT_UPDATE[$i]}" ]; then echo -n "update" elif [ "${AUTOPORT_CHROOT[$i]}" ]; then echo -n "chroot" elif [ "${AUTOPORT_NATIVE[$i]}" ]; then echo -n "native" elif [ "${AUTOPORT_CROSS[$i]}" ]; then echo -n "cross" else echo -n "unknown type" fi echo -n " for ${AUTOPORT_ARCH[$i]}" # (${AUTOPORT_BASE_REPOSITORY[$i]} based)" } function environment_autoport_logdir() { local env=$1 if [ "${AUTOPORT_CHROOT[$env]}" ]; then if [ "${AUTOPORT_CHROOT_USER[$env]}" != "autodist" ]; then echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/home/${AUTOPORT_CHROOT_USER[$env]}/.autoport/" else echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/var/autodist/.autoport/" fi elif [ "${AUTOPORT_NATIVE[$env]}" ]; then local envhome=`eval echo ~${AUTOPORT_CHROOT_USER[$env]}` echo "$envhome/.autoport" fi } function environment_logdir() { local env=$1 if [ "${AUTOPORT_CHROOT[$env]}" ]; then if [ "${AUTOPORT_CHROOT_USER[$env]}" != "autodist" ]; then echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/home/${AUTOPORT_CHROOT_USER[$env]}/.autodist/log/" else echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/var/autodist/log/" fi elif [ "${AUTOPORT_NATIVE[$env]}" ]; then local envhome=`eval echo ~${AUTOPORT_CHROOT_USER[$env]}` if [ "${AUTOPORT_CHROOT_USER[$env]}" = "autodist" ]; then echo "/var/autodist/log/" else echo "$envhome/.autodist/log/" fi else echo "/var/autodist/log/" fi }