#!/bin/bash # # webbuild functions # Copyright (c) 2012-2024 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 create_webbuild_db() { sqlite3 $WEBBUILD_STATEDIR/webbuild.db \ "CREATE TABLE social_log(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, privacy BOOLEAN, user CHAR(40), type CHAR(40), target CHAR(40), email CHAR(80), text TEXT, time datetime default current_timestamp);" } function social_log() { local line=$1 local SPRIVACY=0 [ "$line" ] || return if [ ! "$STATE_FAKEUSER" ]; then [ -e $WEBBUILD_STATEDIR/webbuild.db ] || \ creaqte_webbuild_db eval "$line" [ "$STATE_PRIVACYMODE" ] && $SPRIVACY=1 sqlite3 $WEBBUILD_STATEDIR/webbuild.db \ "INSERT into social_log (privacy, user, type, target, email, text) \ values ($SPRIVACY,'$SUSER','$STYPE','$STARGET','$SEMAIL','$STEXT');" # Note: checking that URL does not point here again to avoid recursive requests if [ "$WEBBUILD_URL" -a "${WEBBUILD_URL/\/localhost\//}" = "$WEBBUILD_URL" ]; then eval $line USER_SECRET_FIXED=`echo $USER_SECRET | sed "s|\$|\\$|"` curl -s "$WEBBUILD_URL?REQUEST=message&USER=$USER&SECRET=`cgi_encodevar \"$USER_SECRET\"`&USER_EMAIL=$USER_EMAIL&\ TARGET=$STARGET&MESSAGE=`cgi_encodevar \"$STEXT\"`" >/dev/null fi fi } function cgi_encodevar() { local string="${1}" local strlen=${#string} local encoded="" for (( pos=0 ; pos $WEBBUILD_STATEDIR/uploads/$content_filename } #This code for getting code from post data is from http://oinkzwurgl.org/bash_cgi and #was written by Phillippe Kehi and flipflip industries # (internal) routine to store POST data function cgi_get_POST_vars() { # check content type # Handle uploads if [ "${CONTENT_TYPE:0:19}" = "multipart/form-data" ]; then cgi_get_POST_upload "${CONTENT_TYPE/*boundary=}" return fi #[ "${CONTENT_TYPE:0:33}" != "application/x-www-form-urlencoded" ] && \ # echo "Warning: you should probably use MIME type "\ # "application/x-www-form-urlencoded instead of ${CONTENT_TYPE}!" 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" -o "$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 var2html() { eval r=\$$1 r="${r//\&/&}" r="${r//\}" r="${r//\\/\}" r="${r//\"/"}" r="${r//\$/$}" r="${r//\`/`}" r="${r//\*/*}" echo "${r}" } function kill_tree() { local killpid=$1 [ $1 ] || return # tail here is used to avoid killing first pid, typically sh, which causes apache to stop since some time kill `pstree -pl $killpid | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tail -n+2 | 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" "" "autodist-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 "" sed "s|<|\<|g;s|[[:cntrl:]]\[[0-9;]*m||g; s|^\(+++.*\)|\1|; s|^\(---.*\)|\1|; s|^\(-.*\)|\1|; s|^\(+.*\)|\1|; s|^ |\ |;" | while read line; do [ "${line:0:3}" = "+++" ] && echo -n "" echo "$line" done IFS=$SAVE_IFS } function parse_build_output() { #s|\(.\{10000\}\).*|\1 [CUT - LONG LINE]|; sed "s|\r.*||; s/\x90\x8D.*//g; s|\\\|\\\\\\\|g;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;" | iconv -c | hint_search $1 } function parse_generic_output() { # s|\(.\{10000\}\).*|\1 [CUT - LONG LINE]|; sed "s|\r.*||; s|<|\<|g; s|[[:cntrl:]]\[[0-9;]*m||g; s|<font|\1|; s|\(ftp[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|\1|; s|\(http[s]*://[[:alnum:]+\,:&?/_.=~%#-]*\)|\1|;" | hint_search $1 } function hint_search() { while read line; do if [ "${line/\%SRCURL\%}" == "${line}" ]; then echo "$line" else local SEARCH_STRING=`echo "$line" | sed "s|.*%SRCURL%\(.*\)%SRCURLEND%.*|\1|;s|\<|<|"` local SEARCH_STRING_ENCODED=`cgi_encodevar "I get this error while building $1: $SEARCH_STRING"` #echo "$line" | sed "s|%SRCURL%.*%SRCURLEND%|href=\"https://duckduckgo.gom/?q=$SEARCH_STRING_ENCODED\" target=_new title=\"Search this error on the Web\"|g" echo "$line" | sed "s|%SRCURL%.*%SRCURLEND%|href=\"https://chatgpt.com/?q=$SEARCH_STRING_ENCODED\" target=_new title=\"Query ChatGPT on this error\"|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_rootdir() { local env=$1 if [ "${AUTOPORT_CHROOT[$env]}" ]; then echo "/var/autoport/${AUTOPORT_CHROOT[$env]}" else echo "" fi } 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 local chroot=$2 if [ "${AUTOPORT_CHROOT[$env]}" ]; then if [ "${AUTOPORT_CHROOT_USER[$env]}" != "autodist" ]; then if [ "$chroot" ]; then echo "/home/${AUTOPORT_CHROOT_USER[$env]}/.autodist/log/" else echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/home/${AUTOPORT_CHROOT_USER[$env]}/.autodist/log/" fi else if [ "$chroot" ]; then echo "/var/autodist/log/" else echo "/var/autoport/${AUTOPORT_CHROOT[$env]}/var/autodist/log/" fi 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 }