299 lines
9.8 KiB
Bash
299 lines
9.8 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_search_output() {
|
|
local SEARCHARCH=$1
|
|
echo -n "<style type=\"text/css\">\
|
|
.searchlink a:link { text-decoration:none; color:inherit; }\
|
|
.searchlink a:hover { text-decoration:underline; }\
|
|
.searchlink a:visited { text-decoration:underline; color:inherit; }\
|
|
</style><span class=searchlink>"
|
|
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 "<font color=lightgreen>"
|
|
elif [ "$ARCH" = "$SEARCHARCH" ]; then
|
|
echo -n "<font color=white>"
|
|
else
|
|
echo -n "<font color=gray>"
|
|
fi
|
|
echo -n "<a class=searchlink href=\"/distribution/distromatic.html?tag=$REPOSITORY\" target=_new>$REPOSITORY</a>($ARCH): "
|
|
echo -n "<a class=searchlink href=\"/distribution/distromatic.html?tag=$REPOSITORY&pkg=$PKG.$ARCH\" target=_new>$2</a><br>"
|
|
echo -n "</font>"
|
|
# if [ "$ARCH" ]
|
|
# $SUDO_WRAPPER 0 local "$USER" "" "openmamba-repository search -i $REPSEARCHTEXT" | \
|
|
# sed "s|\(.*(source).*\)|<font color=white><b>\1</b></font>|;
|
|
# s|\(.*(${AUTOPORT_ARCH[$ENVIRONMENT]}).*\)|<font color=lightgreen>\1</font>|"
|
|
done
|
|
echo -n "</span>"
|
|
}
|
|
|
|
function parse_patch_output() {
|
|
local PATCH_STARTED SAVE_IFS=$IFS
|
|
|
|
IFS=''
|
|
echo -n "<font color=gray>"
|
|
while read line; do
|
|
[ "${line:0:3}" = "+++" ] && echo -n "</font>"
|
|
echo "$line" | sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g;
|
|
s|^\(+++.*\)|<font color=white style=\"background-color:gray\"><b>\1</b></font>|;
|
|
s|^\(---.*\)|<font color=white style=\"background-color:gray\"><b>\1</b></font>|;
|
|
s|^\(-.*\)|<font color=red>\1</font>|;
|
|
s|^\(+.*\)|<font color=lightgreen>\1</font>|;
|
|
s|^ |\ |;"
|
|
done
|
|
IFS=$SAVE_IFS
|
|
}
|
|
|
|
function parse_build_output() {
|
|
sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g;
|
|
s|<font|<font|g;
|
|
s|</font|</font|g;
|
|
s|^\([\+#] .*\)|<font style=\"color:cyan\">\1</font>|;
|
|
s|\(ftp[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|<a href=\1 target=new>\1</a>|;
|
|
s|\(http[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|<a href=\1 target=new>\1</a>|;
|
|
s|\(.*\)\(error[^0-9A-Za-z]*:[[: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>|;
|
|
s|[[:cntrl:]]||g;" | google_search $1
|
|
}
|
|
|
|
function parse_generic_output() {
|
|
sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g;
|
|
s|<font|<font|g;
|
|
s|</font|</font|g;
|
|
s|^\([\+#] .*\)|<font style=\"color:cyan\">\1</font>|;
|
|
s|\(ftp[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|<a href=\1 target=new>\1</a>|;
|
|
s|\(http[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|<a href=\1 target=new>\1</a>|;" | 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_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
|
|
# FIXME: be able to detect real home without using chroot
|
|
if [ "${AUTOPORT_CHROOT_USER[$env]}" = "autodist" ]; then
|
|
echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/var/autodist/.autoport/"
|
|
else
|
|
echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/home/${AUTOPORT_CHROOT_USER[$env]}/.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
|
|
# FIXME: be able to detect real home without using chroot
|
|
if [ "${AUTOPORT_CHROOT_USER[$env]}" = "autodist" ]; then
|
|
echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/var/autodist/log/"
|
|
else
|
|
echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/home/${AUTOPORT_CHROOT_USER[$env]}/.autodist/log/"
|
|
fi
|
|
elif [ "${AUTOPORT_NATIVE[$env]}" ]; then
|
|
local envhome=`eval echo ~${AUTOPORT_CHROOT_USER[$env]}`
|
|
if [ "${AUTOPORT_CHROOT_USER[$env]}" = "autodist" ]; then
|
|
echo "$envhome/log"
|
|
else
|
|
echo "$envhome/.autodist/log/"
|
|
fi
|
|
else
|
|
echo "/var/autodist/log/"
|
|
fi
|
|
}
|