#!/bin/bash # Copyright 2010-2012, Asio Software Technologies # Distributed under the terms of the GNU General Public License v3 #------------------------------------------------------------------------------- # Checks if system running EzBuild meets its requirements #------------------------------------------------------------------------------- function checkPrerequisites() { if [ "$(uname -s)" != "Linux" ]; then printError "You are trying to launch ${EZNAME} on non-Linux system!" return 1 fi if [ "${EUID}" != "0" ] && [ "${USER}" != "root" ]; then printError "The ${EZNAME} needs to be launched from root account!" return 1 fi if [ ! -e /dev/null ]; then printError "The /dev directory seems to be not mounted!" return 1 fi if [ ! -e /proc/mounts ]; then printError "The /proc directory seems to be not mounted!" return 1 fi ping -c 1 google.com &> /dev/null if [ ${?} -ne 0 ]; then printError "There seems to be no Internet conectivity!" return 1 fi return 0 } #------------------------------------------------------------------------------- # Tests for a minimum version level by comparing version numbers # Parameters: %min_version% %test_version% #------------------------------------------------------------------------------- function checkVersion() { local BEST REF TST REF=$(echo "${1}" | \ sed -u -e "s/-r/_z/g" -e "s/_p/_z/g" -e "s/_zre/_pre/" -e "s/$/_z0/") TST=$(echo "${2}" | \ sed -u -e "s/-r/_z/g" -e "s/_p/_z/g" -e "s/_zre/_pre/" -e "s/$/_z0/") BEST=$(echo -e "${REF}\n${TST}" | sed "/^$/d" | sort -Vr | head -1) [[ "${BEST}" = "${TST}" ]] && return 0 return 1 } #------------------------------------------------------------------------------- # Outputs formatted error message and aborts script execution with given code # Parameters: %message% %code% #------------------------------------------------------------------------------- function die() { if isEnabled ${LOGGING} && isSet NOTIFY && isEnabled ${EZNOTIFY}; then local LOGS="Full output from logs:\n\n$(cat ${LOGFILE})" local MESG="The ${EZNAME} has failed with code: ${2} and message: ${1}" local TOPIC="The ${EZNAME} process has failed!" echo -e "${MESG}\n${LOGS}" | mailx -s "${TOPIC}" "${NOTIFY}" fi printError "${1}" echo -ne "\n" exit ${2} } #------------------------------------------------------------------------------- # Checks whether a defined variable contain specified element or not # Parameters: %element% %variable% #------------------------------------------------------------------------------- function hasElement() { local NEEDLE=${1} shift local X for X in "${@}"; do [ "${X}" = "${NEEDLE}" ] && return 0 done return 1 } #------------------------------------------------------------------------------- # Checks whether a supplied variable is defined or not # Parameters: %variable% #------------------------------------------------------------------------------- function isDefined() { [[ ${!1-X} == ${!1-Y} ]] } #------------------------------------------------------------------------------- # Checks whether a supplied variable is enabled or not # Parameters: %variable% #------------------------------------------------------------------------------- function isEnabled() { case "${1}" in [Ee][Nn][Aa][Bb][Ll][Ee][Dd]) return 0 ;; [Tt][Rr][Uu][Ee]) return 0 ;; [Yy][Ee][Ss]) return 0 ;; 1) return 0 ;; esac return 1 } #------------------------------------------------------------------------------- # Checks whether a variable is defined and if value's length > 0 # Parameters: %variable% #------------------------------------------------------------------------------- function isSet() { if isDefined ${1}; then if [[ -n ${!1} ]]; then return 0 fi fi return 1 } #------------------------------------------------------------------------------- # Loads EzBuild configuration #------------------------------------------------------------------------------- function loadConfiguration() { source ${EZROOT}/config/common.conf &> /dev/null || panic source ${EZROOT}/config/${EZNAME}.conf &> /dev/null || panic source ${EZROOT}/config/layout.conf &> /dev/null || panic source /etc/ezbuild/common.conf &> /dev/null || panic source /etc/ezbuild/${EZNAME}.conf &> /dev/null || panic source /etc/ezbuild/layout.conf &> /dev/null || panic } #------------------------------------------------------------------------------- # Loads all EzBuild Libraries #------------------------------------------------------------------------------- function loadLibraries() { source ${EZROOT}/libraries/constants &> /dev/null || panic source ${EZROOT}/libraries/filesystem &> /dev/null || panic source ${EZROOT}/libraries/repositories &> /dev/null || panic } #------------------------------------------------------------------------------- # Saves specified message into a log file # Parameters: %message% [%level%] #------------------------------------------------------------------------------- function logMessage() { local DATE MESSAGE TYPE if isEnabled ${LOGGING}; then MESSAGE="${1}" TYPE="${2}" DATE=$(date +"${LOGDATEFORMAT}") if [ -z ${TYPE} ]; then TYPE=" - " fi { echo -e "[${DATE}][${TYPE}] ${MESSAGE}" >> ${LOGFILE}; } 2> /dev/null fi } #------------------------------------------------------------------------------- # Saves executed command multiline output into a log file # Parameters: %command_output% #------------------------------------------------------------------------------- function logOutput() { if isEnabled ${LOGGING}; then if [ -z "${@}" ]; then echo -e " )> (NO OUTPUT)" >> ${LOGFILE} else echo -e "${@}" | awk '{ print " )> ", $0; }' >> ${LOGFILE} fi fi } #------------------------------------------------------------------------------- # Outputs error message and aborts program execution #------------------------------------------------------------------------------- function panic() { echo -e "FATAL ERROR: Unable to load necessary files!" echo -e "Your EzBuild installation seems to be broken..." exit 1 } #------------------------------------------------------------------------------- # Outputs formatted error message to both display and log file # Parameters: %message% #------------------------------------------------------------------------------- function printError() { logMessage "${1}" "ERROR" echo -e " ${MESSAGE_ERROR} ${@}" } #------------------------------------------------------------------------------- # Outputs formatted information to both display and log file # Parameters: %message% #------------------------------------------------------------------------------- function printInfo() { logMessage "${1}" "INFO" echo -e " ${MESSAGE_INFO} ${@}" } #------------------------------------------------------------------------------- # Outputs formatted information about EzBuild version and copyrights #------------------------------------------------------------------------------- function printNotice() { echo -e "\n${COLOR_BOLD}EzBuild v${EZVERSION} (${EZNAME} launched)" echo -e "${EZCOPYRIGHT}${COLOR_NORMAL}" echo -e "${BORDER_STAR}\n" } #------------------------------------------------------------------------------- # Outputs formatted warning to both display and log file # Parameters: %message% #------------------------------------------------------------------------------- function printWarn() { logMessage "${1}" "WARN" echo -e " ${MESSAGE_WARN} ${@}" } function quit() { echo -e "${COLOR_BOLD}ALL DONE!\n${COLOR_NORMAL}" exit 0 } #------------------------------------------------------------------------------- # Restores original Internal Field Separator (IFS) #------------------------------------------------------------------------------- function restoreIFS() { if [ "${ORGIFS:-unset}" != "unset" ]; then IFS="${ORGIFS}" unset ORGIFS else unset IFS fi } #------------------------------------------------------------------------------- # Silently executes given command and saves its output to log file if enabled # Parameters: %command% #------------------------------------------------------------------------------- function run() { local COMMAND OUTPUT RESULT COMMAND="${@}" logMessage "Executing: \"${COMMAND}\"" "DEBUG" OUTPUT=$(${COMMAND} 2>&1) RESULT=${?} logOutput "${OUTPUT}" return ${RESULT} } #------------------------------------------------------------------------------- # Saves original Internal Field Separator (IFS) and optionally sets new value # Parameters: %new_ifs% #------------------------------------------------------------------------------- function saveIFS() { local NEWIFS if [ "${IFS:-unset}" != "unset" ]; then ORGIFS="${IFS}" fi NEWIFS="${1}" if isSet NEWIFS; then IFS="${NEWIFS}" fi } #------------------------------------------------------------------------------- # Prints EzSync usage information #------------------------------------------------------------------------------- function showEzsyncUsage() { echo -e "\tEzSync is a part of EzBuild release building metatool used by" echo -e "\treGen2 Linux for synchronizing Portage Tree with mainline.\n" echo -e "USAGE: ezsync [parameters]" echo -e " -c\t--cleanlog\tclears log file; not working with -p and -P" echo -e " -h\t--help\t\tdisplays this screen and exits immediately" echo -e " -n\t--nosync\tspecifies the ebuilds source that will be omitted" echo -e " -p\t--purge\t\tclears temporary folder" echo -e " -P\t--purgeonly\tclears temporary folder and exits" echo -e " -s\t--syscheck\tperforms prerequisites check only" echo -e "\nEXAMPLES:" echo -e " ezsync -c -n mainline" echo -e " ezsync -n mainline -n my_repo1" echo -e "\n" exit 0 } #------------------------------------------------------------------------------- # Returns a UNIX timestamp #------------------------------------------------------------------------------- function timestamp() { echo $(date +%s) } #------------------------------------------------------------------------------- # Returns lowercase string # Parameters: %string% #------------------------------------------------------------------------------- function toLower() { echo "${@}" | tr '[:upper:]' '[:lower:]' } #------------------------------------------------------------------------------- # Returns uppercase string # Parameters: %string% #------------------------------------------------------------------------------- function toUpper() { echo "${@}" | tr '[:lower:]' '[:upper:]' } #------------------------------------------------------------------------------- # Returns only the first part of a string, delimited by tabs or spaces # Parameters: %string% #------------------------------------------------------------------------------- function trim() { echo ${1} }