#!/bin/bash ########################################################################### # Copyright 2017-2018 IoT.bzh # # author: Sebastien Douheret # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ########################################################################### # script_name=$(basename ${0}) CURL="curl -f -s --connect-timeout 10" ### Define urls where SDKs can be downloaded / AGL part SDK_AGL_BASEURL="https://download.automotivelinux.org/AGL/" DOWNLOADABLE_AGL_URLS=" snapshots/master/latest/* release/dab/4.0.3/* release/eel/5.1.0/* release/eel/latest/* release/flounder/6.0.0/* release/flounder/latest/* " # release/dab/4.0.2/* # # release/eel/5.0.0/* # release/eel/5.0.1/* # release/eel/5.0.2/* # release/eel/5.0.3/* # release/eel/5.1.0/* # release/eel/latest/ # # release/flounder/5.99.6/* SDK_AGL_URL_SUFFIX="/deploy/sdk/" IMG_AGL_URL_SUFFIX="/deploy/images/" ####################################### ### Define urls where SDKs can be downloaded / IoT.bzh part SDK_IOTBZH_BASEURL="http://iot.bzh/download/public/XDS/images/" DOWNLOADABLE_IOTBZH_URLS=" dab-m3ulcb/* eel-intel-corei7-64/* eel-m3ulcb/* flounder-h3ulcb/* flounder-m3ulcb/* flounder-qemux86-64/* master-m3ulcb/* " SDK_IOTBZH_URL_SUFFIX="/sdk/" IMG_IOTBZH_URL_SUFFIX="/images/" ####################################### # Compute full urls list (parse '*' characters) function expand_url { # url, prefix, suffix local result="" url=$2$1 if [[ "$url" = *"*"* ]]; then bUrl=$(echo $url | cut -d'*' -f 1) eUrl=$(echo $url | cut -d'*' -f 2) dirs=$(curl -s ${bUrl} | grep '\[DIR\]' | grep -oP 'href="[^"]*"' | cut -d'"' -f 2) for dir in $(echo $dirs); do result="$result ${bUrl::-1}/${dir::-1}${eUrl:1}" done else result="$url" fi echo $result } function dbg_error() { >&2 echo "ERROR:" $@; } function dbg_warning(){ [ $DEBUG -ge 1 ] && { >&2 echo "WARNING:" $@; } ; } function dbg_info() { [ $DEBUG -ge 1 ] && { >&2 echo "INFO:" $@; } ; } function dbg_debug() { [ $DEBUG -ge 2 ] && { >&2 echo "DEBUG:" $@; } ; } function count() { echo $#; } function first() { echo $1; } function search_image_url { htmlPage=$(${CURL} ${1}/) if [[ $? == 0 ]]; then # curl request without error, at least URL is OK if [ "${2}" = "qemux86-64" ]; then image_name=$(echo $(first $(echo ${htmlPage} | egrep -o 'href="agl-demo-platform-crosssdk-[^"]*\.vmdk(\.xz)?"')) | sed -E 's/.*href="([^"]*)".*/\1/') else image_name=$(echo $(first $(echo ${htmlPage} | egrep -o 'href="agl-demo-platform-crosssdk-[^"]*\.rootfs\.wic(\.xz)?"')) | sed -E 's/.*href="([^"]*)".*/\1/') # search for tar.xz if no wic found... if [ $(count $image_name) -eq 0 ]; then image_name=$(echo $(first $(echo ${htmlPage} | egrep -o 'href="agl-demo-platform-crosssdk-[^"]*\.tar\.xz"')) | sed -E 's/.*href="([^"]*)".*/\1/') fi fi else dbg_warning "could not list content of ${1}, HTTP request failed." image_name="null" fi # return string result if [[ ${image_name} = "null" ]]; then echo "null" # to be inserted as-is in the JSON output else echo "\"${1}/${image_name}\"" # if no image file found, but URL is valid, lets point to the directory fi } # Given an URL, generate the corresponding JSON chunk function generate_json { url=$1 SDK_URL=$1$2 IMG_URL=$1$3 arch="" htmlPage=$(${CURL} "${SDK_URL}") files=$(echo ${htmlPage} | egrep -o 'href="[^"]*crosssdk[^"]*\.sh"' | cut -d '"' -f 2) if [ "$?" != "0" ] || [ "${files}" = "" ]; then dbg_warning " IGNORED ${url}: no valid files found" return fi # assume that sdk name follow this format : # _PROFILE_-_COMPILER_ARCH_-_TARGET_-crosssdk-_ARCH_-toolchain-_VERSION_.sh # for example: # poky-agl-glibc-x86_64-agl-demo-platform-crosssdk-corei7-64-toolchain-4.0.1.sh if [ $(count files) -gt 1 ] then dbg_warning " IGNORE ${url}: multiple shell script containing 'crosssdk' in their names" return fi sdkFile=${files} dbg_info "Processing SDK: ${sdkFile} (from ${url})" profile=$(echo "${sdkFile}" | sed -r 's/(.*)-glibc.*/\1/') version=$(echo "${sdkFile}" | sed -r 's/.*toolchain-(.*).sh/\1/') arch=$(echo "${sdkFile}" | sed -r 's/.*crosssdk-(.*)-toolchain.*/\1/') endUrl=${url#$SDK_AGL_BASEURL} if [ "${url::14}" = "http://iot.bzh" ]; then endUrl=${url#$SDK_IOTBZH_BASEURL} name=$(echo "IoTbzh-$(echo ${endUrl} | sed s:/:-:g)-${version}") board="" elif [ "${endUrl::4}" = "http" ]; then name="${profile}_${arch}_${version}" board="" else name=$(echo "AGL-$(echo ${endUrl} | cut -d'/' -f1,2,3,4)" | sed s:/:-:g) board=$(echo ${endUrl} | cut -d'/' -f4) board=${board%-nogfx} fi # Distringuish qemux86-64 and corei7-64 if [[ "$name" == *"qemux86-64"* && "$arch" == "corei7-64" ]]; then arch="qemux86-64" fi [ "${profile}" = "" ] && { dbg_error "profile is not set" ; return ; } [ "${version}" = "" ] && { dbg_error "version is not set" ; return ; } [ "${arch}" = "" ] && { dbg_error "arch is not set" ; return ; } [ "${name}" = "" ] && { name=${profile}_${arch}_${version}; } sdkDate="$(echo "${htmlPage}" |egrep -o ${sdkFile/+/\\+}'.*[0-9\-]+ [0-9]+:[0-9]+' |cut -d'>' -f 4|cut -d' ' -f1,2)" sdkSize="$(echo "${htmlPage}" |egrep -o "${sdkFile/+/\\+}.*${sdkDate}.*[0-9\.MG]+" |cut -d'>' -f7 |cut -d'<' -f1)" md5sum="$(wget -q -O - ${SDK_URL}/${sdkFile/.sh/.md5} |cut -d' ' -f1)" image_url=$(search_image_url ${IMG_URL}${board} ${arch}) read -r -d '' res <<- EndOfMessage { "name": "${name}", "description": "AGL SDK ${arch} (version ${version})", "profile": "${profile}", "version": "${version}", "arch": "${arch}", "path": "", "url": "${SDK_URL}${sdkFile}", "image_url": ${image_url}, "status": "Not Installed", "date": "${sdkDate}", "size": "${sdkSize}", "md5sum": "${md5sum}", "setupFile": "" }, EndOfMessage sdksList="${sdksList}${res}" } DEBUG=0 if [[ ${1:0:2} = "-v" ]] ; then verbose=$(echo -s ${1} | sed -E "s/-([v]+).*/\1/") DEBUG=$(echo ${verbose} | wc -c) echo "Set verbosity level to : ${DEBUG}" shift fi # Compute list of available/installable SDKs sdksList=" " for base_url in $DOWNLOADABLE_AGL_URLS do dbg_debug "Look into ${base_url}" urls="$(expand_url $base_url $SDK_AGL_BASEURL)" for url in $urls do dbg_debug "URL to check: ${url}" generate_json $url $SDK_AGL_URL_SUFFIX $IMG_AGL_URL_SUFFIX done done for base_url in $DOWNLOADABLE_IOTBZH_URLS do dbg_debug "Look into ${base_url}" urls="$(expand_url $base_url $SDK_IOTBZH_BASEURL)" for url in $urls do dbg_debug "URL to check: ${url}" generate_json $url $SDK_IOTBZH_URL_SUFFIX $IMG_IOTBZH_URL_SUFFIX done done OUT_FILE=$(dirname "$0")/sdks_$(date +"%F_%H%M").json echo "[" > ${OUT_FILE} echo "${sdksList::-1}" >> ${OUT_FILE} echo "]" >> ${OUT_FILE} echo "SDKs list successfully saved in ${OUT_FILE}"