359 lines
10 KiB
Bash
359 lines
10 KiB
Bash
#############################################
|
|
# 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
|
|
# dst: path to store file to
|
|
#
|
|
#############################################
|
|
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"
|
|
elif [[ $src == file://* ]]; then
|
|
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
|
|
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
|
|
# dst: path to extract the 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
|
|
elif [ "$format" = "7zip" ]; then
|
|
$CMD_7z x -y -o$dst $src
|
|
elif [ "$format" = "unzip" ]; then
|
|
$CMD_unzip -o $src -d $dst
|
|
elif [ "$format" = "unrar" ]; then
|
|
$CMD_unrar xy $src $dst
|
|
elif [ "$format" = "lha" ]; then
|
|
$CMD_lha x -w=$dst $src
|
|
elif [ "$format" = "targz" ]; then
|
|
$CMD_tar xzvf $src -C $dst
|
|
elif [ "$format" = "tarbz2" ]; then
|
|
$CMD_tar xjvf $src -C $dst
|
|
elif [ "$format" = "cab" ]; then
|
|
$CMD_cabextract -d $dst $src
|
|
else
|
|
fatal_error "Unknown compression format: $format"
|
|
fi
|
|
}
|
|
|
|
|
|
#############################################
|
|
# 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
|
|
|
|
}
|
|
|
|
###################
|
|
# Fata Error
|
|
###################
|
|
fatal_error() {
|
|
echo "FATAL: $1"
|
|
exit 1
|
|
}
|
|
|
|
###################
|
|
# Check error
|
|
###################
|
|
builder_check_error() {
|
|
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
|
|
}
|
|
|
|
###################
|
|
# Logging Info
|
|
###################
|
|
log_info() {
|
|
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"
|
|
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"
|
|
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
|
|
if [ `convert | grep Version | awk '{print $3}' | sed "s/-.*//" | sed "s/\.//g"` -le 670 ] ; then
|
|
convert $OUTPUT_DIR/removed_black.png -channel matte -separate +matte \
|
|
$OUTPUT_DIR/matte.png
|
|
else
|
|
convert $OUTPUT_DIR/removed_black.png -channel matte -negate -separate +matte \
|
|
$OUTPUT_DIR/matte.png
|
|
fi
|
|
|
|
# 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
|
|
# (declaration and setings)
|
|
#
|
|
# Parameter
|
|
# file: file to create
|
|
#
|
|
###################
|
|
create_winst_varfile() {
|
|
local var_file=$1
|
|
|
|
echo -n >$var_file
|
|
echo "; Opsi Builder Variables" >>$var_file
|
|
echo >>$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 NAME 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()
|
|
#
|
|
# 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
|
|
}
|
|
|
|
###################
|
|
# 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
|
|
local var_file=$2
|
|
|
|
# create file if not exist
|
|
touch $ini_file
|
|
|
|
# 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
|
|
|
|
echo "; Opsi INI File Variables" >>$var_file
|
|
echo >>$var_file
|
|
# publish custom variables
|
|
for (( i = 0 ; i < ${#OPSI_INI_OPTION[@]} ; i++ )) ; do
|
|
$CMD_iniset $ini_file --${OPSI_INI_SECTION[$i]} ${OPSI_INI_OPTION[$i]}="${OPSI_INI_VALUE[$i]}"
|
|
echo "DefVar \$${OPSI_INI_OPTION[$i]}\$" >>$var_file
|
|
echo "Set \$${OPSI_INI_OPTION[$i]}\$ = \"${OPSI_INI_VALUE[$i]}\"" >>$var_file
|
|
done
|
|
|
|
echo >>$var_file
|
|
}
|
|
|
|
###################
|
|
# Write control file
|
|
#
|
|
# Create a ini file containing needed information for package uninstall
|
|
#
|
|
# Parameter
|
|
# file: file to create / modify
|
|
#
|
|
###################
|
|
write_control_file() {
|
|
local control_file=$1
|
|
local control_section=$2
|
|
local control_option=$3
|
|
local control_value=$4
|
|
|
|
sed -i -e "/^\[$control_section\]/,/^\[.*\]/ s|^\($control_option[ \t]*:[ \t]*\).*$|\1$control_value|" "$control_file"
|
|
}
|
|
|