3 ####################################
6 # Ardour/Mixbus bundle installer
9 ###################################
15 PGM_EXEC_FILE="ardour3"
17 INSTALL_DEST_BASE="/opt"
18 USER_BIN_DIR="/usr/local/bin"
20 PGM_NAME_LOWER=$(echo $PGM_NAME | tr '[:upper:]' '[:lower:]')
24 #### Global Variables ####
27 ########################
28 # Function Definitions
29 ########################
31 VaildateYesNoQuestion ()
38 until test "y" = $INPUT_OK;
41 read -p "$1 [y/n]: " USER_INPUT
44 if [ ! -z $USER_INPUT ];
46 if [ "Y" = $USER_INPUT -o "y" = $USER_INPUT -o "n" = $USER_INPUT -o "N" = $USER_INPUT ];
53 echo $USER_INPUT | tr '[:upper:]' '[:lower:]'
60 # Determine which software install app to use and then install requested package
63 if which yum > /dev/null;
65 ${SUPER} yum -y install $1
71 echo "!!! ERROR !!! yum install failed for an unknown reason."
72 echo "Please install package $1 after this installer completes."
76 elif which apt-get > /dev/null;
78 ${SUPER} apt-get -y install $1
84 echo "!!! ERROR !!! apt-get install failed for an unknown reason."
85 echo "Please install package $1 after this installer completes."
91 echo "!!! ERROR !!! - Not able to detect which software install tool to use (yum or apt-get)."
92 echo "Please install package $1 using the system software install tool."
101 ########################################################################
103 ########################################################################
105 # If you double click a script, some systems don't get the PWD correct.
106 # Force it to be correct
107 PKG_PATH=$(dirname "$(readlink -f "$0")")
111 echo "Welcome to the ${PGM_NAME} installer"
113 echo "${PGM_NAME} will be installed for user ${USER_NAME} in ${INSTALL_DEST_BASE}"
116 ###############################
117 # Check for install destination
118 ###############################
120 if [ ! -d ${INSTALL_DEST_BASE} ];
123 echo "!!! ERROR !!! - Installation location ${INSTALL_DEST_BASE} does not exist!"
124 echo "Installation will not complete."
126 read -p "Press ENTER to exit installer:" BLAH
130 #############################
131 # Check for root privileges
132 #############################
137 if [ "$(id -u)" != "0" ]; then
139 if ! which sudo > /dev/null;
142 echo "Sudo installed failed, attempting to install using su"
143 echo "Please enter root password below"
146 if ! su -c "./.stage2.run";
151 echo "This installer requires root privileges. It is currently not"
152 echo "running as root AND an attempt to use su failed."
154 echo "Please correct this by installing and configuring sudo or running"
155 echo "the installer as root (su -c)."
157 read -p "Press ENTER to exit installer:" BLAH
166 echo "Attempting to install using su"
167 echo "Please enter root password below"
170 if ! su -c "./.stage2.run";
175 echo "This installer requires root privileges. It is currently not"
176 echo "running as root AND an attempt to use both sudo and su failed."
178 echo "Please correct this by installing and configuring sudo or running"
179 echo "the installer as root (su -c)."
181 read -p "Press ENTER to exit installer:" BLAH
188 # The quoting reqired for the su sanityCheck method does not work when used without
189 # su. Using sh -c in the normal case gets around that, but is a bit of a hack.
192 NORM_USER="su -l $USER_NAME -c"
195 ############################
196 # Determine processor type
197 ############################
200 i[3456789]86|x86|i86pc)
201 echo "Architecture is x86"
205 echo "Architecture is x86_64"
210 echo "!!! ERROR !!! - Unknown architecture `uname -m`"
212 read -p "Press ENTER to exit installer:" BLAH
221 # We have to check the current folder and the INSTALL_DEST_BASE just
222 # in case they are on different devices
223 echo "Checking for required disk space"
225 if [ ! -e .${PGM_NAME}_${ARCH}-*.size ]; then
227 echo "!!! ERROR !!! Can't locate .size file for ${ARCH} bundle."
228 echo "This package is broken or does not support ${ARCH}."
230 read -p "Press ENTER to exit installer:" BLAH
233 REQUIRED_BYTES=$(cat .${PGM_NAME}_${ARCH}-*.size)
235 #Installer needs 2x the space since the bundle is unpacked locally and then copied
236 REQUIRED_BYTES=$(($REQUIRED_BYTES + $REQUIRED_BYTES))
238 #Check space in current folder
239 FREE_BYTES=$(df -P -B 1 "${PKG_PATH}" | grep / | awk '{print $4}')
241 if [ ${FREE_BYTES} -le ${REQUIRED_BYTES} ] ; then
243 echo "!!! ERROR !!! - Insufficient disk space in ${PKG_PATH}"
244 echo "Install requires ${REQUIRED_BYTES} bytes and"
245 echo "there is only ${FREE_BYTES} bytes of free space"
247 read -p "Press ENTER to exit installer:" BLAH
251 #Check space in INSTALL_DEST_BASE
252 FREE_BYTES=$(df -P -B 1 ${INSTALL_DEST_BASE} | grep / | awk '{print $4}')
254 if [ ${FREE_BYTES} -le ${REQUIRED_BYTES} ] ; then
256 echo "!!! ERROR !!! - Insufficient disk space in ${INSTALL_DEST_BASE}"
257 echo "Install requires ${REQUIRED_BYTES} bytes and"
258 echo "there is only ${FREE_BYTES} bytes of free space"
260 read -p "Press ENTER to exit installer:" BLAH
265 FILESYSTEM_TYPE=$(df -P -T "${PKG_PATH}" | grep / | awk '{print $2}')
266 echo "Bundle is on ${FILESYSTEM_TYPE} filesystem"
268 #####################
270 #####################
272 # untar the correct bundle for us to install
273 echo "Unpacking bundle for $ARCH"
275 if [ ! -e ${PGM_NAME}_${ARCH}-*.tar.bz2 ]; then
277 echo "!!! ERROR !!! Can't locate ${ARCH} bundle file."
279 read -p "Press ENTER to exit installer:" BLAH
283 if ! tar -xjf ${PGM_NAME}_${ARCH}-*.tar.bz2; then
285 echo "!!! ERROR !!! Can't unpack ${ARCH} bundle file."
287 read -p "Press ENTER to exit installer:" BLAH
290 echo "Bundle unpacked"
293 BUNDLE_DIR=$(basename `find -maxdepth 1 -type d -name "${PGM_NAME}_${ARCH}-*"`)
296 #######################
297 # Check for xdg utils
298 #######################
300 #load the file that contains the translated names of the users directories
301 if [ -e /home/${USER_NAME}/.config/user-dirs.dirs ]; then
302 . /home/${USER_NAME}/.config/user-dirs.dirs
305 if [ "$(id -u)" != "0" ]; then
306 USER_DESKTOP_DIR=${XDG_DESKTOP_DIR:-$HOME/Desktop}
308 #running as root with su makes this more difficult
309 DESKTOP_FOLDER=$(echo ${XDG_DESKTOP_DIR:-$HOME/Desktop} | awk -F/ '{print $NF}')
310 USER_DESKTOP_DIR="/home/${USER_NAME}/${DESKTOP_FOLDER}"
313 XDG_MENU_VER=$(xdg-desktop-menu --version 2> /dev/null)
314 if [ -z "$XDG_MENU_VER" ];
316 echo "System does not have xdg-desktop-menu installed"
320 XDG_ICON_VER=$(xdg-icon-resource --version 2> /dev/null)
321 if [ -z "$XDG_ICON_VER" ];
323 echo "System does not have xdg-icon-resource installed"
327 #################################################
328 # Check if system libs are OK (libc, etc)
329 #################################################
332 echo "Checking system libs to see if they are compatible with ${PGM_NAME}."
336 LD_PATH=`pwd`/${BUNDLE_DIR}/lib
339 LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd ${BUNDLE_DIR}/bin/${PGM_NAME_LOWER}-* 2>&1 > /dev/null)
341 if [ -n "$LDD_RESULT" ];
348 LIB_FILES=$(find ${BUNDLE_DIR}/lib -name "*.so")
350 for path in $LIB_FILES
352 LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd $path 2>&1 > /dev/null)
353 if [ -n "$LDD_RESULT" ];
360 if test "T" = $LIB_ERROR;
363 echo "!!! ERROR !!! - Missing library detected!"
364 echo "This system does not have the correct libs to run ${PGM_NAME}."
365 echo "Installation will not complete. Please use a compatible distro."
367 read -p "Press ENTER to exit installer:" BLAH
371 ################################
372 # Setup derived variables
373 ################################
374 PGM_VERSION=$(echo ${BUNDLE_DIR} | cut -d- -f2)
375 PGM_BUILD=$(echo ${BUNDLE_DIR} | cut -d- -f3)
376 PGM_BUILDTYPE=$(echo ${BUNDLE_DIR} | cut -d- -f4)
379 if [ -z ${PGM_BUILDTYPE} ];
381 PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}-${PGM_BUILD}"
382 ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}" #no dash between name and version since dash seperates vendor from program
383 MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}.desktop" #no dash between name and version since dash seperates vendor from program
384 DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}.desktop"
386 PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}-${PGM_BUILD}-${PGM_BUILDTYPE}"
387 ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}" #no dash between name and version since dash seperates vendor from program
388 MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop" #no dash between name and version since dash seperates vendor from program
389 DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop"
392 PGM_EXEC_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/${PGM_EXEC_FILE}"
393 ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share/icons"
394 MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
396 echo "VERSION [$PGM_VERSION] BUILD [$BUILD] FULLNAME[$PGM_FULL_NAME] EXECPATH [$PGM_EXEC_PATH]"
398 ################################
399 # Install bundle and Menu/Link
400 ################################
402 # uninstall any older versions
403 UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}*.uninstall.sh")
404 if [ ! -z "$UNINSTALLERS" ];
406 for i in $UNINSTALLERS; do
408 echo "Found existing ${PGM_NAME} installation."
410 ANSWER=$(VaildateYesNoQuestion "Do you want to run the uninstaller ${i} ?")
412 if test "y" = $ANSWER;
415 echo "Running uninstaller $i"
427 echo "Installing ${PGM_NAME} ${PGM_VERSION} built from ${PGM_BUILD} in ${INSTALL_DEST_BASE}"
430 # Copy the new version in the install directory
431 ${SUPER} mkdir ${INSTALL_DEST_BASE}/${PGM_FULL_NAME}
432 ${SUPER} cp -Rf ${BUNDLE_DIR}/* ${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/
434 # write the desktop/menu file
435 echo "[Desktop Entry]" > /tmp/${MENU_FILE}
436 echo "Encoding=UTF-8" >> /tmp/${MENU_FILE}
437 echo "Version=1.0" >> /tmp/${MENU_FILE}
438 echo "Type=Application" >> /tmp/${MENU_FILE}
439 echo "Terminal=false" >> /tmp/${MENU_FILE}
440 echo "Exec=${PGM_EXEC_PATH}" >> /tmp/${MENU_FILE}
441 if [ -z ${PGM_BUILDTYPE} ];
443 echo "Name=${PGM_NAME}-${PGM_VERSION}" >> /tmp/${MENU_FILE}
445 echo "Name=${PGM_NAME}-${PGM_VERSION}-${PGM_BUILDTYPE}" >> /tmp/${MENU_FILE}
447 echo "Icon=${ICON_NAME}" >> /tmp/${MENU_FILE}
448 echo "Comment=Digital Audio Workstation" >> /tmp/${MENU_FILE}
449 echo "Categories=AudioVideo;AudioEditing;Audio;Recorder;" >> /tmp/${MENU_FILE}
451 chmod ugo+rx /tmp/${MENU_FILE}
452 ${SUPER} mv /tmp/${MENU_FILE} ${MENU_FILE_PATH}/.
454 # install the Menu, Link, and Icon(s)
455 if [ "T" = ${HAS_XDG} ];
457 echo "Adding ${PGM_NAME} to the applications menu"
458 ${SUPER} xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_16px.png ${ICON_NAME}
459 ${SUPER} xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_22px.png ${ICON_NAME}
460 ${SUPER} xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_32px.png ${ICON_NAME}
461 ${SUPER} xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_48px.png ${ICON_NAME}
462 ${SUPER} xdg-icon-resource install --context apps --size 256 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_256px.png ${ICON_NAME}
464 if [ -e ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ];
466 ${SUPER} cp -f ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
469 ${SUPER} xdg-desktop-menu install ${MENU_FILE_PATH}/${MENU_FILE}
470 ${SUPER} xdg-desktop-menu forceupdate --mode system # Some systems need an extra kick
473 echo "Creating a desktop link for ${PGM_NAME} in ${USER_DESKTOP_DIR}"
474 cp ${MENU_FILE_PATH}/${MENU_FILE} ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
475 chmod ugo+rwx ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
478 echo "Creating a desktop link for ${PGM_NAME} in ${USER_DESKTOP_DIR}"
479 cp ${MENU_FILE_PATH}/${MENU_FILE} ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
480 chmod ugo+rwx ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
484 echo "Copying uninstall script to ${INSTALL_DEST_BASE}"
487 ${SUPER} cp -f ${BUNDLE_DIR}/bin/*.uninstall.sh ${INSTALL_DEST_BASE}/.
489 # Create link to the program in user bin
492 echo "Creating link ${PGM_NAME}3 in ${USER_BIN_DIR}"
495 if [ -d "${USER_BIN_DIR}" ]; then
496 if [ -e "${USER_BIN_DIR}/${PGM_NAME}3" ]; then
497 ${SUPER} rm -f ${USER_BIN_DIR}/${PGM_NAME}3
501 ${SUPER} ln -sf ${PGM_EXEC_PATH} ${PGM_NAME}3
505 echo "Can not create link because ${USER_BIN_DIR} does not exist"
508 ###########################
509 # Check Jack and qjackctl
510 ###########################
513 echo "Checking to see if Jack is installed"
518 if ! which jackd > /dev/null;
521 echo "The program Jack is missing from this system. Jack is a required component of $PGM_NAME."
524 ANSWER=$(VaildateYesNoQuestion "Install jack using system software repository?")
526 if test "y" = $ANSWER;
528 echo "Attempting to install Jack"
529 SystemInstall "jackd"
534 read -p "Press ENTER to continue:" BLAH
541 echo "Jack already present"
544 # Check to see if Jack is new enough to operate correctly.
546 if [ "t" = ${JACK_INSTALLED} ];
549 JACK_VER_STRING=$(jackd --version | grep -e "jackd.*protocol")
550 JACK_NAME=$(echo $JACK_VER_STRING | awk '{print $1}')
551 JACK_VERSION=$(echo $JACK_VER_STRING | awk '{print $3}')
552 JACK_VERSION_MAJOR=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $1}')
553 JACK_VERSION_MIDDLE=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $2}')
554 JACK_VERSION_MINOR=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $3}')
556 if [ "jackd" = ${JACK_NAME} ];
558 if [ ${JACK_VERSION_MAJOR} -eq 0 ];
560 if [ ${JACK_VERSION_MIDDLE} -eq 121 ];
562 if [ ${JACK_VERSION_MINOR} -ge 3 ];
566 elif [ ${JACK_VERSION_MIDDLE} -gt 121 ];
570 elif [ ${JACK_VERSION_MAJOR} -gt 0 ];
574 elif [ "jackdmp" = ${JACK_NAME} ];
576 if [ ${JACK_VERSION_MAJOR} -eq 1 ];
578 if [ ${JACK_VERSION_MIDDLE} -eq 9 ];
580 if [ ${JACK_VERSION_MINOR} -ge 8 ];
584 elif [ ${JACK_VERSION_MIDDLE} -gt 9 ];
588 elif [ ${JACK_VERSION_MAJOR} -gt 1 ];
594 if [ "t" = ${JACK_VERSION_OK} ];
597 echo "Jack Version Check OK (${JACK_VER_STRING})"
601 echo "!!! WARNING !!! - The version of Jack on this system is too old!"
602 echo "Using an old version of Jack is not recommened. Please update"
603 echo "Jack for best results."
605 echo "System Jack version:"
606 echo " ${JACK_VER_STRING}"
608 echo "Recommened minimum versions:"
609 echo " Jack1 - 0.121.3"
610 echo " Jack2 - 1.9.8"
612 read -p "Press ENTER to continue:" BLAH
616 if ! which qjackctl > /dev/null;
619 echo "The program QjackCtl is missing from this system."
620 echo "QjackCtl is an extremely useful tool for any system that runs JACK applications like $PGM_NAME."
621 echo "We recommend that you install it."
624 ANSWER=$(VaildateYesNoQuestion "Install QjackCtl using system software repository?")
626 if test "y" = $ANSWER;
628 echo "Attempting to install QjackCtl"
629 SystemInstall "qjackctl"
634 read -p "Press ENTER to continue:" BLAH
640 ########################
642 ########################
644 USER_GROUP_ADJUSTED="f"
646 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -a > /dev/null";
649 echo "System failed the quick sanity check... Looking for the cause"
651 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -rt > /dev/null";
654 echo "System does not allow realtime for the current user... Looking for a solution"
656 if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -hasaudiogroup > /dev/null";
658 if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -memberaudiogroup > /dev/null 2>&1";
660 ## This is an odd case. We have an audio group and are a member.
662 echo "!!! WARNING !!! - The current user can not execute realtime processes."
663 echo "This will adversely affect audio latency."
664 echo "This system has an audio group and the user is a member. If jack was"
665 echo "just installed, a simple log out/in may fix this."
667 echo "For best results, please correct this on your system."
668 echo "(Hint: check /etc/security/limits.conf or /etc/security/limits.d/)"
670 read -p "Press ENTER to continue:" BLAH
672 # Not a member of an audio group. Try to fix it.
674 if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -hasgroup audio > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@audio.*rtprio" ";
676 # add user to audio group
678 echo "Adding user ${USER_NAME} to the audio group."
679 echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
681 read -p "Press ENTER to continue:" BLAH
683 if ${SUPER} usermod -a -G audio ${USER_NAME};
685 USER_GROUP_ADJUSTED="t"
688 echo "!!! ERROR !!! - Not able to add user to the audio group (usermod failed)!"
690 echo "Please add yourself to the audio group and re-login"
692 read -p "Press ENTER to continue:" BLAH
695 elif ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -hasgroup jackuser > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@jackuser.*rtprio" ";
697 # add user to jackuser group
699 echo "Adding user ${USER_NAME} to the jackuser group."
700 echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
702 read -p "Press ENTER to continue:" BLAH
704 if ${SUPER} usermod -a -G jackuser ${USER_NAME};
706 USER_GROUP_ADJUSTED="t"
709 echo "!!! ERROR !!! - Not able to add user to the jackuser group."
711 echo "Please add yourself to the audio group and re-login"
713 read -p "Press ENTER to continue:" BLAH
720 # No audio group found on this system!
722 echo "!!! WARNING !!! - The system does not seem to have an audio group (audio or jackuser)."
724 echo "We will not attempt to fix this. Please configure your system to allow"
725 echo "non-root users to execute realtime tasks."
727 read -p "Press ENTER to continue:" BLAH
731 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -freqscaling > /dev/null";
734 echo "!!! WARNING !!! - Your system seems to use frequency scaling."
735 echo "This can have a serious impact on audio latency."
736 echo "For best results turn it off, e.g. by chosing the 'performance' governor."
738 read -p "Press ENTER to continue:" BLAH
741 if [ "f" = $USER_GROUP_ADJUSTED ];
743 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -memlock > /dev/null";
746 echo "!!! WARNING !!! - You are not allowed to lock memory."
748 echo "We will not attempt to fix this. Please configure your system to allow"
749 echo "non-root users to execute lock memory."
751 read -p "Press ENTER to continue:" BLAH
757 ########################
759 ########################
763 rm -rf ${BUNDLE_DIR}/
766 echo "!!! Install Complete !!!"
768 if [ "t" = $USER_GROUP_ADJUSTED ];
770 echo "You will need to logout and then login again for all changes to be complete"
774 read -p "Press ENTER to exit installer:" BLAH