JAL-4090 JAL-1551 source license
[jalview.git] / utils / download_jres.sh
1 #!/usr/bin/env bash
2
3 # see https://api.adoptopenjdk.net/swagger-ui/#/Binary/get_v3_binary_latest__feature_version___release_type___os___arch___image_type___jvm_impl___heap_size___vendor_
4
5
6 ### bs 2020-01-22
7 ### This is a script to download and update the JREs used in the windows, mac (and maybe linux) installations, and update channel
8 ### It creates a structure with
9 ### ./jre-VERSION-OS-ARCH/jre/...
10 ### as used by getdown
11 ### and
12 ### ./tgz/jre-VERSION-OS-ARCH.tgz
13 ### which is an archive of the _contents_ of ./jre-VERSION-OS-ARCH/jre/ and used by install4j for the installer
14 ### bs 2021-10-26
15 ### Edited to use adoptium domain to gain access to Java 17 (LTS) versions.
16
17 BASE=https://api.adoptium.net/v3/binary/latest
18 ZULU_BASE=https://cdn.azul.com/zulu/bin
19 RELEASE_TYPE=ga
20 JVM_IMPL=hotspot
21 HEAP_SIZE=normal
22 VENDOR=eclipse
23 IMAGE_TYPE=jre
24 TAR=tar
25 ZIP=zip
26 UNZIP=unzip
27
28 STRIP_MAC_APP_BUNDLING=false
29 CREATE_ARCHIVES="zip tgz"
30 # need zip with top-level jre dir for getdown updates. need tgz without top-level jre dir for install4j bundling
31
32 RM=/bin/rm
33
34 # unzip-strip from https://superuser.com/questions/518347/equivalent-to-tars-strip-components-1-in-unzip
35 unzip-strip() {
36   local zip=$1
37   local dest=${2:-.}
38   local temp=$(mktemp -d) && $UNZIP -qq -d "$temp" "$zip" && mkdir -p "$dest" &&
39   shopt -s dotglob && local f=("$temp"/*) &&
40   if (( ${#f[@]} == 1 )) && [[ -d "${f[0]}" ]] ; then
41     mv "$temp"/*/* "$dest"
42   else
43     mv "$temp"/* "$dest"
44   fi && rmdir "$temp"/* "$temp"
45 }
46
47 dl_zulu() {
48   local OS="$1"
49   local ARCH="$2"
50   local VERSION="$3"
51   local TARFILE="$4"
52   declare -A osmap
53   osmap[mac]=macosx
54   osmap[windows]=win
55   osmap[linux]=linux
56   ZOS="${osmap[$OS]}"
57   echo "- Looking for download from Azul"
58   LATEST_DL_URL_FILE=$(wget -q -O - "${ZULU_BASE}/" | perl -n -e 'm/<a\b[^>]*href="(([^"]*\/)?zulu[^"]*-ca-'"${IMAGE_TYPE}""${VERSION}"'\.[^"]*-'"${ZOS}"'_'"${ARCH}"'.tar.gz)"[^"]*>/ && print "$1\n";' | tail -1)
59   local URL="${ZULU_BASE}/${LATEST_DL_URL_FILE}"
60   if [ -z "${LATEST_DL_URL_FILE}" ]; then
61     echo "- No ${IMAGE_TYPE}-${FEATURE_VERSION} download for ${OS}-${ARCH} '${URL}' found at Azul"
62     return 1
63   fi
64   echo "- Found at Azul. Downloading '${URL}'"
65   wget -q -O "${TARFILE}" "${URL}" "${TARFILE}"
66   echo RETURN=$?
67   if [ "$?" != 0 ]; then
68     echo "- Download from Azul failed"
69     return 1
70   fi
71   return 0
72 }
73
74 declare -A DOWNLOAD_SUMMARY
75
76 for FEATURE_VERSION in 8 11 17; do
77   for OS_ARCH in mac:x64 mac:aarch64 windows:x64 linux:x64 linux:arm linux:aarch64; do
78     OS=${OS_ARCH%:*}
79     ARCH=${OS_ARCH#*:}
80     NAME="${IMAGE_TYPE}-${FEATURE_VERSION}-${OS}-${ARCH}"
81     TARFILE="${NAME}.tgz"
82     DOWNLOAD_SUMMARY["${OS_ARCH}-${IMAGE_TYPE}-${FEATURE_VERSION}"]="None"
83     STRIP_COMPONENTS=1
84     MAC_STRIP_COMPONENTS=3
85     echo "* Downloading ${TARFILE}"
86     URL="${BASE}/${FEATURE_VERSION}/${RELEASE_TYPE}/${OS}/${ARCH}/${IMAGE_TYPE}/${JVM_IMPL}/${HEAP_SIZE}/${VENDOR}"
87     wget -q -O "${TARFILE}" "${URL}"
88     if [ "$?" != 0 ]; then
89       echo "- No ${IMAGE_TYPE}-${FEATURE_VERSION} download for ${OS}-${ARCH} '${URL}' at Adoptium"
90       $RM -f "${TARFILE}"
91
92       # Try Azul Zulu (not an API, a bit messier, but has Java 8 JRE for mac:aarch64
93       dl_zulu "${OS}" "${ARCH}" "${FEATURE_VERSION}" "${TARFILE}"
94
95       if [ "$?" != 0 ]; then
96         DOWNLOAD_SUMMARY["${OS_ARCH}-${IMAGE_TYPE}-${FEATURE_VERSION}"]="None"
97         continue;
98       fi
99       STRIP_COMPONENTS=2
100       MAC_STRIP_COMPONENTS=4
101       DOWNLOAD_SUMMARY["${OS_ARCH}-${IMAGE_TYPE}-${FEATURE_VERSION}"]="Azul"
102       echo "Set ${OS_ARCH}-${IMAGE_TYPE}-${FEATURE_VERSION}=Azul"
103     else
104       DOWNLOAD_SUMMARY["${OS_ARCH}-${IMAGE_TYPE}-${FEATURE_VERSION}"]="Adoptium"
105       echo "Set ${OS_ARCH}-${IMAGE_TYPE}-${FEATURE_VERSION}=Adoptium"
106     fi
107     echo "Unpacking ${TARFILE}"
108     JREDIR="${NAME}/${IMAGE_TYPE}"
109     [ x$NAME != x -a -e "${JREDIR}" ] && $RM -rf "${JREDIR}"
110     mkdir -p "${JREDIR}"
111     if [ x$OS = xwindows ]; then
112       echo "using unzip"
113       unzip-strip "${TARFILE}" "${JREDIR}"
114       RET=$?
115     else
116       echo "using tar"
117       if [ x$OS = xmac -a x$STRIP_MAC_APP_BUNDLING = xtrue ]; then
118         echo "Running $TAR --strip-components=\"${MAC_STRIP_COMPONENTS}\" -C \"${JREDIR}\" -zxf \"${TARFILE}\" \"*/Contents/Home\""
119         $TAR --strip-components="${MAC_STRIP_COMPONENTS}" -C "${JREDIR}" -zxf "${TARFILE}" "*/Contents/Home"
120         RET=$?
121       else
122         $TAR --strip-components="${STRIP_COMPONENTS}" -C "${JREDIR}" -zxf "${TARFILE}"
123         RET=$?
124       fi
125     fi
126     if [ "$RET" != 0 ]; then
127       echo "Error unpacking ${TARFILE}"
128       exit 1
129     fi
130     $RM "${TARFILE}"
131     if [ \! -z "$CREATE_ARCHIVES" ]; then
132       for CREATEARCHIVE in ${CREATE_ARCHIVES}; do
133         ARCHIVEDIR=$CREATEARCHIVE
134         case $CREATEARCHIVE in
135           zip)
136             EXT=${CREATEARCHIVE}
137             echo "Creating ${NAME}.${EXT} for getdown updates"
138             [ \! -d ${ARCHIVEDIR} ] && mkdir -p "${ARCHIVEDIR}"
139             ABSARCHIVEDIR="${PWD}/$ARCHIVEDIR"
140             ZIPFILE="${ABSARCHIVEDIR}/${NAME}.${CREATEARCHIVE}"
141             [ -e "${ZIPFILE}" ] && $RM "${ZIPFILE}"
142             cd ${NAME}
143             $ZIP -X -r "${ZIPFILE}" "${IMAGE_TYPE}"
144             cd -
145             ;;
146           tgz)
147             EXT=tar.gz
148             echo "Creating ${NAME}.${EXT} for install4j bundling"
149             [ \! -d ${ARCHIVEDIR} ] && mkdir -p "${ARCHIVEDIR}"
150             if [ x$OS = xmac ]; then
151               # install4j requires top level folder of "Contents" NOT "./Contents"
152               $TAR -C "${JREDIR}" -zcf "${ARCHIVEDIR}/${NAME}.${EXT}" Contents
153             else
154               $TAR -C "${JREDIR}" -zcf "${ARCHIVEDIR}/${NAME}.${EXT}" .
155             fi
156             # make symbolic link with _ instead of - for install4j9
157             NEWNAME=${NAME//-/_}
158             echo "Linking from ${NEWNAME}.${EXT} for install4j9"
159             [ -e "${ARCHIVEDIR}/${NEWNAME}.${EXT}" ] && $RM "${ARCHIVEDIR}/${NEWNAME}.${EXT}"
160             ln -s "${NAME}.${EXT}" "${ARCHIVEDIR}/${NEWNAME}.${EXT}"
161             ;;
162           *)
163             echo "Archiving as '${CREATEARCHIVE}' file not supported"
164             ;;
165         esac
166       done
167     fi
168   done
169 done
170
171 echo ""
172 echo "Download Summary"
173 for OA in "${!DOWNLOAD_SUMMARY[@]}"; do
174   echo "$OA: ${DOWNLOAD_SUMMARY[$OA]}"
175 done
176