* App install code not called from .bin/Scripts/install_app * This ensures all installs are treated the same * install code now supports apps not listed on macapps.link * Launcher scripts now search the current path for .bin * SW Diagnostics fleshed-out * Added more info sections * More consistant logging * Probably more..
140 lines
5.2 KiB
Bash
140 lines
5.2 KiB
Bash
#!/bin/bash
|
|
|
|
# Init
|
|
pushd . > /dev/null
|
|
cd "$(dirname "$0")/.."
|
|
mkdir install_cache >/dev/null 2>&1
|
|
cd install_cache || exit 1
|
|
TMP_DIR="$(mktemp -d 2>/dev/null || mktemp -d -t 'wktmp')"
|
|
|
|
# Functions
|
|
## code heavily borrowed from macapps.link
|
|
getApp() {
|
|
if [ -f "$1" ]; then
|
|
echo $'\360\237\214\200 - ['$2'] Copying app...'
|
|
cp -n "$1" "$2"
|
|
else
|
|
echo $'\360\237\214\200 - ['$2'] Downloading app...'
|
|
curl "$1" -L -R -f -s -o "$2" -z "$2"
|
|
fi
|
|
}
|
|
|
|
versionChecker() {
|
|
local v1=$1
|
|
local v2=$2
|
|
while [ `echo $v1 | egrep -c [^0123456789.]` -gt 0 ]; do
|
|
char=`echo $v1 | sed 's/.*\([^0123456789.]\).*/\1/'`
|
|
char_dec=`echo -n "$char" | od -b | head -1 | awk {'print $2'}`
|
|
v1=`echo $v1 | sed "s/$char/.$char_dec/g"`
|
|
done
|
|
while [ `echo $v2 | egrep -c [^0123456789.]` -gt 0 ]; do
|
|
char=`echo $v2 | sed 's/.*\([^0123456789.]\).*/\1/'`
|
|
char_dec=`echo -n "$char" | od -b | head -1 | awk {'print $2'}`
|
|
v2=`echo $v2 | sed "s/$char/.$char_dec/g"`
|
|
done
|
|
v1=`echo $v1 | sed 's/\.\./.0/g'`
|
|
v2=`echo $v2 | sed 's/\.\./.0/g'`
|
|
checkVersion "$v1" "$v2"
|
|
}
|
|
|
|
checkVersion() {
|
|
[ "$1" == "$2" ] && return 1
|
|
v1f=`echo $1 | cut -d "." -f -1`
|
|
v1b=`echo $1 | cut -d "." -f 2-`
|
|
v2f=`echo $2 | cut -d "." -f -1`
|
|
v2b=`echo $2 | cut -d "." -f 2-`
|
|
if [[ "$v1f" != "$1" ]] || [[ "$v2f" != "$2" ]]; then
|
|
[[ "$v1f" -gt "$v2f" ]] && return 1
|
|
[[ "$v1f" -lt "$v2f" ]] && return 0
|
|
[[ "$v1f" == "$1" ]] || [[ -z "$v1b" ]] && v1b=0
|
|
[[ "$v2f" == "$2" ]] || [[ -z "$v2b" ]] && v2b=0
|
|
checkVersion "$v1b" "$v2b"
|
|
return $?
|
|
else
|
|
[ "$1" -gt "$2" ] && return 1 || return 0
|
|
fi
|
|
}
|
|
|
|
appStatus() {
|
|
if [ ! -d "/Applications/$1" ]; then
|
|
echo "uninstalled"
|
|
else
|
|
if [[ $5 == "build" ]]; then
|
|
BUNDLE="CFBundleVersion"
|
|
else
|
|
BUNDLE="CFBundleShortVersionString"
|
|
fi
|
|
INSTALLED=`/usr/libexec/plistbuddy -c Print:$BUNDLE: "/Applications/$1/Contents/Info.plist"`
|
|
if [ $4 == "dmg" ]; then
|
|
COMPARETO=`/usr/libexec/plistbuddy -c Print:$BUNDLE: "/Volumes/$2/$1/Contents/Info.plist"`
|
|
elif [[ $4 == "zip" || $4 == "tar" ]]; then
|
|
COMPARETO=`/usr/libexec/plistbuddy -c Print:$BUNDLE: "$3$1/Contents/Info.plist"`
|
|
fi
|
|
checkVersion "$INSTALLED" "$COMPARETO"
|
|
UPDATED=$?
|
|
if [[ $UPDATED == 1 ]]; then
|
|
echo "updated"
|
|
else
|
|
echo "outdated"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
installApp() {
|
|
getApp "$4" "$2.$1"
|
|
cp "$2.$1" "$TMP_DIR/"
|
|
pushd "$TMP_DIR" >/dev/null
|
|
if [ $1 == "dmg" ]; then
|
|
yes | hdiutil mount -nobrowse "$2.dmg" -mountpoint "/Volumes/$2" > /dev/null
|
|
install_status="$(appStatus "$3" "$2" "" "dmg" "$7")"
|
|
if [[ "$install_status" == "updated" ]]; then
|
|
echo $'\342\235\214 - ['$2'] Skipped because it was already up to date!'
|
|
elif [[ "$install_status" == "outdated" && $6 != "noupdate" ]]; then
|
|
ditto "/Volumes/$2/$3" "/Applications/$3"
|
|
echo $'\360\237\214\216 - ['$2'] Successfully updated!'
|
|
elif [[ "$install_status" == "outdated" && $6 == "noupdate" ]]; then
|
|
echo $'\342\235\214 - ['$2'] This app cant be updated!'
|
|
elif [[ "$install_status" == "uninstalled" ]]; then
|
|
cp -R "/Volumes/$2/$3" /Applications
|
|
echo $'\360\237\221\215 - ['$2'] Succesfully installed!'
|
|
fi
|
|
hdiutil unmount "/Volumes/$2" > /dev/null
|
|
elif [ $1 == "zip" ]; then
|
|
unzip -qq "$2.zip"
|
|
install_status="$(appStatus "$3" "" "$5" "zip" "$7")"
|
|
if [[ "$install_status" == "updated" ]]; then
|
|
echo $'\342\235\214 - ['$2'] Skipped because it was already up to date!'
|
|
elif [[ "$install_status" == "outdated" && $6 != "noupdate" ]]; then
|
|
ditto "$5$3" "/Applications/$3"
|
|
echo $'\360\237\214\216 - ['$2'] Successfully updated!'
|
|
elif [[ "$install_status" == "outdated" && $6 == "noupdate" ]]; then
|
|
echo $'\342\235\214 - ['$2'] This app cant be updated!'
|
|
elif [[ "$install_status" == "uninstalled" ]]; then
|
|
mv "$5$3" /Applications
|
|
echo $'\360\237\221\215 - ['$2'] Succesfully installed!'
|
|
fi
|
|
rm -rf "$2.zip" && rm -rf "$5" && rm -rf "$3"
|
|
elif [[ $1 == "tar" || $1 == "tbz" || $1 == "tgz" || $1 == "txz" ]]; then
|
|
tar -zxf "$2.$1" > /dev/null;
|
|
install_status="$(appStatus "$3" "" "$5" "tar" "$7")"
|
|
if [[ "$install_status" == "updated" ]]; then
|
|
echo $'\342\235\214 - ['$2'] Skipped because it was already up to date!'
|
|
elif [[ "$install_status" == "outdated" && $6 != "noupdate" ]]; then
|
|
ditto "$3" "/Applications/$3"
|
|
echo $'\360\237\214\216 - ['$2'] Successfully updated!'
|
|
elif [[ "$install_status" == "outdated" && $6 == "noupdate" ]]; then
|
|
echo $'\342\235\214 - ['$2'] This app cant be updated!'
|
|
elif [[ "$install_status" == "uninstalled" ]]; then
|
|
mv "$5$3" /Applications
|
|
echo $'\360\237\221\215 - ['$2'] Succesfully installed!'
|
|
fi
|
|
rm -rf "$2.$1" && rm -rf "$3"
|
|
fi
|
|
popd > /dev/null
|
|
}
|
|
|
|
# Install App
|
|
installApp "$@"
|
|
|
|
# Done
|
|
rm -R "$TMP_DIR"
|