#!/bin/bash
#
# Makedist automatic build script
# Copyright (c) 2007-2013 by Silvan Calarco <silvan.calarco@mambasoft.it>
#
# Usage:
#
# To overwrite already existing images
# FORCE_OVERWRITE=1 ./20-openmamba-makedist
#
# To commit a new release (relies on snapshot images):
# RELEASE=1.0pre3 ./20-openmamba-makedist
#
. /etc/sysconfig/makedist
. /usr/share/makedist/functions.inc.sh

[ "$MAKEDIST_CRON_ENABLE" = "1" ] || exit 0

ME=`basename $0`
[ "$$" == "`pidof -x $ME`" ] || {
   echo "Warning: makedist-autobuild script already running; exiting."
   exit 0
}

[ "`uname -m`" = "x86_64" ] && HOST_IS_X86_64=1

TORRENTURL=http://torrent.mambasoft.it:8080/announce
DISTRONAME=openmamba
MAKEDIST_TARGET=openmamba
arch=i586
SOURCEDIR=/var/makedist

[ "$MAKEDIST_FORCE" ] || MAKEDIST_FORCE=1
[ "$TODAYDATE" ] || TODAYDATE=`date +%Y%m%d`
[ "$WEEKDAY" ] || WEEKDAY=`date +%u`

[ "$DISTVERSION" ] || {
   echo "Error: DISTVERSION is not set, check configuration file; aborting."
   exit 1
}

if [ "$RELEASE" ]; then
  SOURCEIMGFILEPREFIX="openmamba-$DISTVERSION"
else
  SOURCEIMGFILEPREFIX="openmamba"
fi

DESTBASEDIR=/var/ftp/pub/openmamba/$DISTVERSION/media
DESTIMGFILEPREFIX="openmamba"
ALLMEDIASLAST=`expr ${#MEDIA_NAME[*]} - 1`
DESTBASEURL=/pub/openmamba/$DISTVERSION/media

# do_makedist()
#
# Parameters;
#
# $1: dist filename
# $2: dest filename
# $3: language
# $4: platform
# $5: subplatform
# $6: product_name
# $7: architecture
function do_makedist() {
   local DIST_CREATED=0 SOURCEIMG DESTFILENAME DESTNAME DESTLANGUAGE DESTPLATFORM DESTSUBPLATFORM DESTARCH \
         DESTPRODUCTNAME DESTDIR DESTIMG DESTMD5 DESTTORRENT
   DESTFILENAME=$1
   DESTNAME=$2
   DESTLANGUAGE=$3
   DESTPLATFORM=$4
   DESTSUBPLATFORM=$5
   DESTPRODUCTNAME=$6
   DESTARCH=$7
   SOURCEIMG=$SOURCEDIR/${DESTFILENAME}
   DESTDIR=$DESTBASEDIR/${DESTPRODUCTNAME}/${DESTLANGUAGE}
   DESTIMG=$DESTDIR/$DESTNAME
   DESTMD5=$DESTDIR/$DESTNAME.MD5.txt
   DESTTORRENT=$DESTDIR/$DESTNAME.torrent
   [ "$DESTARCH" ] || {
      echo "Error: do_makedist: invalid number of parameters; aborting."
      exit 1
   }
   if [ "$RELEASE" ]; then
      [ "$RELEASEPLATFORM" = "$MEDIUMPLATFORM" -a \
         "$RELEASESUBPLATFORM" = "$MEDIUMSUBPLATFORM" ] || return 0
   fi
   [ "$RELEASE" ] && \
      DESTLATEST=$DESTDIR/latest-is-$RELEASETAG.txt || \
      DESTLATEST=$DESTDIR/latest-is-$SNAPDATE.txt

   if [ ! -f $DESTIMG -o "$FORCE_OVERWRITE" = "1" ]; then
      if [ ! "$SIMULATE" ]; then
         if [ "$HOST_IS_X86_64" -a "${DESTARCH}" != "x86_64" ]; then
            CMD_PREFIX=linux32
         else
            CMD_PREFIX=
         fi
         [ "$CRON_DEBUG" = "1" ] && \
            echo "-> makedist openmamba PLATFORM=${DESTPLATFORM} SUBPLATFORM=${DESTSUBPLATFORM} \
LANGUAGE=${DESTLANGUAGE} ARCH=${DESTARCH} FORCE=${MAKEDIST_FORCE}"
         makedist openmamba PLATFORM=${DESTPLATFORM} SUBPLATFORM=${DESTSUBPLATFORM} \
LANGUAGE=${DESTLANGUAGE} ARCH=${DESTARCH} FORCE=${MAKEDIST_FORCE} || {
            echo "Error building openmamba ${DESTPRODUCTNAME} medium; skipping."
            return 255
         }
	 DIST_CREATED=1
      fi
      if [ "$RELEASE" ]; then
            [ -e $DESTDIR ] || mkdir -p $DESTDIR
            cp $SOURCEIMG $DESTIMG
	    cp $SOURCEDIR/.${DESTFILENAME}.inc.html $DESTDIR/buildinfo-$RELEASE.inc.html
	    [ "$RELEASE/pre" != "$RELEASE" ] && ln -sf buildinfo-$RELEASE.inc.html $DESTDIR/buildinfo-pre.inc.html
            cd $DESTDIR
            md5sum $DESTNAME > $DESTMD5
            rm -f $DESTDIR/latest-is-*.txt
            > $DESTLATEST
            if [ "${DESTIMG/.iso}" != "$DESTIMG" ]; then
               # ISO image, create video preview
               [ ! -e $DESTDIR/preview/$DESTNAME.ogv -o $SOURCEIMG -nt $DESTDIR/preview/$DESTNAME.ogv ] && makedist-recordvm $DESTIMG
            fi
      else
            [ -e $DESTDIR ] || mkdir -p $DESTDIR
            cp $SOURCEIMG $DESTIMG
	    cp $SOURCEDIR/.${DESTFILENAME}.inc.html $DESTDIR/buildinfo.inc.html
            cd $DESTDIR
            md5sum $DESTNAME > $DESTMD5
	    rm -f $DESTDIR/latest-is-*.txt
            > $DESTLATEST
            if [ "${DESTIMG/.iso}" != "$DESTIMG" ]; then
               # ISO image, create video preview
               [ ! -e $DESTDIR/preview/$DESTNAME.ogv -o $SOURCEIMG -nt $DESTDIR/preview/$DESTNAME.ogv ] && makedist-recordvm $DESTIMG
            fi
      fi
   fi
   if [ "$DIST_CREATED" = "1" -o $DESTIMG -nt $DESTTORRENT -o \
        "$FORCE_OVERWRITE" = "1" -o "$FORCE_OVERWRITE_TORRENT" = "1"  ]; then
      # Generate TORRENT
      if [ "$RELEASE" ]; then
            cd $DESTDIR
            maketorrent-console \
               --comment "openmamba $RELEASE ${DESTPRODUCTNAME} ${DESTLANGUAGE}-${DESTARCH} from http://www.openmamba.org" \
               --tracker_name "mambaSoft BitTorrent tracker" \
               --language ${DESTLANGUAGE} \
               $TORRENTURL \
               $DESTNAME --target $DESTTORRENT >/dev/null
      else
            cd $DESTDIR
            maketorrent-console \
               --comment "openmamba snapshot $SNAPDATE ${DESTPRODUCTNAME} ${DESTLANGUAGE}-${DESTARCH} from http://www.openmamba.org" \
               --tracker_name "mambaSoft BitTorrent tracker" \
               --language ${DESTLANGUAGE} \
               $TORRENTURL \
               $DESTNAME --target $DESTTORRENT >/dev/null
      fi
   fi

   return $DIST_CREATED
}

# do_all_langs_makedist()
#
# Parameters;
#
# $1: medium suffix
# $2: medium release tag
# $3: platform
# $4: subplatform
# $5: html language
# $6: product name
# $7: medium idx
function do_makedist_and_html() {

   local DIST_LINE DIST_CREATED DIST_DWD HTMLLANG MEDIA_ARCH PRODNAME \
         MEDIUMFILENAME MEDIUMNAME MEDIUMPLATFORM MEDIUMSUBPLATFORM m l

   local tempfile2=`tempfile 2>/dev/null` || tempfile2=/tmp/makedist_tmpfile2

   MEDIUMSUFFIX=$1
   MEDIUMTAG=$2
   MEDIUMPLATFORM=$3
   MEDIUMSUBPLATFORM=$4
   HTMLLANG=$5
   PRODNAME=$6
   m=$7
   [ "${m}" ] || {
      echo "Error: do_makedist_and_html: invalid number of parameters; aborting."
      exit 1
   }

   cat > $tempfile2 << _EOF
<div class="downloadbox"><table width="760"><tr><td width=400>
<form name="$PRODNAME-$RELEASETAG-form" id="$PRODNAME-$RELEASETAG-form">
_EOF

   case ${HTMLLANG} in
      it) echo -n "Lingua: " >> $tempfile2; selecttext="Scarica..."; fortext="per" ;;
      *) echo -n "Language: " >> $tempfile2; selecttext="Download..."; fortext="for" ;;
   esac
   for l in ${MEDIA_LANGUAGES[$m]}; do
      [ "$l" = "${HTMLLANG}" ] && {
          checked="checked"
      } || checked=""
      case $l in
         it) langname="italiano" ;;
         es) langname="espa&ntilde;ol" ;;
         en) langname="english" ;;
         *) langname="unknown" ;;
      esac
      echo "<input type=radio id=\"language\" name=\"language\" value=\"$l\" onclick=\"javascript:selectlang('$PRODNAME-${RELEASETAG}');\" $checked />$langname" >> $tempfile2
   done

   case ${HTMLLANG} in
      it) echo -n "<br>Architettura: " >> $tempfile2;;
      *) echo -n "<br>Architecture: " >> $tempfile2;;
   esac
   checked="checked"
   for a in ${MEDIA_ARCHS[$m]}; do
      echo "<input type=radio id=\"arch\" name=\"arch\" value=\"$a\" onclick=\"javascript:selectlang('$PRODNAME-${RELEASETAG}');\" $checked />$a" >> $tempfile2
      checked=""
   done

   cat >> $tempfile2 << _EOF
<br><span name="$PRODNAME-${RELEASETAG}-spanl" id="$PRODNAME-${RELEASETAG}-spanl"></span><script>
_EOF
   echo "<tr><td width=25%>" >> $releasetempfile.${HTMLLANG}
   #>> $tempfile.$5

   DIST_DWD="<select style=\"float:right;width:150px;align:right;\" onchange=\"window.location=this.value;\"><option value="/">$selecttext</option>"
   DIST_CREATED=

   for l in ${MEDIA_LANGUAGES[$m]}; do
      if [ "$RELEASE" ]; then
         latest=`ls $DESTBASEDIR/$PRODNAME/$l/latest-is-$DISTVERSION-*.txt 2>/dev/null| sed "s/.*latest-is-$DISTVERSION-\(.*\)\.txt/\1/"`
         DESTLATESTFILENAME=latest-$latest.inc.js
      else
         DESTLATESTFILENAME=latest.inc.js
      fi
      > $DESTBASEDIR/$PRODNAME/$l/$DESTLATESTFILENAME
      case $l in
         it) mediumlang="italiano" ;;
         es) mediumlang="espa&ntilde;ol" ;;
         en) mediumlang="english" ;;
         *) mediumlang="unknown" ;;
      esac
      for a in ${MEDIA_ARCHS[$m]}; do
         case $a in
            i586) archtext="x86" ;;
            *) archtext="$a" ;;
         esac
         DESTNAME=$DESTIMGFILEPREFIX-$PRODNAME-$l-${MEDIUMTAG}.${a}.${MEDIUMSUFFIX}
         if [ "$DIST_CREATED" != "255" ]; then
            # in case of previous build error (255) skipping building target for other langs and archs
            [ "$CRON_DEBUG" = "1" ] && \
               echo "do_makedist_and_html: calling do_makedist \"$SOURCEIMGFILEPREFIX-$PRODNAME-$l.${a}.${MEDIUMSUFFIX}\" \"$DESTNAME\" \"${l}\" \"${MEDIUMPLATFORM}\" \"${MEDIUMSUBPLATFORM}\" \"$PRODNAME\" \"${a}\""
            do_makedist "$SOURCEIMGFILEPREFIX-$PRODNAME-$l.${a}.${MEDIUMSUFFIX}" "$DESTNAME" "${l}" "${MEDIUMPLATFORM}" "${MEDIUMSUBPLATFORM}" "$PRODNAME" "${a}"
            DIST_CREATED=$?

            DESTDIR=$DESTBASEDIR/${PRODNAME}/${l}
            DESTIMG=$DESTDIR/$DESTNAME
            DESTMD5=$DESTDIR/$DESTNAME.MD5.txt
            DESTTORRENT=$DESTDIR/$DESTNAME.torrent
            DESTSIZE=`du $DESTIMG -h | gawk '{ print $1 }'`
            DESTMD5=`cat $DESTMD5 | gawk '{ print $1 }'`
            DESTBUILDDATE=`stat -c %y $DESTIMG`
            cat >> $DESTDIR/$DESTLATESTFILENAME << _EOF
nameArray['$PRODNAME-$RELEASETAG-${l}-${a}']='$DESTNAME';
pathArray['$PRODNAME-$RELEASETAG-${l}-${a}']='/download.html?file=$DESTBASEURL/$PRODNAME/${l}/';
sizeArray['$PRODNAME-$RELEASETAG-${l}-${a}']='$DESTSIZE';
md5Array['$PRODNAME-$RELEASETAG-${l}-${a}']='$DESTMD5';
builddateArray['$PRODNAME-$RELEASETAG-${l}-${a}']='$DESTBUILDDATE';
_EOF

         fi
         DIST_DWD="$DIST_DWD<option value=\"/download.html?file=$DESTBASEURL/$PRODNAME/$l/$DESTNAME\">${mediumlang} $fortext $archtext</option>"
#         DIST_DWD="$DIST_DWD <a href=\"/download.html?file=$DESTBASEURL/$PRODNAME/$l/$DESTNAME\">${l}-${a}</a>"
      done
      cat $DESTBASEDIR/$PRODNAME/$l/$DESTLATESTFILENAME >> $tempfile2
   done
   DIST_DWD="$DIST_DWD</select>"
   DIST_LINE="<a href=\"/distribution/media/${MEDIA_NAME[$m]}.html?lang=${HTMLLANG}\">${MEDIA_NAME[$m]}</a>"
   [ "$DIST_CREATED" = "1" ] && DIST_LINE="<b>$DIST_LINE</b>"
   echo "${DIST_LINE}</td><td width=30%>$SNAPDATE</td><td width=40%>${DIST_DWD}</td></tr>" >>$releasetempfile.${HTMLLANG}

   cat >> $tempfile2 << _EOF
</script></form></td><td><span name="${6}-${RELEASETAG}-spanr" id="${PRODNAME}-${RELEASETAG}-spanr"></span></td></tr>
<tr><td colspan=2><span id="details-data-$PRODNAME-${RELEASETAG/./_}"></span></td></tr></table></div>
<script>javascript:selectlang('$PRODNAME-${RELEASETAG}');</script>
_EOF

   if [ "$RELEASE" ]; then
      DESTHTML=$DESTBASEDIR/$PRODNAME/index.inc.${HTMLLANG}.$latest.html
      ln -sf index.inc.${HTMLLANG}.$latest.html $DESTBASEDIR/$PRODNAME/index.inc.${HTMLLANG}.html
      ln -sf index.inc.${HTMLLANG}.html $DESTBASEDIR/$PRODNAME/index.inc.${HTMLLANG}.pre.html
   else
      DESTHTML=$DESTBASEDIR/$PRODNAME/index.inc.${HTMLLANG}.html
   fi
   mv $tempfile2 $DESTHTML
   chmod +r $DESTHTML
   if [ "$DIST_CREATED" = "1" ]; then
      # snapshots
      makedist-announcement --rebuild-announcement --send-email $DISTVERSION $PRODNAME
   elif [ "$RELEASEPLATFORM" = "$MEDIUMPLATFORM" -a \
         "$RELEASESUBPLATFORM" = "$MEDIUMSUBPLATFORM" ]; then
      # stable
      makedist-announcement --rebuild-announcement --send-test-email $DISTVERSION $PRODNAME
   fi
   return $DIST_CREATED
}

releasetempfile=`tempfile 2>/dev/null` || releasetempfile=/tmp/makedist_tmpfile

for l in ${HTML_LANGS}; do
   echo "<table width=100% cellpadding=0 cellspacing=0>" > $releasetempfile.$l
done

for i in `seq 0 $ALLMEDIASLAST`; do

   PLATFORM=${MEDIA_PLATFORM[i]}
   SUBPLATFORM=${MEDIA_SUBPLATFORM[i]}
   unset PRODUCT_NAME
   unset PRODUCT_NAME_OVERRIDE

   [ $SUBPLATFORM ] && . /var/makedist/targets/$MAKEDIST_TARGET/platforms/$SUBPLATFORM/settings.inc
   . /var/makedist/targets/$MAKEDIST_TARGET/platforms/$PLATFORM/settings.inc
   [ "$SUBPLATFORM" ] && \
      medium_name=`arch=_SPLIT_ PLATFORM=$SUBPLATFORM media_name` ||
      medium_name=`arch=_SPLIT_ media_name`
   medium_suffix=${medium_name/*_SPLIT_\./}
   [ $PRODUCT_NAME ] || PRODUCT_NAME=${MEDIA_NAME[i]}
   [ "$PRODUCT_NAME_OVERRIDE" ] && PRODUCT_NAME=$PRODUCT_NAME_OVERRIDE

   unset latest

   #echo "PLATFORM=$PLATFORM SUBPLATFORM=$SUBPLATFORM MEDIA_SUFFIX=$media_suffix"
   if [ "$RELEASE" ]; then
      echo "Releasing $PRODUCT_NAME media (${PLATFORM}/${SUBPLATFORM} $RELEASETAG)"
      SIMULATE=1
   elif [ "$WEEKDAY" = "${MEDIA_BUILDDAY[i]}" -o \
          "$FORCEBUILD" = "$PRODUCT_NAME" ]; then
      echo "Building $PRODUCT_NAME media"
      unset SIMULATE
   else
      SIMULATE=1
   fi

   if [ "$RELEASE" ]; then
      latest=`ls $DESTBASEDIR/$PRODUCT_NAME/en/latest-is-$DISTVERSION-*.txt 2>/dev/null| sed "s/.*latest-is-$DISTVERSION-\(.*\)\.txt/\1/"`
      if [ "$RELEASEPLATFORM" = "$PLATFORM" -a \
         "$RELEASESUBPLATFORM" = "$SUBPLATFORM" ]; then
         RELEASETAG=$DISTVERSION-$RELEASE
      else
         RELEASETAG=$DISTVERSION-$latest
      fi
      SNAPDATE=$RELEASETAG
   else
      latest=`ls $DESTBASEDIR/$PRODUCT_NAME/en/latest-is-*.txt 2>/dev/null| sed "s/.*latest-is-\(.*\)\.txt/\1/"`
      [ "$latest" -a "$SIMULATE" ] && SNAPDATE=$latest || SNAPDATE=$TODAYDATE
      RELEASETAG=snapshot-$SNAPDATE
   fi

   for l in ${HTML_LANGS}; do
      for ml in ${MEDIA_LANGUAGES[i]}; do
         if [ ! -e $DESTBASEDIR/$PRODUCT_NAME/$ml ]; then
            mkdir -p $DESTBASEDIR/$PRODUCT_NAME/$ml || {
               echo "Error: cannot create directory $DESTBASEDIR/$PRODUCT_NAME/$ml; aborting"
               exit 1
            }
         fi
      done

      # build all media and create html page of language ${l}
      [ "$latest" -o ! "$SIMULATE" -o "$RELEASE" ] && {
         do_makedist_and_html \
            $medium_suffix $RELEASETAG \
            $PLATFORM "$SUBPLATFORM" ${l} $PRODUCT_NAME ${i}
         [ $? -eq 255 ] && break
      }
   done
done

for l in ${HTML_LANGS}; do
   echo "</table>" >> $releasetempfile.$l
#   if [ "$RELEASE" ]; then
#      cat $releasetempfile.$l > $DESTBASEDIR/downloads-$RELEASE.inc.$l
#      [ "${RELEASE/pre}" != "$RELEASE" ] && ln -sf downloads-$RELEASE.inc.$l $DESTBASEDIR/downloads-pre.inc.$l
#   else
      rm -f $DESTBASEDIR/downloads.inc.$l
      cat $releasetempfile.$l > $DESTBASEDIR/downloads.inc.$l
#   fi
   rm -f $releasetempfile.$l
done

exit 0