From 75adc590d0668263b28ea0c1bf3d83015ec16b46 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Thu, 7 Mar 2013 21:38:36 +0100 Subject: [PATCH] add ini writer support --- bin/opsi-builder.sh | 54 ++-- lib/builder-targets.sh | 643 +++++++++++++++++++++-------------------- lib/builder-utils.sh | 432 ++++++++++++++------------- 3 files changed, 579 insertions(+), 550 deletions(-) diff --git a/bin/opsi-builder.sh b/bin/opsi-builder.sh index 1f2752d..b2389f3 100755 --- a/bin/opsi-builder.sh +++ b/bin/opsi-builder.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# +# # enabled debug # set -x @@ -9,31 +9,31 @@ # Controller #################### builder_controller() { - local result - - # read config - call_entry_point result config; (( $result == "0" )) || builder_config - - # prepare - call_entry_point result prepare ; (( $result == "0" )) || builder_prepare - - # download and process dist files - call_entry_point result retrieve; (( $result == "0" )) || builder_retrieve - - # Create some special files - call_entry_point result create; (( $result == "0" )) || builder_create - - # Start packaging - call_entry_point result package; (( $result == "0" )) || builder_package - - # Upload to repos - call_entry_point result publish; (( $result == "0" )) || builder_publish - - # git commit - call_entry_point result commit; (( $result == "0" )) || builder_commit - - # cleanup - call_entry_point result cleanup; (( $result == "0" )) || builder_cleanup + local result + + # read config + call_entry_point result config; (( $result == "0" )) || builder_config + + # prepare + call_entry_point result prepare ; (( $result == "0" )) || builder_prepare + + # download and process dist files + call_entry_point result retrieve; (( $result == "0" )) || builder_retrieve + + # Create some special files + call_entry_point result create; (( $result == "0" )) || builder_create + + # Start packaging + call_entry_point result package; (( $result == "0" )) || builder_package + + # Upload to repos + call_entry_point result publish; (( $result == "0" )) || builder_publish + + # git commit + call_entry_point result commit; (( $result == "0" )) || builder_commit + + # cleanup + call_entry_point result cleanup; (( $result == "0" )) || builder_cleanup } #################### @@ -58,7 +58,7 @@ builder_check_error "no opsi product directory specified: $PRODUCT_DIR" # source additional, product dependent callback (cb) targets if [ -f "$PRODUCT_DIR/builder-targets-cb.sh" ] ; then - . "$PRODUCT_DIR/builder-targets-cb.sh" + . "$PRODUCT_DIR/builder-targets-cb.sh" fi # call main diff --git a/lib/builder-targets.sh b/lib/builder-targets.sh index 140cb5b..02aec6b 100644 --- a/lib/builder-targets.sh +++ b/lib/builder-targets.sh @@ -9,259 +9,264 @@ # Read config #################### builder_config() { - - # Define commands - CMD_7z="`which 7z`" ; builder_check_error "Command '7z' not installed" - CMD_unzip="`which unzip`" ; builder_check_error "Command 'unzip' not installed" - CMD_unrar="`which unrar`" ; builder_check_error "Command 'unrar' not installed" - CMD_zip="`which zip`" ; builder_check_error "Command 'zip' not installed" - CMD_lha="`which lha`" ; builder_check_error "Command 'lha' not installed" - CMD_tar="`which tar`" ; builder_check_error "Command 'tar' not installed" - CMD_cabextract="`which cabextract`" ; builder_check_error "Command 'cabextract' not installed" - CMD_unix2dos="`which unix2dos`" ; builder_check_error "Command 'unix2dos' not installed" - CMD_identify="`which identify`" ; builder_check_error "Command 'identify' (ImageMagick) not installed" - CMD_zsyncmake="`which zsyncmake`" ; builder_check_error "Command 'zsyncmake' not installed" - CMD_comm="`which comm`" ; builder_check_error "Command 'comm' not installed" - CMD_sha1sum="`which sha1sum`" ; builder_check_error "Command 'sha1sum' not installed" - - # Check temp dir - test -d ${TMP_DIR} - builder_check_error "temp directory not available: $TMP_DIR" - - # project dependent configuration - local config=${PRODUCT_DIR}/builder-product.cfg - test -f ${config} || builder_check_error "cannot read product config: ${config}" - . ${config} - - # set default build configuration and source the user dependent file - local config=$BASEDIR/conf/opsi-builder.cfg - . ${config} - - # Source local build configuration (must be done AFTER sourcing the builder-product.cfg.cfg) - if [ -f "$OPSI_BUILDER" ] ; then - config=$OPSI_BUILDER - else - test -f $HOME/.opsi-builder.cfg && config=$HOME/.opsi-builder.cfg + + # Define commands + CMD_7z="`which 7z`" ; builder_check_error "Command '7z' not installed" + CMD_unzip="`which unzip`" ; builder_check_error "Command 'unzip' not installed" + CMD_unrar="`which unrar`" ; builder_check_error "Command 'unrar' not installed" + CMD_zip="`which zip`" ; builder_check_error "Command 'zip' not installed" + CMD_lha="`which lha`" ; builder_check_error "Command 'lha' not installed" + CMD_tar="`which tar`" ; builder_check_error "Command 'tar' not installed" + CMD_cabextract="`which cabextract`" ; builder_check_error "Command 'cabextract' not installed" + CMD_unix2dos="`which unix2dos`" ; builder_check_error "Command 'unix2dos' not installed" + CMD_identify="`which identify`" ; builder_check_error "Command 'identify' (ImageMagick) not installed" + CMD_zsyncmake="`which zsyncmake`" ; builder_check_error "Command 'zsyncmake' not installed" + CMD_comm="`which comm`" ; builder_check_error "Command 'comm' not installed" + CMD_sha1sum="`which sha1sum`" ; builder_check_error "Command 'sha1sum' not installed" + CMD_iniset="`which ini-set`" ; builder_check_error "Command 'ini-set' (martINI a pypi project) not installed" + + # Check temp dir + test -d ${TMP_DIR} + builder_check_error "temp directory not available: $TMP_DIR" + + # project dependent configuration + local config=${PRODUCT_DIR}/builder-product.cfg + test -f ${config} || builder_check_error "cannot read product config: ${config}" + . ${config} + + # set default build configuration and source the user dependent file + local config=$BASEDIR/conf/opsi-builder.cfg + . ${config} + + # Source local build configuration (must be done AFTER sourcing the builder-product.cfg.cfg) + if [ -f "$OPSI_BUILDER" ] ; then + config=$OPSI_BUILDER + else + test -f $HOME/.opsi-builder.cfg && config=$HOME/.opsi-builder.cfg + fi + + # Read ONLY the STATUS variable from the build configuration file + eval "`grep -E "^(STATUS|STATUS_INTEGRATION_RELEASE)=" $config`" + + # change some variable from the builder-product.cfg dynamically: + # autogenerate release number, if we are in status "integration" + if [ "$STATUS" = "integration" ] ; then + if [ "${STATUS_INTEGRATION_RELEASE}" = "func:inc1" ] ; then + . ${config} + calc_release + else + # OPSI/control:RELEASE is limited to max 16 chars - take care in regards to the CREATOR_TAG + RELEASE="${STATUS_INTEGRATION_RELEASE}" fi - - # Read ONLY the STATUS variable from the build configuration file - eval "`grep -E "^(STATUS|STATUS_INTEGRATION_RELEASE)=" $config`" - - # change some variable from the builder-product.cfg dynamically: - # autogenerate release number, if we are in status "integration" - if [ "$STATUS" = "integration" ] ; then - if [ "${STATUS_INTEGRATION_RELEASE}" = "func:inc1" ] ; then - . ${config} - calc_release - else - # OPSI/control:RELEASE is limited to max 16 chars - take care in regards to the CREATOR_TAG - RELEASE="${STATUS_INTEGRATION_RELEASE}" - fi - fi - - # Read configurationfile - . ${config} - echo "Loaded builder configuration: $config" - - # Check variables - if [ -z ${OPSI_REPOS_BASE_DIR} ] || [ ! -d ${OPSI_REPOS_BASE_DIR} ] ; then - echo "configuration error: OPSI_REPOS_BASE_DIR directory does not exist: $OPSI_REPOS_BASE_DIR" - exit 2 - fi - - if [ "$TYPE" != "public" ] && [ "$TYPE" != "restricted" ] ; then - fatal_error "unknown TYPE: $TYPE" - fi - - # Check, if variable is numeric - if [ ! `expr ${OPSI_REPOS_PURGE_LIMIT} + 1 2> /dev/null` ] ; then - fatal_error "OPSI_REPOS_PURGE_LIMIT must be numeric" - fi - + fi + + # Read configurationfile + . ${config} + echo "Loaded builder configuration: $config" + + # Check variables + if [ -z ${OPSI_REPOS_BASE_DIR} ] || [ ! -d ${OPSI_REPOS_BASE_DIR} ] ; then + echo "configuration error: OPSI_REPOS_BASE_DIR directory does not exist: $OPSI_REPOS_BASE_DIR" + exit 2 + fi + + if [ "$TYPE" != "public" ] && [ "$TYPE" != "restricted" ] ; then + fatal_error "unknown TYPE: $TYPE" + fi + + # Check, if variable is numeric + if [ ! `expr ${OPSI_REPOS_PURGE_LIMIT} + 1 2> /dev/null` ] ; then + fatal_error "OPSI_REPOS_PURGE_LIMIT must be numeric" + fi + } ##################### # Prepare build #################### builder_prepare() { - echo "builder_prepare: " - # Check if the package is still build - if [ "$OPSI_REPOS_FORCE_UPLOAD" != "true" ] && [ -f "${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi" ] ; then - echo "File ${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi already exists." - exit 1 - fi - - mkdir -p $DIST_CACHE_DIR - log_debug "Distribution directory: $DIST_CACHE_DIR" - - # setup work directory - OUTPUT_DIR="$TMP_DIR/opsi-builder.`date +%Y%m%d-%H%M%S`.$$" - mkdir -p ${OUTPUT_DIR} - builder_check_error "Cannot create temp directory ${OUTPUT_DIR}" - - # prepare - INST_DIR=$OUTPUT_DIR/$PN - mkdir $INST_DIR - - log_info " OUTPUT_DIR: $OUTPUT_DIR" + echo "builder_prepare: " + # Check if the package is still build + if [ "$OPSI_REPOS_FORCE_UPLOAD" != "true" ] && [ -f "${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi" ] ; then + echo "File ${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi already exists." + exit 1 + fi + + mkdir -p $DIST_CACHE_DIR + log_debug "Distribution directory: $DIST_CACHE_DIR" + + # setup work directory + OUTPUT_DIR="$TMP_DIR/opsi-builder.`date +%Y%m%d-%H%M%S`.$$" + mkdir -p ${OUTPUT_DIR} + builder_check_error "Cannot create temp directory ${OUTPUT_DIR}" + + # prepare + INST_DIR=$OUTPUT_DIR/$PN + mkdir $INST_DIR + + log_info " OUTPUT_DIR: $OUTPUT_DIR" } ##################### -# Download all dist files from one of the defined URLs. +# Download all dist files from one of the defined URLs. # and validate the checksum #################### builder_retrieve() { - - for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do - local basename=${DL_FILE[$i]} - local urls=${DL_SOURCE[$i]} - local arch=${DL_ARCH[$i]} - local downloaded=0 - - # Add private repos to the urls - if [ ! -z ${DIST_PRIVATE_REPOS} ]; then - urls="${DIST_PRIVATE_REPOS}/$basename;$urls" - fi - - # check existence of CRC file only in non devel mode - if [ ! -e "${PRODUCT_DIR}/${basename}.sha1sum" ] && [ "$CHECKSUM_AUTOCREATE" != "true" ] ; then - fatal_error "You need to create the checksums with: sha1sum ${DIST_CACHE_DIR}/${basename} > ${PRODUCT_DIR}/${basename}.sha1sum" - fi - - echo "Downloading $basename" - # check downloading from the defined URLs - for src in `echo $urls | sed -e 's/[;,]/\n/g'` ; do - if [ $downloaded == 1 ]; then continue; fi - - # Download file - echo " Info: Downloding from $src" - local downloader=${DL_DOWNLOADER[$i]} - if [ -z $downloader ]; then downloader="wget" ; fi - - mkdir -p ${DIST_CACHE_DIR}/$arch - DL_DIST_FILE[$i]=${DIST_CACHE_DIR}/$arch/$basename - retrieve_file $downloader $src ${DL_DIST_FILE[$i]} - - if [ $? != 0 ] ; then - echo " Warning: Failed to download file - try next URL" - continue; - fi - - # Check sha1 - if [ ! -e "${PRODUCT_DIR}/${basename}.sha1sum" ] && [ "$CHECKSUM_AUTOCREATE" == "true" ] ; then - $CMD_sha1sum ${DL_DIST_FILE[$i]} > ${PRODUCT_DIR}/${basename}.sha1sum - downloaded=1 - echo " WARNING: SHA1 checksum (${DL_DIST_FILE[$i]}.sha1sum) was created dynamically because auf CHECKSUM_AUTOCREATE=$CHECKSUM_AUTOCREATE" - else - # testing the checksum of the downloaded files - local sha1sum_val=`cat ${PRODUCT_DIR}/${basename}.sha1sum | cut -d " " -f1` - local checksum_val=`sha1sum ${DL_DIST_FILE[$i]} | cut -d " " -f1` - if [ "$checksum_val" = "$sha1sum_val" ] ; then - downloaded=1 - fi - fi - - # Print result - if [ "$downloaded" == "1" ] ; then - echo " Info: Downloaded successfully" - else - echo " Error: The checksums do not match - try next URL" - fi - - done - echo - - # Ups - no URL works - if [ $downloaded != 1 ] ; then - echo " Error: can download the file or checksum wrong (sha1sum ${DIST_CACHE_DIR}/${basename} > ${basename}.sha1sum)" - exit 1; - fi - + + for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do + local basename=${DL_FILE[$i]} + local urls=${DL_SOURCE[$i]} + local arch=${DL_ARCH[$i]} + local downloaded=0 + + # Add private repos to the urls + if [ ! -z ${DIST_PRIVATE_REPOS} ]; then + urls="${DIST_PRIVATE_REPOS}/$basename;$urls" + fi + + # check existence of CRC file only in non devel mode + if [ ! -e "${PRODUCT_DIR}/${basename}.sha1sum" ] && [ "$CHECKSUM_AUTOCREATE" != "true" ] ; then + fatal_error "You need to create the checksums with: sha1sum ${DIST_CACHE_DIR}/${basename} > ${PRODUCT_DIR}/${basename}.sha1sum" + fi + + echo "Downloading $basename" + # check downloading from the defined URLs + for src in `echo $urls | sed -e 's/[;,]/\n/g'` ; do + if [ $downloaded == 1 ]; then continue; fi + + # Download file + echo " Info: Downloding from $src" + local downloader=${DL_DOWNLOADER[$i]} + if [ -z $downloader ]; then downloader="wget" ; fi + + mkdir -p ${DIST_CACHE_DIR}/$arch + DL_DIST_FILE[$i]=${DIST_CACHE_DIR}/$arch/$basename + retrieve_file $downloader $src ${DL_DIST_FILE[$i]} + + if [ $? != 0 ] ; then + echo " Warning: Failed to download file - try next URL" + continue; + fi + + # Check sha1 + if [ ! -e "${PRODUCT_DIR}/${basename}.sha1sum" ] && [ "$CHECKSUM_AUTOCREATE" == "true" ] ; then + $CMD_sha1sum ${DL_DIST_FILE[$i]} > ${PRODUCT_DIR}/${basename}.sha1sum + downloaded=1 + echo " WARNING: SHA1 checksum (${DL_DIST_FILE[$i]}.sha1sum) was created dynamically because auf CHECKSUM_AUTOCREATE=$CHECKSUM_AUTOCREATE" + else + # testing the checksum of the downloaded files + local sha1sum_val=`cat ${PRODUCT_DIR}/${basename}.sha1sum | cut -d " " -f1` + local checksum_val=`sha1sum ${DL_DIST_FILE[$i]} | cut -d " " -f1` + if [ "$checksum_val" = "$sha1sum_val" ] ; then + downloaded=1 + fi + fi + + # Print result + if [ "$downloaded" == "1" ] ; then + echo " Info: Downloaded successfully" + else + echo " Error: The checksums do not match - try next URL" + fi + done + echo + + # Ups - no URL works + if [ $downloaded != 1 ] ; then + echo " Error: can download the file or checksum wrong (sha1sum ${DIST_CACHE_DIR}/${basename} > ${basename}.sha1sum)" + exit 1; + fi + + done } ##################### # Create files #################### builder_create() { - - # Copy files and convert text files to dos format - cp -Rv ${PRODUCT_DIR}/OPSI $INST_DIR - cp -Rv ${PRODUCT_DIR}/CLIENT_DATA $INST_DIR - find $INST_DIR/CLIENT_DATA -type f | xargs -n1 -iREP sh -c 'file -i $0 | grep -v "utf-16" | grep "text/plain" && '$CMD_unix2dos' $0 ' REP >/dev/null - - # converting icon file - local iconfile_src=${DL_DIST_FILE[$ICON_DL_INDEX]} - ICONFILE=$OUTPUT_DIR/$PN.png - convert_image $iconfile_src $ICONFILE - cp -a $ICONFILE $INST_DIR/CLIENT_DATA + + # Copy files and convert text files to dos format + cp -Rv ${PRODUCT_DIR}/OPSI $INST_DIR + cp -Rv ${PRODUCT_DIR}/CLIENT_DATA $INST_DIR + find $INST_DIR/CLIENT_DATA -type f | xargs -n1 -iREP sh -c 'file -i $0 | grep -v "utf-16" | grep "text/plain" && '$CMD_unix2dos' $0 ' REP >/dev/null + + # converting icon file + local iconfile_src=${DL_DIST_FILE[$ICON_DL_INDEX]} + ICONFILE=$OUTPUT_DIR/$PN.png + convert_image $iconfile_src $ICONFILE + cp -a $ICONFILE $INST_DIR/CLIENT_DATA + + # copy binaries + for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do + DL_EXTRACT_PATH[$i]=${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]}/${DL_EXTRACT_TO[$i]} + local format=${DL_EXTRACT_FORMAT[$i]} + if [ -z "$format" ] ; then format="cp"; fi - # copy binaries - for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do - DL_EXTRACT_PATH[$i]=${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]}/${DL_EXTRACT_TO[$i]} - local format=${DL_EXTRACT_FORMAT[$i]} - if [ -z "$format" ] ; then format="cp"; fi - - mkdir -p ${DL_EXTRACT_PATH[$i]} - process_file $format ${DL_DIST_FILE[$i]} ${DL_EXTRACT_PATH[$i]} - done - - # create winst variables - local var_file=${OUTPUT_DIR}/variable.ins - create_winst_varfile $var_file - - # add the new vaiables to all *.ins winst files - for inst_file in `find ${INST_DIR}/CLIENT_DATA -type f -name "*.ins"` ; do - sed -i -e "/@@BUILDER_VARIABLES@@/ { + mkdir -p ${DL_EXTRACT_PATH[$i]} + process_file $format ${DL_DIST_FILE[$i]} ${DL_EXTRACT_PATH[$i]} + done + + # create winst variables + local var_file=${OUTPUT_DIR}/variable.ins + create_winst_varfile $var_file + + # write ini file + local ini_file=${INST_DIR}/CLIENT_DATA/opsi-$PN.ini + write_ini_file $ini_file + + # add the new vaiables to all *.ins winst files + for inst_file in `find ${INST_DIR}/CLIENT_DATA -type f -name "*.ins"` ; do + sed -i -e "/@@BUILDER_VARIABLES@@/ { r "$var_file" - d - }" $inst_file - done - - # replace variables from file OPSI/control - local release_new=${CREATOR_TAG}${RELEASE} - sed -e "s!VERSION!$VERSION!g" -e "s!RELEASE!${release_new}!g" -e "s!PRIORITY!$PRIORITY!g" -e "s!ADVICE!$ADVICE!g" ${PRODUCT_DIR}/OPSI/control >$INST_DIR/OPSI/control - - # Create changelog based on git - if available - if [ -d "${PRODUCT_DIR}/.git" ] ; then - git log --date-order --date=short | \ - sed -e '/^commit.*$/d' | \ - awk '/^Author/ {sub(/\\$/,""); getline t; print $0 t; next}; 1' | \ - sed -e 's/^Author: //g' | \ - sed -e 's/>Date: \([0-9]*-[0-9]*-[0-9]*\)/>\t\1/g' | \ - sed -e 's/^\(.*\) \(\)\t\(.*\)/\3 \1 \2/g' > $INST_DIR/OPSI/changelog.txt - else - echo "No git repository present." - fi - + d + }" $inst_file + done + + # replace variables from file OPSI/control + local release_new=${CREATOR_TAG}${RELEASE} + sed -e "s!VERSION!$VERSION!g" -e "s!RELEASE!${release_new}!g" -e "s!PRIORITY!$PRIORITY!g" -e "s!ADVICE!$ADVICE!g" ${PRODUCT_DIR}/OPSI/control >$INST_DIR/OPSI/control + + # Create changelog based on git - if available + if [ -d "${PRODUCT_DIR}/.git" ] ; then + git log --date-order --date=short | \ + sed -e '/^commit.*$/d' | \ + awk '/^Author/ {sub(/\\$/,""); getline t; print $0 t; next}; 1' | \ + sed -e 's/^Author: //g' | \ + sed -e 's/>Date: \([0-9]*-[0-9]*-[0-9]*\)/>\t\1/g' | \ + sed -e 's/^\(.*\) \(\)\t\(.*\)/\3 \1 \2/g' > $INST_DIR/OPSI/changelog.txt + else + echo "No git repository present." + fi + } ##################### # build opsi package ##################### builder_package() { - - # creating package - local release_new=${CREATOR_TAG}${RELEASE} - local opsi_file=${PN}_${VERSION}-${release_new}.opsi - - pushd ${OUTPUT_DIR} - rm -f ${opsi_file} ${OPSI_REPOS_FILE_PATTERN}.opsi - LANG="C" opsi-makeproductfile -v $INST_DIR - builder_check_error "Building OPSI-package" - popd - - # rename opsi package file - if [ "${opsi_file}" != "${OPSI_REPOS_FILE_PATTERN}.opsi" ]; then - mv ${OUTPUT_DIR}/${opsi_file} ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi - builder_check_error "can't move file ${OUTPUT_DIR}/${opsi_file} ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi" - fi - -# --exclude \*/.git\* - # create source- and binary package package - test "${OPSI_REPOS_UPLOAD_BIN}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.zip $INST_DIR - test "${OPSI_REPOS_UPLOAD_SOURCE}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}-src.zip ${PRODUCT_DIR} + + # creating package + local release_new=${CREATOR_TAG}${RELEASE} + local opsi_file=${PN}_${VERSION}-${release_new}.opsi + + pushd ${OUTPUT_DIR} + rm -f ${opsi_file} ${OPSI_REPOS_FILE_PATTERN}.opsi + LANG="C" opsi-makeproductfile -v $INST_DIR + builder_check_error "Building OPSI-package" + popd + + # rename opsi package file + if [ "${opsi_file}" != "${OPSI_REPOS_FILE_PATTERN}.opsi" ]; then + mv ${OUTPUT_DIR}/${opsi_file} ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi + builder_check_error "can't move file ${OUTPUT_DIR}/${opsi_file} ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi" + fi + + # --exclude \*/.git\* + # create source- and binary package package + test "${OPSI_REPOS_UPLOAD_BIN}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.zip $INST_DIR + test "${OPSI_REPOS_UPLOAD_SOURCE}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}-src.zip ${PRODUCT_DIR} } @@ -269,45 +274,45 @@ builder_package() { # publish ##################### builder_publish() { - - # Upload file to repository - mkdir -p ${OPSI_REPOS_PRODUCT_DIR} - - echo "Publishing opsi-package to ${OPSI_REPOS_PRODUCT_DIR}" - local src=${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN} - local dst=${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN} - - # copy files - if [ "${OPSI_REPOS_UPLOAD_OPSI}" = "true" ] ; then - cp ${src}.opsi ${dst}.opsi - builder_check_error "Can't upload file $dst.opsi --> $dst.opsi" - fi - - if [ "${OPSI_REPOS_UPLOAD_BIN}" = "true" ] ; then - cp ${src}.zip ${dst}.zip - builder_check_error "Can't upload file $dst.zip --> $dst.zip" - fi - - if [ "${OPSI_REPOS_UPLOAD_SOURCE}" = "true" ] ; then - cp ${src}-src.zip ${dst}-src.zip - builder_check_error "Can't upload file ${dst}-src.zip --> ${dst}-src.zip" - fi - - if [ "${OPSI_REPOS_OPSIMANAGER_INSTALL}" = "true" ] ; then - opsi-package-manager -i -v ${src}.opsi - builder_check_error "Can't install ${src}.opsi" - fi - - if [ "${OPSI_REPOS_UPLOAD_OPSI_ZSYNC}" = "true" ] ; then - md5sum "${src}.opsi" | sed 's/ .*//' > ${dst}.opsi.md5 - builder_check_error "Can't create md5 file" - - ${CMD_zsyncmake} -u ${OPSI_REPOS_FILE_PATTERN}.opsi -o "${dst}.opsi.zsync" "${src}.opsi" - builder_check_error "Can't create zsync file" - fi - - # Create revision file for this - local rev_file=${OPSI_REPOS_PRODUCT_DIR}/${PN}-${VERSION}-${CREATOR_TAG}${RELEASE}.cfg + + # Upload file to repository + mkdir -p ${OPSI_REPOS_PRODUCT_DIR} + + echo "Publishing opsi-package to ${OPSI_REPOS_PRODUCT_DIR}" + local src=${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN} + local dst=${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN} + + # copy files + if [ "${OPSI_REPOS_UPLOAD_OPSI}" = "true" ] ; then + cp ${src}.opsi ${dst}.opsi + builder_check_error "Can't upload file $dst.opsi --> $dst.opsi" + fi + + if [ "${OPSI_REPOS_UPLOAD_BIN}" = "true" ] ; then + cp ${src}.zip ${dst}.zip + builder_check_error "Can't upload file $dst.zip --> $dst.zip" + fi + + if [ "${OPSI_REPOS_UPLOAD_SOURCE}" = "true" ] ; then + cp ${src}-src.zip ${dst}-src.zip + builder_check_error "Can't upload file ${dst}-src.zip --> ${dst}-src.zip" + fi + + if [ "${OPSI_REPOS_OPSIMANAGER_INSTALL}" = "true" ] ; then + opsi-package-manager -i -v ${src}.opsi + builder_check_error "Can't install ${src}.opsi" + fi + + if [ "${OPSI_REPOS_UPLOAD_OPSI_ZSYNC}" = "true" ] ; then + md5sum "${src}.opsi" | sed 's/ .*//' > ${dst}.opsi.md5 + builder_check_error "Can't create md5 file" + + ${CMD_zsyncmake} -u ${OPSI_REPOS_FILE_PATTERN}.opsi -o "${dst}.opsi.zsync" "${src}.opsi" + builder_check_error "Can't create zsync file" + fi + + # Create revision file for this + local rev_file=${OPSI_REPOS_PRODUCT_DIR}/${PN}-${VERSION}-${CREATOR_TAG}${RELEASE}.cfg cat > $rev_file < 0 ] && [ "${STATUS}" = "${OPSI_REPOS_PURGE_STATUS}" ] ; then - echo "Autopurging enabled" - - # determinte max version to delete - local limit - local pn_limit=`echo ${PN} | sed "s/[\.\-]/_/g"` - eval "`echo limit=\\$\\{OPSI_REPOS_PURGE_LIMIT_${pn_limit}\\}`" - if [ -z "$limit" ] || [ ! `expr $limit + 1 2>/dev/null` ] ; then - limit=${OPSI_REPOS_PURGE_LIMIT} - fi - echo " Purging, max. number of versions: $limit" - - # Find all revision files and sort them - local file_list=${OUTPUT_DIR}/product-file-list.txt - local file_sort_list=${OUTPUT_DIR}/product-file-sort-list.txt - rm -f ${file_list} - for cfg_file in `find ${OPSI_REPOS_BASE_DIR} -name "{PN}-${VERSION}-${CREATOR_TAG}*.cfg" -print ` ; do - . ${cfg_file} - printf "%08d;$cfg_file\n" $REV_RELEASE >> ${file_list} - done - sort -n ${file_list} > ${file_sort_list} - - # Delete the oldest files - log_debug "base list for calculate purge:" - for cfg_sort_file in `tail -${limit} ${file_sort_list} | ${CMD_comm} -13 - ${file_sort_list}` ; do - - local cfg_file=`echo $cfg_sort_file | cut -f 2 -d ";"` - . ${cfg_file} - if [ "${REV_STATUS}" != "${OPSI_REPOS_PURGE_STATUS}" ] ; then continue; fi - - dir_base=`dirname ${cfg_file}` - product_file="${dir_base}/${REV_OPSI_REPOS_FILE_PATTERN}" - echo " Purging product version: $product_file*" - - # Paranoid ... check the files to delete first - if [ ! -z "${dir_base}" ] && [ -d "${OPSI_REPOS_BASE_DIR}" ] && [ ! -z "$product_file" ] ; then - rm -f ${product_file}* ${cfg_file} - - # remove directory - if it's empty - if [ $(ls -1A ${dir_base} | wc -l) -eq 0 ]; then - rmdir ${dir_base} - fi - fi - done - fi + + + # Purge old product versions - defined by limit OPSI_REPOS_PURGE_LIMIT + if [ "${OPSI_REPOS_PURGE}" = "true" ] && [ ! -z "${OPSI_REPOS_PURGE_LIMIT}" ] && [ "${OPSI_REPOS_PURGE_LIMIT}" > 0 ] && [ "${STATUS}" = "${OPSI_REPOS_PURGE_STATUS}" ] ; then + echo "Autopurging enabled" + + # determinte max version to delete + local limit + local pn_limit=`echo ${PN} | sed "s/[\.\-]/_/g"` + eval "`echo limit=\\$\\{OPSI_REPOS_PURGE_LIMIT_${pn_limit}\\}`" + if [ -z "$limit" ] || [ ! `expr $limit + 1 2>/dev/null` ] ; then + limit=${OPSI_REPOS_PURGE_LIMIT} + fi + echo " Purging, max. number of versions: $limit" + + # Find all revision files and sort them + local file_list=${OUTPUT_DIR}/product-file-list.txt + local file_sort_list=${OUTPUT_DIR}/product-file-sort-list.txt + rm -f ${file_list} + for cfg_file in `find ${OPSI_REPOS_BASE_DIR} -name "{PN}-${VERSION}-${CREATOR_TAG}*.cfg" -print ` ; do + . ${cfg_file} + printf "%08d;$cfg_file\n" $REV_RELEASE >> ${file_list} + done + sort -n ${file_list} > ${file_sort_list} + + # Delete the oldest files + log_debug "base list for calculate purge:" + for cfg_sort_file in `tail -${limit} ${file_sort_list} | ${CMD_comm} -13 - ${file_sort_list}` ; do + + local cfg_file=`echo $cfg_sort_file | cut -f 2 -d ";"` + . ${cfg_file} + if [ "${REV_STATUS}" != "${OPSI_REPOS_PURGE_STATUS}" ] ; then continue; fi + + dir_base=`dirname ${cfg_file}` + product_file="${dir_base}/${REV_OPSI_REPOS_FILE_PATTERN}" + echo " Purging product version: $product_file*" + + # Paranoid ... check the files to delete first + if [ ! -z "${dir_base}" ] && [ -d "${OPSI_REPOS_BASE_DIR}" ] && [ ! -z "$product_file" ] ; then + rm -f ${product_file}* ${cfg_file} + + # remove directory - if it's empty + if [ $(ls -1A ${dir_base} | wc -l) -eq 0 ]; then + rmdir ${dir_base} + fi + fi + done + fi } ################### # Commiting changes to repos ################### builder_commit() { - if [ -d "${PRODUCT_DIR}/.git" ]; then - echo -n - log_debug "builder_commit() not implemented yet." - fi + if [ -d "${PRODUCT_DIR}/.git" ]; then + echo -n + log_debug "builder_commit() not implemented yet." + fi } @@ -384,8 +389,8 @@ builder_commit() { # build opsi package ##################### builder_cleanup() { - # Paranoia - if [ -d "$OUTPUT_DIR" ] && [[ $OUTPUT_DIR == $TMP_DIR/opsi-builder.* ]] ; then - rm -rf $OUTPUT_DIR - fi + # Paranoia + if [ -d "$OUTPUT_DIR" ] && [[ $OUTPUT_DIR == $TMP_DIR/opsi-builder.* ]] ; then + rm -rf $OUTPUT_DIR + fi } diff --git a/lib/builder-utils.sh b/lib/builder-utils.sh index bf61ce4..667c644 100644 --- a/lib/builder-utils.sh +++ b/lib/builder-utils.sh @@ -2,7 +2,7 @@ # void retrieve_file (src, dst) # # Description: retrieve file from an URL -# +# # Parameter # downloader: program to download the files # src: source url to get file from @@ -10,40 +10,40 @@ # ############################################# function retrieve_file() { - local downloader=$1 - local src=$2 - local dst=$3 - - # Check, if the URL is a file URL starting with file:// - if [ -f $dst ] && [ -z ${DIST_FORCE_DOWNLOAD} ]; then - echo " Info: File still cached/downloaded. To force a download, set DIST_FORCE_DOWNLOAD=1" + local downloader=$1 + local src=$2 + local dst=$3 + + # Check, if the URL is a file URL starting with file:// + if [ -f $dst ] && [ -z ${DIST_FORCE_DOWNLOAD} ]; then + echo " Info: File still cached/downloaded. To force a download, set DIST_FORCE_DOWNLOAD=1" elif [[ $src == file://* ]]; then - fileurl=`echo $src | sed "s/^file:\/\///"` - cp $fileurl $dst 2>/dev/null + fileurl=`echo $src | sed "s/^file:\/\///"` + cp $fileurl $dst 2>/dev/null + else + rm -f $dst + if [ "$downloader" = "wget" ]; then + wget --tries=1 -O $dst --timeout=5 -q --no-verbose "$src" + if [ "$?" == "1" ] ; then + rm $dst + fi + elif [ "$downloader" = "plowdown" ]; then + plowdown --max-retries=1 -o ${dst%/*} "$src" + elif [ "$downloader" = "aria2c" ]; then + #aria2c --seed-time=0 -d ${dst%/*} -o ${dst##*/} "$src" + aria2c --seed-time=0 --allow-overwrite=true -o ${dst##*/} "$src" + mv -f ${dst##*/} ${dst%/*} else - rm -f $dst - if [ "$downloader" = "wget" ]; then - wget --tries=1 -O $dst --timeout=5 -q --no-verbose "$src" - if [ "$?" == "1" ] ; then - rm $dst - fi - elif [ "$downloader" = "plowdown" ]; then - plowdown --max-retries=1 -o ${dst%/*} "$src" - elif [ "$downloader" = "aria2c" ]; then - #aria2c --seed-time=0 -d ${dst%/*} -o ${dst##*/} "$src" - aria2c --seed-time=0 --allow-overwrite=true -o ${dst##*/} "$src" - mv -f ${dst##*/} ${dst%/*} - else - fatal_error "Downloader not implemented: $downloader" - fi - fi + fatal_error "Downloader not implemented: $downloader" + fi + fi } ############################################# # void extract_file (format, src, dst) # # Description: Extract a file -# +# # Parameter # format: compression format # src: source file to be used @@ -51,32 +51,32 @@ function retrieve_file() { # ############################################# function process_file() { - - local format=$1 - local src=$2 - local dst=$3 - - log_debug "Compression format: $format" - - if [ "$format" = "cp" ]; then - cp $src $dst + + local format=$1 + local src=$2 + local dst=$3 + + log_debug "Compression format: $format" + + if [ "$format" = "cp" ]; then + cp $src $dst elif [ "$format" = "7zip" ]; then - $CMD_7z x -y -o$dst $src + $CMD_7z x -y -o$dst $src elif [ "$format" = "unzip" ]; then - $CMD_unzip -o $src -d $dst + $CMD_unzip -o $src -d $dst elif [ "$format" = "unrar" ]; then - $CMD_unrar xy $src $dst + $CMD_unrar xy $src $dst elif [ "$format" = "lha" ]; then - $CMD_lha x -w=$dst $src + $CMD_lha x -w=$dst $src elif [ "$format" = "targz" ]; then - $CMD_tar xzvf $src -C $dst + $CMD_tar xzvf $src -C $dst elif [ "$format" = "tarbz2" ]; then - $CMD_tar xjvf $src -C $dst + $CMD_tar xjvf $src -C $dst elif [ "$format" = "cab" ]; then - $CMD_cabextract -d $dst $src - else - fatal_error "Unknown compression format: $format" - fi + $CMD_cabextract -d $dst $src + else + fatal_error "Unknown compression format: $format" + fi } @@ -84,216 +84,240 @@ function process_file() { # check if method is available and call it ############################################# function call_entry_point() { - local _resultvar=$1 - local func=$2 - - # Entry point - type $func &>/dev/null - if [ $? == 0 ] ; then - $func - eval $_resultvar="0" - else - eval $_resultvar="1" - fi - + local _resultvar=$1 + local func=$2 + + # Entry point + type $func &>/dev/null + if [ $? == 0 ] ; then + $func + eval $_resultvar="0" + else + eval $_resultvar="1" + fi + } ################### # Fata Error ################### fatal_error() { - echo "FATAL: $1" - exit 1 + echo "FATAL: $1" + exit 1 } ################### # Check error ################### builder_check_error() { - if [ "$?" == "1" ] ; then - fatal_error "$1" - fi + if [ "$?" == "1" ] ; then + fatal_error "$1" + fi } ################### # Logging Debug ################### log_debug() { - local str=$1 - - if [ "$DEBUG_LEVEL" = "debug" ] || [ "$DEBUG_LEVEL" = "info" ] ; then - echo $str - fi + local str=$1 + + if [ "$DEBUG_LEVEL" = "debug" ] || [ "$DEBUG_LEVEL" = "info" ] ; then + echo $str + fi } ################### # Logging Info ################### log_info() { - local str=$1 - - if [ "$DEBUG_LEVEL" = "info" ] ; then - echo $str - fi + local str=$1 + + if [ "$DEBUG_LEVEL" = "info" ] ; then + echo $str + fi } ################### # Convert image ################### convert_image() { - local src=$1 - local dst=$2 - - local hight=`${CMD_identify} -format "%h" $src` - local wight=`${CMD_identify} -format "%w" $src` - ${CMD_identify} -format "%wx%h" $src - - # first resize the image to the new aspect ratio and add white borders - if [ $wight -lt $hight ] ; then - # Its higher so force x160 and let imagemagic decide the right wight - # then add white to the rest of the image to fit 160x160 - log_debug "Icon Wight: $wight < Hight: $hight" - convert $src -colorspace RGB -resize x160 \ - -size 160x160 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" + local src=$1 + local dst=$2 + + local hight=`${CMD_identify} -format "%h" $src` + local wight=`${CMD_identify} -format "%w" $src` + ${CMD_identify} -format "%wx%h" $src + + # first resize the image to the new aspect ratio and add white borders + if [ $wight -lt $hight ] ; then + # Its higher so force x160 and let imagemagic decide the right wight + # then add white to the rest of the image to fit 160x160 + log_debug "Icon Wight: $wight < Hight: $hight" + convert $src -colorspace RGB -resize x160 \ + -size 160x160 xc:white +swap -gravity center -composite \ + -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png + builder_check_error "converting image" elif [ $wight -gt $hight ] ; then - # Its wider so force 160x and let imagemagic decide the right hight - # then add white to the rest of the image to fit 160x160 - log_debug "Icon Wight: $wight > Hight: $hight" - convert $src -colorspace RGB -resize 160x \ - -size 160x160 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" + # Its wider so force 160x and let imagemagic decide the right hight + # then add white to the rest of the image to fit 160x160 + log_debug "Icon Wight: $wight > Hight: $hight" + convert $src -colorspace RGB -resize 160x \ + -size 160x160 xc:white +swap -gravity center -composite \ + -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png + builder_check_error "converting image" elif [ $wight -eq $hight ] ; then - # Its scare so force 160x160 - log_debug "Icon Wight: $wight = Hight: $hight" - convert $src -colorspace RGB -resize 160x160 \ - -size 160x160 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" - else - # Imagemagic is unable to detect the aspect ratio so just force 160x160 - # this could result in streched images - log_debug "Icon Wight: $wight unknown Hight: $hight" - convert $src -colorspace RGB -resize 160x160 \ - -size 160x160 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" - fi - - # create a diffence image from the source - convert $OUTPUT_DIR/resize.png \( +clone -fx 'p{0,0}' \) -compose Difference -composite \ - -modulate 100,0 +matte $OUTPUT_DIR/difference.png - - # remove the black, replace with transparency - convert $OUTPUT_DIR/difference.png -bordercolor white -border 1x1 -matte \ - -fill none -fuzz 7% -draw 'matte 1,1 floodfill' -shave 1x1 \ - $OUTPUT_DIR/removed_black.png - - # create the matte - convert $OUTPUT_DIR/removed_black.png -channel matte -negate -separate +matte \ - $OUTPUT_DIR/matte.png - - # negate the colors - convert $OUTPUT_DIR/matte.png -negate -blur 0x1 \ - $OUTPUT_DIR/matte-negated.png - - # you are going for: white interior, black exterior - composite -compose CopyOpacity $OUTPUT_DIR/matte-negated.png $OUTPUT_DIR/resize.png \ - $dst - - # New size - # identify -format "%wx%h" $dst - hight=`${CMD_identify} -format "%h" $dst` - wight=`${CMD_identify} -format "%w" $dst` - log_debug "Opsi Icon Wight: $wight Hight: $hight" - + # Its scare so force 160x160 + log_debug "Icon Wight: $wight = Hight: $hight" + convert $src -colorspace RGB -resize 160x160 \ + -size 160x160 xc:white +swap -gravity center -composite \ + -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png + builder_check_error "converting image" + else + # Imagemagic is unable to detect the aspect ratio so just force 160x160 + # this could result in streched images + log_debug "Icon Wight: $wight unknown Hight: $hight" + convert $src -colorspace RGB -resize 160x160 \ + -size 160x160 xc:white +swap -gravity center -composite \ + -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png + builder_check_error "converting image" + fi + + # create a diffence image from the source + convert $OUTPUT_DIR/resize.png \( +clone -fx 'p{0,0}' \) -compose Difference -composite \ + -modulate 100,0 +matte $OUTPUT_DIR/difference.png + + # remove the black, replace with transparency + convert $OUTPUT_DIR/difference.png -bordercolor white -border 1x1 -matte \ + -fill none -fuzz 7% -draw 'matte 1,1 floodfill' -shave 1x1 \ + $OUTPUT_DIR/removed_black.png + + # create the matte + convert $OUTPUT_DIR/removed_black.png -channel matte -negate -separate +matte \ + $OUTPUT_DIR/matte.png + + # negate the colors + convert $OUTPUT_DIR/matte.png -negate -blur 0x1 \ + $OUTPUT_DIR/matte-negated.png + + # you are going for: white interior, black exterior + composite -compose CopyOpacity $OUTPUT_DIR/matte-negated.png $OUTPUT_DIR/resize.png \ + $dst + + # New size + # identify -format "%wx%h" $dst + hight=`${CMD_identify} -format "%h" $dst` + wight=`${CMD_identify} -format "%w" $dst` + log_debug "Opsi Icon Wight: $wight Hight: $hight" + } ################### # Create variable file # -# Create a file containing all important winst variables +# Create a file containing all important winst variables # (declaration and setings) -# +# # Parameter # file: file to create # ################### create_winst_varfile() { - local var_file=$1 - - echo -n >$var_file - for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do - if [ -z ${DL_WINST_NAME[$i]} ] ; then continue ; fi - - if [ ! -z "${DL_ARCH[$i]}" ] ; then arch_str="${DL_ARCH[$i]}\\" ; fi - echo "DefVar \$${DL_WINST_NAME[$i]}\$" >>$var_file - echo "Set \$${DL_WINST_NAME[$i]}\$ = \"%ScriptPath%\\${arch_str}${DL_FILE[$i]}\"" >>$var_file - done - - # publish some other variables - for var in VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE CREATOR_TAG CREATOR_NAME CREATOR_EMAIL ; do - echo "DefVar \$${var}\$" >>$var_file - echo "Set \$${var}\$ = \"${!var}\"" >>$var_file - done - - # copy image and create variable - echo "DefVar \$IconFile\$" >>$var_file - echo "Set \$IconFile\$ = \"%ScriptPath%\\`basename $ICONFILE`\"" >>$var_file - - # publish custom variables - for (( i = 0 ; i < ${#WINST_NAME[@]} ; i++ )) ; do - - # replace DL_EXTRACT_WINST_PATH - local index=`echo ${WINST_VALUE[$i]} | sed -e "s#.*@DL_EXTRACT_WINST_PATH\[\([0-9]\)\]@.*#\1#"` - log_debug "calculated (DL_EXTRACT_WINST_PATH), Index: $index" - if [ "$index" != "${WINST_VALUE[$i]}" ] ; then - if [ ! -z "${DL_ARCH[$index]}" ] ; then arch_part="\\\\${DL_ARCH[$index]}" ; fi - if [ ! -z "${DL_EXTRACT_WINST_PATH[$index]}" ] ; then extr_part="\\\\${DL_EXTRACT_WINST_PATH[$index]}" ; fi - local new_val="%ScriptPath%$arch_part$extr_part" - WINST_VALUE[$i]=`echo ${WINST_VALUE[$i]} | sed -e "s#@DL_EXTRACT_WINST_PATH\[[0-9]\]@#$new_val#"` - log_debug "calculated (DL_EXTRACT_WINST_PATH) WINST_VALUE: ${WINST_VALUE[$i]}" - fi - - echo "DefVar \$${WINST_NAME[$i]}\$" >>$var_file - echo "Set \$${WINST_NAME[$i]}\$ = \"${WINST_VALUE[$i]}\"" >>$var_file - done - - echo >>$var_file + local var_file=$1 + + echo -n >$var_file + for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do + if [ -z ${DL_WINST_NAME[$i]} ] ; then continue ; fi + + if [ ! -z "${DL_ARCH[$i]}" ] ; then arch_str="${DL_ARCH[$i]}\\" ; fi + echo "DefVar \$${DL_WINST_NAME[$i]}\$" >>$var_file + echo "Set \$${DL_WINST_NAME[$i]}\$ = \"%ScriptPath%\\${arch_str}${DL_FILE[$i]}\"" >>$var_file + done + + # publish some other variables + for var in VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE CREATOR_TAG CREATOR_NAME CREATOR_EMAIL ; do + echo "DefVar \$${var}\$" >>$var_file + echo "Set \$${var}\$ = \"${!var}\"" >>$var_file + done + + # copy image and create variable + echo "DefVar \$IconFile\$" >>$var_file + echo "Set \$IconFile\$ = \"%ScriptPath%\\`basename $ICONFILE`\"" >>$var_file + + # publish custom variables + for (( i = 0 ; i < ${#WINST_NAME[@]} ; i++ )) ; do + + # replace DL_EXTRACT_WINST_PATH + local index=`echo ${WINST_VALUE[$i]} | sed -e "s#.*@DL_EXTRACT_WINST_PATH\[\([0-9]\)\]@.*#\1#"` + log_debug "calculated (DL_EXTRACT_WINST_PATH), Index: $index" + if [ "$index" != "${WINST_VALUE[$i]}" ] ; then + if [ ! -z "${DL_ARCH[$index]}" ] ; then arch_part="\\\\${DL_ARCH[$index]}" ; fi + if [ ! -z "${DL_EXTRACT_WINST_PATH[$index]}" ] ; then extr_part="\\\\${DL_EXTRACT_WINST_PATH[$index]}" ; fi + local new_val="%ScriptPath%$arch_part$extr_part" + WINST_VALUE[$i]=`echo ${WINST_VALUE[$i]} | sed -e "s#@DL_EXTRACT_WINST_PATH\[[0-9]\]@#$new_val#"` + log_debug "calculated (DL_EXTRACT_WINST_PATH) WINST_VALUE: ${WINST_VALUE[$i]}" + fi + + echo "DefVar \$${WINST_NAME[$i]}\$" >>$var_file + echo "Set \$${WINST_NAME[$i]}\$ = \"${WINST_VALUE[$i]}\"" >>$var_file + done + + echo >>$var_file } ##################### -# void calc_release() +# void calc_release() # # Description: # Calculate new release based on # the latest one found in the repository. -# +# # $RELEASE is set to the calculated release. -# +# #################### function calc_release() { - - # Find all revision files and sort them - local file_list=`mktemp /tmp/opsi-builder.calc_release.XXXXXXXXXXX` - for cfg_file in `find ${OPSI_REPOS_BASE_DIR} -name "${PN}-${VERSION}-${CREATOR_TAG}*.cfg" -print ` ; do - . ${cfg_file} - printf "%08d;$cfg_file\n" $REV_RELEASE >> ${file_list} - done - local oldest_cfg=`sort -n ${file_list} | cut -f 2 -d ";" | tail -1` - rm -f ${file_list} - - if [ ! -f "${oldest_cfg}" ] ; then - echo "Warning: no cfg-file found for this product. RELEASE will be set to 1" - RELEASE=1 - else - log_debug "calc_release() oldest_cfg: ${oldest_cfg}" - . ${oldest_cfg} - log_debug " latest release: $REV_RELEASE" - RELEASE=`expr ${REV_RELEASE} + 1 2> /dev/null` - builder_check_error "Cannot incrememnt REV_RELEASE from file ${oldest_cfg}" - fi + + # Find all revision files and sort them + local file_list=`mktemp /tmp/opsi-builder.calc_release.XXXXXXXXXXX` + for cfg_file in `find ${OPSI_REPOS_BASE_DIR} -name "${PN}-${VERSION}-${CREATOR_TAG}*.cfg" -print ` ; do + . ${cfg_file} + printf "%08d;$cfg_file\n" $REV_RELEASE >> ${file_list} + done + local oldest_cfg=`sort -n ${file_list} | cut -f 2 -d ";" | tail -1` + rm -f ${file_list} + + if [ ! -f "${oldest_cfg}" ] ; then + echo "Warning: no cfg-file found for this product. RELEASE will be set to 1" + RELEASE=1 + else + log_debug "calc_release() oldest_cfg: ${oldest_cfg}" + . ${oldest_cfg} + log_debug " latest release: $REV_RELEASE" + RELEASE=`expr ${REV_RELEASE} + 1 2> /dev/null` + builder_check_error "Cannot incrememnt REV_RELEASE from file ${oldest_cfg}" + fi } + +################### +# Write Package Ini file +# +# Create a ini file containing needed information for package uninstall +# +# Parameter +# file: file to create / modify +# +################### +write_ini_file() { + local ini_file=$1 + + # publish some other variables + for var in VENDOR PN VERSION RELEASE TYPE CREATOR_TAG CREATOR_NAME CREATOR_EMAIL ; do + $CMD_iniset $ini_file --COMMON ${var}="${!var}" + done + + # publish custom variables + for (( i = 0 ; i < ${#OPSI_INI_NAME[@]} ; i++ )) ; do + $CMD_iniset $ini_file --${OPSI_INI_SECTION[$i]} ${OPSI_INI_NAME[$i]}="${OPSI_INI_VALUE[$i]}" + done +} +