178 lines
5.4 KiB
Bash
178 lines
5.4 KiB
Bash
#!/bin/bash
|
|
#
|
|
# webbuild functions
|
|
# Copyright (c) 2012 by Silvan Calarco <silvan.calarco@mambasoft.it>
|
|
#
|
|
. /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=`expr $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<strlen ; pos++ )); do
|
|
c=${string:$pos:1}
|
|
case "$c" in
|
|
[-_.~a-zA-Z0-9] ) o="${c}" ;;
|
|
* ) printf -v o '%%%02x' "'$c"
|
|
esac
|
|
encoded+="${o}"
|
|
done
|
|
echo -n "${encoded}" # You can either set a return variable (FASTER)
|
|
# REPLY="${encoded}" #+or echo the result (EASIER)... or both... :p
|
|
}
|
|
|
|
#This code for getting code from post data is from http://oinkzwurgl.org/bash_cgi and
|
|
#was written by Phillippe Kehi <phkehi@gmx.net> 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
|
|
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_build_output() {
|
|
sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g;
|
|
s|^\([\+#] .*\)|<font style=\"color:cyan\">\1</font>|;
|
|
s|\(.*error[[:space:]]*:[[:space:]]*\)\(.*\)|<font style=\"background-color:red;color:white\">\1<a %SRCURL%\2%SRCURLEND%>\2</a></font>|i;
|
|
s|^\(== =.*\)|<font style=\"background-color:green;color:white\">\1</font>|;
|
|
s|^[[:cntrl:]]*\([!%?=][!%!=>] .*\)|<font style=\"color:gold\">\1</font>|;" | 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\"|"
|
|
fi
|
|
done
|
|
}
|