Files
pkgscripts-ng/include/check
2020-09-18 09:05:10 +00:00

447 lines
8.5 KiB
Bash

#!/bin/bash
# Copyright (c) 2000-2020 Synology Inc. All rights reserved.
if [ -z "$__INCLUDE_CHECK__" ]; then
__INCLUDE_CHECK__=defined
. "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"/init
Source include/variable
Source include/virtualProject
Source include/config
Source include/platforms
GetProjectPath() {
local project="$1"
if [ "$(basename "$SynoBase")" = "ds.base" ]; then
echo "$SourceDir/$(GetVirtualProjectName "$(GetVirInstProjectName "$project")")"
else
echo "$SourceDir/$(GetVirInstProjectName "$project")"
fi
}
CheckScript() {
local projName="$1"
local type=$2
local findScript=
local virtualName=$(GetVirtualProjectExtension $projName)
local projPath="$(GetProjectPath "$projName")"
if [ -f "$projPath/$ConfDir/$type$virtualName" ]; then
findScript="$projPath/$ConfDir/$type$virtualName"
fi
echo $findScript
return 0
}
FindScript() {
local projName=$1
local type=$2
local script=
script="$(CheckScript "$projName" "$type")"
if [ -n "$script" ]; then
echo "$script"
return 0
else
return 1
fi
}
findBuildScript() {
local projName=$1
FindScript "$projName" "build"
}
findBuildFlagsScript() {
local projName=$1
FindScript "$projName" "buildflags"
}
findInstallDevScript() {
local projName=$1
FindScript "$projName" "install-dev"
}
findInstallScript() {
local projName=$1
FindScript "$projName" "install"
}
findDependConf() {
local projName="$1"
FindScript "$projName" "depends"
}
FindConflictConf() {
local projName="$1"
FindScript "$projName" "conflict"
}
findErrorScript() {
local projName=$1
FindScript "$projName" "error"
}
CheckPermission()
{
# Only root can run this
id | grep "uid=0" >/dev/null
if [ $? != "0" ]; then
echo "ERROR: This script must be run as root";
echo "";
exit 1;
fi
# Stop!! If /root/.chroot does not exit
if [ ! -f /root/.chroot ]; then
echo "ERROR: Please chroot first!!"
echo ""
exit 1;
fi
}
# $1: target to find, else: list to search
CheckInList() {
[ $# -lt 1 ] && CheckErrorOut 1 "Wrong number of parameters to $FUNCNAME()."
local target="$1" proj=
shift
for proj in $@; do
[ $proj = $target ] && return 0
done
return 1
}
CheckProjectStatus() {
$ScriptsDir/include/errors.py $1 $2
}
CheckErrorLog()
{
local errors
local warns
local logFile
local warnCount blocked blockedList
local allProjCount=0
local errProjCount=0
local warnProjCount=0
local blockProjCount=0
local ret=
local logType=$1
shift
local projectList=$@
local errorFile="${LogDir}/error.$logType"
if [ -r "$errorFile" ]; then
mv -f $errorFile ${errorFile}.old
fi
for proj in $projectList; do
logFile="${LogDir}/${proj}.$logType"
result=$(CheckProjectStatus $logType $proj)
ret=$?
if [ $ret -eq 1 ]; then
echo "Result file $logFile doesn't exist or isn't readable." 2>&1 | tee -a $errorFile
echo "Cannot check any information about compiling error(s)."
echo ""
errors="Y"
else
if [ $ret -ne 0 ]; then
echo "I got the following error:" >> $logFile
echo -e "$result" >> $logFile
echo "########################################################"
echo " Error(s) occurred on project \"$proj\"" 2>&1 | tee -a $errorFile
echo "########################################################"
errors="Y"
errProjCount=$(( $errProjCount + 1 ))
fi
if [ "$1" = "build" ]; then
warnCount=`grep -s "warning:" $logFile | wc -l`
if [ 0 -ne $warnCount ]; then
printf "%-40s:\t%4d warning(s)\n" $proj $warnCount
warns="Y"
warnProjCount=$(( $warnProjCount + 1 ))
fi
fi
blocked="$(grep -s "^\[Blocked\]" $logFile)"
if [ -n "$blocked" ]; then
blockedList="$blockedList $proj"
blockProjCount=$(( $blockProjCount + 1 ))
fi
fi
allProjCount=$(( $allProjCount + 1 ))
done
[ -n "$blockedList" ] && echo -e "\nBlocked projects:$blockedList\n"
echo -n "$allProjCount projects, $errProjCount failed"
if [ "$1" = "build" ]; then
echo -n ", $warnProjCount have warnings"
fi
echo ", $blockProjCount blocked."
echo ""
if [ "$errors" = "Y" ]; then
ERROR "Check [${errorFile}] for fixing errors."
return 1
fi
return 0
}
# check error code, if error code != 0, print message and exit
# Usages:
# CheckErrorOut ErrorCode Message
CheckErrorOut()
{
if [ $1 != 0 ]; then
echo "$2" >&2;
exit $1;
fi
}
INFO(){
local std_dest
[ "$ShowDebug" = "yes" ] && std_dest=">&3"
if [ $# -lt 2 ]; then
eval echo -e "[INFO] $1" $std_dest
else
if [ -z "$1" ]; then
eval echo -e "[INFO] $2" "$std_dest"
else
eval echo -e "[$1] $2" "$std_dest"
fi
fi
}
ERROR(){
if [ $# -lt 2 ]; then
echo -e "[Error] $1" >&2
else
if [ -z "$1" ]; then
echo -e "[Error] $2" >&2
else
echo -e "[$1] $2" >&2
fi
fi
}
WARNING()
{
echo -e "\033[93m[WARNING] $1\033[0m" >&2
}
ShowTimeCost()
{
TAG_INTERNAL=""
#echo $*
if [ -n "$3" ]; then
TAG_INTERNAL="[$3]"
fi
D_INT0=$1
D_INT1=$2
DIFF_INT=$((${D_INT1}-${D_INT0}))
DIFF_SEC=$((${DIFF_INT}%60))
DIFF_MIN=$(((${DIFF_INT}/60)%60))
DIFF_HOUR=$(((${DIFF_INT}/3600)%60))
printf "Time cost: %02d:%02d:%02d %s\n" ${DIFF_HOUR} ${DIFF_MIN} ${DIFF_SEC} "${TAG_INTERNAL}"
}
CheckTimeCostLog()
{
local logType=$1
shift
local projectList=$@
local logFile=
local result=
echo -e "\n----------------- Time cost statistics -----------------"
for proj in $projectList;
do
logFile="${LogDir}/${proj}.$logType"
if [ -r "$logFile" ]; then
#echo "file: ${logFile}"
result=`grep "Time cost:" $logFile`
[ -n "$result" ] && echo "$result"
fi
done
echo ""
}
GetBaseDirs()
{
# by default, the BASEDIR should be /synosrc or /synosrc.xxx
# get dir path of scripts for following inclusion of other scripts
CurDir=`pwd`
BASEDIR=`dirname $1`
BASEDIR=`dirname ${BASEDIR}`
#echo "file: $0"
#echo "CurDir: ${CurDir}"
#echo "ScriptDir: ${ScriptsDir}"
echo "BASEDIR: ${BASEDIR}"
}
# FIXME for test
Debug()
{
return 0
[ $# -ne 2 ] && return 0
echo -e "\033[$1m$2\033[0m"
}
_get_key_value()
{
local key="$1"
local file="$2"
local val=
if [ -z "$key" -o ! -f "$file" ]; then
echo "Error: _get_key_value failed. key is empty or file not found."
return 1
fi
val="$(grep "^$key=" "$file" | cut -d'"' -f2)"
echo "$val"
}
GetDSMCriticalUpdateNumber() {
_get_key_value "smallfixnumber" "$VERSION_FILE"
}
GetDSMBuildNumber() {
_get_key_value "buildnumber" "$VERSION_FILE"
}
GetDSMPacking() {
_get_key_value "packing" "$VERSION_FILE"
}
GetDSMPackingID() {
_get_key_value "packing_id" "$VERSION_FILE"
}
GetDSMMajorNumber()
{
_get_key_value "majorversion" "$VERSION_FILE"
}
GetDSMMinorNumber()
{
_get_key_value "minorversion" "$VERSION_FILE"
}
GetSmallFixNumber()
{
_get_key_value "smallfixnumber" "$VERSION_FILE"
}
GetProductVersion()
{
_get_key_value "productversion" "$VERSION_FILE"
}
GetBuildTime()
{
_get_key_value "buildtime" "$VERSION_FILE"
}
GetBuildDate()
{
_get_key_value "builddate" "$VERSION_FILE"
}
Is64BitProject() {
local Proj=$1
local ProjExt=
if [ "$DefaultBuild32Bit" = "yes" ]; then
ProjExt=`GetVirtualProjectExtension $Proj`
HasSubStr "$ProjExt" "64$"
return
fi
Is32BitProject $Proj && return 1
return 0
}
Is32BitProject() { #{{{
local ProjExt=""
local Proj="$1"
if ! Is64BitPlatform; then
return 0
fi
ProjExt=`GetVirtualProjectExtension $Proj`
HasSubStr "$ProjExt" "32$"
} #}}}
getPlatformExcludeProjs() {
local platformExcludeProj=
if [ "$DefaultBuild32Bit" = "yes" ]; then
platformExcludeProj=".*-virtual-64$"
else
platformExcludeProj=".*-virtual-32$"
fi
if ! Is64BitPlatform; then
echo $platformExcludeProj
return
fi
return
}
ExcludeList() {
local list="$1"
local excludeList="$2"
if [ -z "${excludeList}" ]; then
echo $list
return 0
fi
local excludeArgument="^(`echo $excludeList | sed 's/ /|/g'`)\$"
echo $list | sed 's/ /\n/g' | grep -vE "${excludeArgument}"
return 0
}
SetupDSMBuildNumber() {
unset DSM_BUILD_NUM DSM_SHLIB_MAJOR DSM_SHLIB_MINOR SMALLFIX_NUM DSM_STAGE PRODUCT_VERSION PACKING PACKING_ID
local file=${1:-$VERSION_FILE}
DSM_BUILD_NUM=$(GetDSMBuildNumber "$file")
DSM_SHLIB_MAJOR=$(GetDSMMajorNumber "$file")
DSM_SHLIB_MINOR=$(GetDSMMinorNumber "$file")
SMALLFIX_NUM=$(GetSmallFixNumber "$file")
PRODUCT_VERSION=$(GetProductVersion "$file")
PACKING=$(GetDSMPacking "$file")
PACKING_ID=$(GetDSMPackingID "$file")
if [ $? -ne 0 ]; then
ERROR "cannot get build stage"
exit 1
fi
if [ -z "$DSM_BUILD_NUM" ]; then
DSM_BUILD_NUM=`date "+%Y%m%d"`
fi
[ -z "$DSM_SHLIB_MAJOR" ] && DSM_SHLIB_MAJOR=0
[ -z "$DSM_SHLIB_MINOR" ] && DSM_SHLIB_MINOR=0
export DSM_BUILD_NUM DSM_SHLIB_MAJOR DSM_SHLIB_MINOR SMALLFIX_NUM PRODUCT_VERSION PACKING PACKING_ID
}
fi
# vim:ft=sh