diff options
Diffstat (limited to 'build_tools/download_externals')
-rwxr-xr-x | build_tools/download_externals | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/build_tools/download_externals b/build_tools/download_externals new file mode 100755 index 000000000..8d5872df7 --- /dev/null +++ b/build_tools/download_externals @@ -0,0 +1,180 @@ +#!/usr/bin/env bash + +if [[ ( ${BASH_VERSINFO[0]} == 4 && ${BASH_VERSINFO[1]} > 1 ) || ${BASH_VERSINFO[0]} > 4 ]] ; then + shopt -s compat41 +fi +set -e + +ASTTOPDIR=${ASTTOPDIR:-.} + +module_name=$1 + +if [[ -z ${module_name} ]] ; then + echo "You must supply a module name." + exit 64 +fi + +tmpdir=$(mktemp -d) +if [[ -z "${tmpdir}" ]] ; then + echo "${module_name}: Unable to create temporary directory." + exit 1 +fi +trap "rm -rf ${tmpdir}" EXIT + +sed -r -e "s/^([^ =]+)\s*=\s*(.*)$/\1=\"\2\"/g" ${ASTTOPDIR}/makeopts >${tmpdir}/makeopts +source ${tmpdir}/makeopts +if [[ -z "${ASTMODDIR}" ]] ; then + echo "${module_name}: Unable to parse ${ASTTOPDIR}/makeopts." + exit 1 +fi + +XMLSTARLET=${XMLSTARLET:-xmlstarlet} +if [[ "${XMLSTARLET}" = ":" ]] ; then + echo "${module_name}: The externals downloader requires xmlstarlet to be installed." + exit 1 +fi + +cache_dir="${EXTERNALS_CACHE_DIR}" +if [[ -z ${cache_dir} ]] ; then + cache_dir=${tmpdir} +fi + +version=$(${ASTTOPDIR}/build_tools/make_version ${ASTTOPDIR}) +if [[ ! ${version} =~ ^(GIT-)?([^.-]+)[.-].* ]] ; then + echo "${module_name}: Couldn't parse version ${version}" + exit 1 +fi +major_version=${BASH_REMATCH[2]} + +if [[ "${major_version}" == "master" ]] ; then + echo "${module_name}: External module downloading is not available in the 'master' git branch. Please disable in menuselect and download manually." + exit 1 +fi + +major_version=${major_version}.0 + +if [[ "${HOST_CPU}" = "x86_64" ]] ; then + host_bits=64 +else + host_bits=32 +fi + +remote_url=$(${XMLSTARLET} sel -t -v "/menu/category/member[@name = '${module_name}']/member_data/downloader/@remote_url" ${ASTTOPDIR}/menuselect-tree || :) +if [[ -n "${remote_url}" ]] ; then + remote_url="${remote_url}/asterisk-${major_version}/x86-${host_bits}" +else + directory_name=$(${XMLSTARLET} sel -t -v "/menu/category/member[@name = '${module_name}']/member_data/downloader/@directory_name" ${ASTTOPDIR}/menuselect-tree || :) + remote_url="http://downloads.digium.com/pub/telephony/${directory_name:-${module_name}}/asterisk-${major_version}/x86-${host_bits}" +fi + +version_convert() { + local v=${1##*_} + if [[ ${v} =~ ([0-9]+)[.]([0-9]+)[.]([0-9]+) ]] ; then + v=$(( ${BASH_REMATCH[1]}<<18 | ${BASH_REMATCH[2]}<<9 | ${BASH_REMATCH[3]} )) + fi + echo ${v} +} + +${WGET} -q -O ${tmpdir}/manifest.xml ${remote_url}/manifest.xml || { + echo "${module_name}: Unable to fetch ${remote_url}/manifest.xml" + exit 1 +} + +rpv=$(${XMLSTARLET} sel -t -v "/package/@version" ${tmpdir}/manifest.xml) +rpvi=$(version_convert ${rpv}) +echo "${module_name}: Remote package version ${rpv} (${rpvi})" + +module_dir=${module_name}-${rpv}-x86_${host_bits} +tarball=${module_dir}.tar.gz +export need_install=0 + +if [[ -f ${DESTDIR}${ASTMODDIR}/${module_name}.manifest.xml ]] ; then + package_arch=$(${XMLSTARLET} sel -t -v "/package/@arch" ${DESTDIR}${ASTMODDIR}/${module_name}.manifest.xml) + ipv=$(${XMLSTARLET} sel -t -v "/package/@version" ${DESTDIR}${ASTMODDIR}/${module_name}.manifest.xml) + ipvi=$(version_convert ${ipv}) + ip_major=${ipv%_*} + echo "${module_name}: Installed package version ${ipv} (${ipvi})" + if [[ "${ip_major}" != "${major_version}" || "${package_arch}" != "x86_${host_bits}" ]] ; then + echo "${module_name}: The installed package is not for this version of Asterisk. Reinstalling." + need_install=1 + elif [[ ${rpvi} > ${ipvi} ]] ; then + echo "${module_name}: A newer package is available" + need_install=1 + else + sums=$(${XMLSTARLET} sel -t -m "//file" -v "@md5sum" -n ${DESTDIR}${ASTMODDIR}/${module_name}.manifest.xml) + for sum in ${sums} ; do + install_path=$(${XMLSTARLET} sel -t -v "//file[@md5sum = '${sum}']/@install_path" ${DESTDIR}${ASTMODDIR}/${module_name}.manifest.xml ) + f=${DESTDIR}$(eval echo ${install_path}) + if [[ ! -f ${f} ]] ; then + echo Not found: ${f} + need_install=1 + else + cs=$(md5sum ${f} | cut -b1-32) + if [[ "${cs}" != "${sum}" ]] ; then + echo Checksum mismatch: ${f} + need_install=1 + fi + fi + done + fi +else + need_install=1 +fi + +if [[ ${need_install} == 1 ]] ; then + if [[ ( -n "${ipvi}" ) && ${ipvi} > ${rpvi} ]] ; then + echo "${module_name}: Installed package is newer than that available for download." + exit 0 + fi +else + echo "${module_name} is up to date." + exit 0; +fi + +need_download=1 +if [[ -f ${cache_dir}/${module_name}.manifest.xml ]] ; then + cpv=$(${XMLSTARLET} sel -t -v "/package/@version" ${cache_dir}/${module_name}.manifest.xml) + cpvi=$(version_convert ${cpv}) + echo "${module_name}: Cached package version ${cpv} (${cpvi})" + if [[ ${cpvi} == ${rpvi} && ( -f ${cache_dir}/${tarball} ) ]] ; then + echo "${module_name}: Cached version is available." + need_download=0 + fi +fi + +if [[ ${need_download} = 1 ]] ; then + echo "${module_name}: Downloading ${remote_url}/${tarball}" + ${WGET} -q -O ${cache_dir}/${tarball} ${remote_url}/${tarball} || { + echo "${module_name}: Unable to fetch ${remote_url}/${tarball}" + exit 1 + } + cp ${tmpdir}/manifest.xml ${cache_dir}/${module_name}.manifest.xml +fi + +tar -xzf ${cache_dir}/${tarball} -C ${cache_dir} +trap "rm -rf ${cache_dir}/${module_dir} ; rm -rf ${tmpdir}" EXIT + +echo "${module_name}: Installing." + +if [[ $EUID == 0 ]] ; then + install_params="--group=0 --owner=0" +fi + +names=$(${XMLSTARLET} sel -t -m "//file" -v "@name" -n ${cache_dir}/${module_dir}/manifest.xml) +for name in ${names} ; do + source_path=${cache_dir}/${module_dir}/${name} + install_path=$(${XMLSTARLET} sel -t -v "//file[@name = '${name}']/@install_path" ${cache_dir}/${module_dir}/manifest.xml) + install_path=${DESTDIR}$(eval echo ${install_path}) + executable=$(${XMLSTARLET} sel -t -v "//file[@name = '${name}']/@executable" ${cache_dir}/${module_dir}/manifest.xml || :) + if [[ "${executable}" = "yes" ]] ; then + mode=0755 + else + mode=0644 + fi + + ${INSTALL} -Dp ${install_params} --mode=${mode} ${source_path} ${install_path} + +done +${INSTALL} -Dp ${install_params} --mode=0644 ${cache_dir}/${module_dir}/manifest.xml ${DESTDIR}${ASTMODDIR}/${module_name}.manifest.xml + +echo "${module_name}: Installed." |