#
# webbuild functions-private include file
# Copyright (c) 2012-2014 by Silvan Calarco <silvan.calarco@mambasoft.it>
#

repository_list() {
   if [ "$WEBBUILD_REPOSITORIES" ]; then
      echo "${WEBBUILD_REPOSITORIES[*]}"
   else
      $SUDO_WRAPPER 0 local "$USER" "" "/usr/sbin/autodist-repository list"
   fi
}

function showlog() {
   local LOGDIR LOGFILES LOGFILE1 LOGFILE2 LOGFILE3 LOGFILE4

   if [ "$LOGTYPE" = "processoutput" -o "$LOGTYPE" = "processtail" ]; then
      LOGFILES=$LOGFILE
      LOGOUTPUTID=outputbottom
   else
      LOGOUTPUTID=outputbottom
      case $LOGTYPE in
         autoupdate) LOGFILE=update; ;;
         buildinstall|rebuild) LOGFILE=build ;;
         *) LOGFILE=$LOGTYPE ;;
      esac
      if [ "$LOGSTATUSOK" = "true" ]; then
         LOGFILE=$LOGFILE/ok
         LOGSTATUSAPPEND=" ok"
      else
         LOGFILE=$LOGFILE/failed
         LOGSTATUSAPPEND=" failed"
      fi
      LOGFILE1=$LOGFILE/${PACKAGE/\//_}.${AUTOPORT_ARCH[$ENVIRONMENT]}
      LOGFILE2=$LOGFILE/${PACKAGE/\//_}__*.${AUTOPORT_ARCH[$ENVIRONMENT]}
      LOGFILE3=$LOGFILE/*_${PACKAGE/\//_}__*.${AUTOPORT_ARCH[$ENVIRONMENT]}
      LOGFILE4=$LOGFILE/*_${PACKAGE/\//_}.${AUTOPORT_ARCH[$ENVIRONMENT]}

      LOGDIR=`environment_logdir $ENVIRONMENT 1`
      LOGFILES="$LOGDIR/$LOGFILE1 $LOGDIR/$LOGFILE2 $LOGDIR/$LOGFILE3 $LOGDIR/$LOGFILE4"
      # sort by most recent and take first
      LOGFILES=`$SUDO_WRAPPER 0 $ENVIRONMENT "$USER" "" "ls -t $LOGFILES 2>/dev/null | head -1"`
   fi
   echo -n "<output><![CDATA[<hr><b>Console output for $PACKAGE ($LOGTYPE$LOGSTATUSAPPEND):</b>"
   echo "<div align=left class=output id=$LOGOUTPUTID>"
   for f in $LOGFILES; do
      if [ -r $f ]; then
         LOGFILESIZE=`stat -c %s $f`
         LOGDATE=`stat -c %y $f`
      else
         LOGFILESIZE=`$SUDO_WRAPPER 0 $ENVIRONMENT "$USER" "" "stat -c %s $f"`
         LOGDATE=`$SUDO_WRAPPER 0 $ENVIRONMENT "$USER" "" "stat -c %y $f"`
         [ $? -eq 0 ] || continue
      fi
      echo -n "<b>`basename $f` ($LOGDATE; $LOGFILESIZE):</b>"
      echo -n "<pre>"
      if [ "$LOGTYPE" = "processtail" ]; then
         echo -n "<!-- SCROLL -->"
         tail -n +0 -f $f --pid $PROCESSPID | stdbuf -oL sed "s|<|\&lt;|g"
         echo -n "<!-- ENDSCROLL -->"
      else
         if [ $LOGFILESIZE -lt 524288 ]; then
            if [ -r $f ]; then
               cat $f | parse_build_output $PACKAGE
            else
               $SUDO_WRAPPER 0 $ENVIRONMENT "$USER" "" "cat $f" | parse_build_output $PACKAGE
            fi
         else
            if [ -r $f ]; then
               head -c 262144 $f | parse_build_output $PACKAGE
               echo "<br><font style=\"background-color:yellow;color:black\">&lt;------ CUT (long file) -------&gt;</font>"
               tail -c 262144 $f | parse_build_output $PACKAGE
            else
               $SUDO_WRAPPER 0 $ENVIRONMENT "$USER" "" "head -c 262144 $f" | parse_build_output $PACKAGE
               echo "<br><font style=\"background-color:yellow;color:black\">&lt;------ CUT (long file) -------&gt;</font>"
               $SUDO_WRAPPER 0 $ENVIRONMENT "$USER" "" "tail -c 262144 $f" | parse_build_output $PACKAGE
            fi
         fi
      fi
      echo -n "</pre>"
   done
   echo -n "</div>]]></output>"
}

function showEnvironmentPanel() {

   echo -n "Environment: <b>"
   if [ "${AUTOPORT_CHROOT_USER[$ENVIRONMENT]}" ]; then
      echo -n "${AUTOPORT_CHROOT_USER[$ENVIRONMENT]} - "
   else
      echo -n "autodist - "
   fi
   if [ "${AUTOPORT_UPDATE[$ENVIRONMENT]}" ]; then
      echo -n "update"
   elif [ "${AUTOPORT_CHROOT[$ENVIRONMENT]}" ]; then
      echo -n "chroot"
   elif [ "${AUTOPORT_NATIVE[$ENVIRONMENT]}" ]; then
      echo -n "native"
   elif [ "${AUTOPORT_CROSS[$ENVIRONMENT]}" ]; then
      echo -n "cross"
   else
      echo -n "unknown type"
   fi
   echo -n " (${AUTOPORT_ARCH[$ENVIRONMENT]})</b>"

   #echo "<br>Base repository: <b>${AUTOPORT_BASE_REPOSITORY[$ENVIRONMENT]}</b>"

   # toolchain
   echo -n "<br>"
   local toolchain_output=`LANGUAGE=C $SUDO_WRAPPER 0 $ENVIRONMENT "$USER" "" "gcc --version | head -n1; LANGUAGE=C ld -v"`
   local gcc_ver=`echo $toolchain_output | sed "s|.*(GCC) \([0-9.]*\) .*|\1|"`
   local binutils_ver=`echo $toolchain_output | sed "s|.*GNU \(.*\) (GNU Binutils.*)\(.*\)|\1 \2|"`
   echo "Toolchain: gcc $gcc_ver, $binutils_ver"

   # system upgrade
   echo -n "<br><input type=button id=smartupgrade value=\"system upgrade\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=smartupgrade\""
   echo -n ",\"`cgi_encodevar "Upgrade current environment to latest updates now?"`\"); class=redbutton>"

   ## run ldconfig
   #echo -n "<input type=button id=runldconfig value=\"run ldconfig\" onclick="
   #echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   #echo -n "REQUEST=runldconfig\");>"

   # rpm manager
   echo -n "<input type=button id=rpmmanager value=\"RPM manager\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=rpmmanager\");>"

   # environment search
   echo -n "<br><div style=\"white-space:nowrap;width:100%;\">Provides:<input type=text style=\"width:75%;align:center;padding:0;margin:2px;\" id=environmentsearch value=\"Search package or provide...\" "
   echo -n "onfocus=\"if (this.value==this.defaultValue) this.value=''\" "
   echo -n "onkeypress=if(checkEnter(event))ajax_getvalues(\""
   echo -n "ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=environmentsearch&ENVSEARCHTEXT=\"+encodeURIComponent(getElementById('environmentsearch').value));></div>"

}

function print_showlogcontrols() {
   echo -n "<showlogcontrols><![CDATA["
   # autodist logs
   echo -n "<hr><b>Show last autodist logs:</b> "
   echo -n "<input type=button value=\"prepare\" onclick=ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=showlog&LOGTYPE=prepare&LOGSTATUSOK=\"+document.all.logstatusOK.checked);>"
   echo -n "<input type=button value=\"update\" onclick=ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=showlog&LOGTYPE=update&LOGSTATUSOK=\"+document.all.logstatusOK.checked);>"
   echo -n "<input type=button class=boldbutton value=\"build\" onclick=ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=showlog&LOGTYPE=build&LOGSTATUSOK=\"+document.all.logstatusOK.checked);>"
   echo -n "<input type=button value=\"install\" onclick=ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=showlog&LOGTYPE=install&LOGSTATUSOK=\"+document.all.logstatusOK.checked);>"
   echo -n "<input type=button value=\"send\" onclick=ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=showlog&LOGTYPE=send&LOGSTATUSOK=\"+document.all.logstatusOK.checked);> with status: "
   echo -n "OK <input id=\"logstatusOK\" type=\"radio\" name=\"logstatus\" value=\"OK\"> "
   echo -n "FAILED <input type=\"radio\" name=\"logstatus\" value=\"FAILED\" checked=\"checked\">"
   # close tag
   echo -n "]]></showlogcontrols>"
}


function print_editorcontrols() {

   echo -n "<editcontrols><![CDATA["
   # specfile save
   echo -n "<div style=\"width:100%;overflow:hidden;\"><span style=\"float:left\">"
   echo -n "<input type=button id=savebutton value=\"save\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=savespec&SENDREPOSITORY=$SENDREPOSITORY&SPECTEXT=\"+encodeURIComponent(editor.getValue()));"
   echo -n "this.disabled=true; disabled=disabled class=redbutton>"
   # specfile reload
   echo -n "<input type=button id=updatespecbutton value=\"reload\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=reloadspec\""
   echo -n ",\"`cgi_encodevar "Reload <b>$PACKAGE.spec</b>?<br><br>Warning: current unsaved .spec file changes will be lost."`\");>"
   # specfile delete
   echo -n "<input type=button id=updatespecbutton value=\"delete\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=deletespec\",\"`cgi_encodevar "Really delete <b>$PACKAGE.spec</b>?"`\")>"
   # specfile rename
   echo -n "<input type=button id=updatespecbutton value=\"rename to:\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&RENAMESPECFROM=$PACKAGE&"
   echo -n "SPECTEXT=\"+encodeURIComponent(editor.getValue())+\"&"
   echo -n "REQUEST=renamespec&PACKAGE=\"+encodeURIComponent(getElementById('specnewname').value));>"
   echo -n "<input type=text id=specnewname value=\"\" size=12>.spec"
   # add a note
   echo -n "<label>"
   echo -n "<input type=button id=addpkgnote value=\"add a note:\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "SPECTEXT=\"+encodeURIComponent(editor.getValue())+\"&"
   echo -n "REQUEST=addpkgnote&PKGNOTE=\"+encodeURIComponent(getElementById('pkgnote').value));></label></span>"
   echo -n "<span style=\"display:block;overflow:hidden;padding-right:5px;\">"
   echo -n "<input type=text id=pkgnote value=\"\" style=\"width:100%\">"
   echo -n "</span></div>"
   # specfile update
   echo -n "<div style=\"width:100%;overflow:hidden;\"><span style=\"float:left\">"
   echo -n "<input type=button id=updatespecbutton value=\"update\" onclick="
   echo -n "ajax_getvalues(\"ENVIRONMENT=$ENVIRONMENT&REPOSITORY=$REPOSITORY&PACKAGE=$PACKAGEENCODED&"
   echo -n "REQUEST=updatespec&UPDATESPECVERSION=\"+getElementById('updatespecversion').value+\"&"
   echo -n "RPMFORCE=\"+getElementById('rpmforce').checked+\"&"
   echo -n "DEBUG=\"+getElementById('debug').checked+\"&"
   echo -n "REBUILDSPECCHANGELOG=\"+encodeURIComponent(getElementById('rebuildspecchangelog').value)+\"&"
   echo -n "SPECTEXT=\"+encodeURIComponent(editor.getValue()));>"
   echo -n " (automatic or specify new version:<input type=text id=updatespecversion value=\"\" size=\"10\">"
   echo -n " or new release changelog:"
   echo -n "</span><span style=\"display:block;float:right\">)</span>"
   echo -n "<span style=\"display:block;overflow:hidden;padding-right:5px;\">"
   echo -n "<input type=text id=rebuildspecchangelog value=\"$REBUILDSPECCHANGELOG\" style=\"width:100%\">"
   echo -n "</span></div>"
   # close tag
   echo -n "]]></editcontrols>"

}

function show_docs() {
   local f RET ftype
   
   for f in $@; do
      echo -n "<a href=#logfile-$f>$f</a><br>"
   done
   echo -n "<br>"
   for f in $@; do
      echo -n "<a name=logfile-$f><p style=\"background-color:gray\"><b>File $f:</b></a><pre>"
      ftype="`$SUDO_WRAPPER 0 $ENVIRONMENT "$USER" $PACKAGE "cd $SPECVAR_RPMBUILDDIR/$SPECVAR_BUILDDIR && file $f"`"
      if [ "${ftype/text}" = "${ftype}" ]; then
         echo "<p>Binary file; skipping."
         continue
      fi
      $SUDO_WRAPPER 0 $ENVIRONMENT "$USER" $PACKAGE \
         "cd $SPECVAR_RPMBUILDDIR/$SPECVAR_BUILDDIR && head -c 10240 $f | sed \"s|<|\&lt;|g;s|[[:cntrl:]]\[[0-9;]*m||g\"" | parse_generic_output
      RET=$?
      echo -n "</pre>"
   done
   return $RET
}

function download_file() {
   local RET
   local download_environment=$1
   local download_files=$2
   local f

   for f in $download_files; do 
echo $f >> /tmp/down
      echo -e "Content-Type: application/octet-stream"
      echo -e "Content-Disposition: attachment; filename=\"${f/*\/}\"\n"
      if [ "$download_environment" ]; then
         $SUDO_WRAPPER binary $download_environment "$USER" "" "cat $f 2>/dev/null"
      else
         cat $f 2>/dev/null
      fi
   done
   
   RET=$?
   return $RET
}

function resolve_rpmmanagerdir() {
   local RPMMANAGERDIR=$1
   local RPMMANAGERARCH=$2
   local REPOSITORY=$3
   
   case $RPMMANAGERDIR in
      REP_SRPMS) rpmmanagerdir=$local_ftp/$REPOSITORY/SRPMS.base
                 rpmmanagermask="*.src.rpm"
                 rpmmanagermode=repository ;;
      REP_RPMS) rpmmanagerdir=$local_ftp/$REPOSITORY/RPMS.$RPMMANAGERARCH
                rpmmanagermask="*.$RPMMANAGERARCH.rpm"
                rpmmanagermode=repository ;;
      REP_RPMSNOARCH) rpmmanagerdir=$local_ftp/$REPOSITORY/RPMS.$RPMMANAGERARCH
                rpmmanagermask="*.noarch.rpm"
                rpmmanagermode=repository ;;
      SRPMS) rpmmanagerdir=../SRPMS
             rpmmanagermask="*.src.rpm"
             rpmmanagermode=environment ;;
      RPMSNOARCH) rpmmanagerdir=../RPMS/noarch
              rpmmanagermask="*.noarch.rpm"
              rpmmanagermode=environment ;;
      *) rpmmanagerdir=../RPMS/$RPMMANAGERARCH
         rpmmanagermask="*.$RPMMANAGERARCH.rpm"
         rpmmanagermode=environment ;;
   esac
}