install_MC_fedora.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #!/usr/bin/env bash
  2. shopt -s extglob
  3. # Usage: ./install_MC_fedora.sh [-v|--version] [version] [-b|--build-mode] [-i|--install-repo] [-p|--password]
  4. # e.g. ./install_MC_fedora.sh -v 25.0.48
  5. # If no version number is specified (i.e. ./install_MC_fedora.sh or ./install_MC_fedora.sh -b), the script
  6. # will attempt to install the latest version from Interact
  7. # Beta team members can add the beta password to autoamtically check for beta versions
  8. # URL for latest MC for Linux board (for automatic version scraping)
  9. boardurl="https://yabb.jriver.com/interact/index.php/board,64.0.html"
  10. ##########################
  11. ####### FUNCTIONS ########
  12. ##########################
  13. parse_input_and_version () {
  14. # clear user vars
  15. build_mode=false
  16. install_mode=false
  17. # parse user input
  18. while (( "$#" )); do
  19. case "$1" in
  20. -i |--install-repo )
  21. echo "Installing repo file!"
  22. install_mode=true
  23. ;;
  24. -b |--build-mode )
  25. echo "Using build mode!"
  26. build_mode=true
  27. ;;
  28. -v |--version )
  29. shift
  30. version="$1"
  31. ;;
  32. -p |--password )
  33. shift
  34. betapwd="$1"
  35. ;;
  36. +([0-9]).[0-9].+([0-9]) )
  37. version="$1"
  38. ;;
  39. esac
  40. shift
  41. done
  42. # If version number not supplied by user, scrape Interact
  43. [ -z "$version" ] && version=$(curl -s "$boardurl" | grep -o "2[0-9]\.[0-9]\.[0-9]\+" | head -n 1)
  44. # If no version number is found wait for input for 60 seconds before timing out (so the script will run w/o user input)
  45. [ -z "$version" ] && read -t 60 -p "Version number cannot be scraped, re-enter it now manually, otherwise Ctrl-C to exit: " version
  46. [ -z "$version" ] && echo "No version number available, recheck boardurl, exiting..." && exit 0
  47. # parse version number
  48. variation=${version##*.}
  49. mversion=${version%%.*}
  50. }
  51. find_os () {
  52. if [ "$build_mode" == false ]; then
  53. if [ -e /etc/os-release ]; then
  54. source /etc/os-release
  55. if [ "$ID" == "centos" ] && [ "$VERSION_ID" -ge "8" ]; then
  56. ID="centos"
  57. elif [ "$ID" == "fedora" ]; then
  58. ID="fedora"
  59. elif [ "$install_mode" == false ]; then
  60. echo "You are not running Fedora or CentOS >=8, falling back to build mode..."
  61. build_mode=true
  62. fi
  63. elif [ "$install_mode" == false ]; then
  64. echo "You are not running Fedora or CentOS >=8, falling back to build mode..."
  65. build_mode=true
  66. fi
  67. fi
  68. }
  69. get_source_deb () {
  70. # If necessary, create SOURCES dir
  71. [ -d SOURCES ] || mkdir -p SOURCES
  72. # If deb file exists, skip download
  73. if [ -f $builddir/SOURCES/MediaCenter-${version}-amd64.deb ]; then
  74. echo "Using local DEB file: $builddir/SOURCES/MediaCenter-${version}-amd64.deb"
  75. return
  76. fi
  77. # Acquire DEB
  78. echo "Attempting to download MC $version DEB file..."
  79. curl -so $builddir/SOURCES/MediaCenter-${version}-amd64.deb \
  80. https://files.jriver.com/mediacenter/channels/v${mversion}/latest/MediaCenter-${version}-amd64.deb
  81. if [ $? -ne 0 ]; then
  82. echo "Specified Media Center version not found! Retrying the test repo..."
  83. curl -so $builddir/SOURCES/MediaCenter-${version}-amd64.deb \
  84. https://files.jriver.com/mediacenter/test/MediaCenter-${version}-amd64.deb
  85. fi
  86. if [ $? -ne 0 ]; then
  87. [ -z $betapwd ] && read -t 60 -p "Not found in test repo, if beta version, enter beta password to retry, otherwise Ctrl-C to exit: " betapwd
  88. [ -z $betapwd ] && echo "Cannot find DEB file, re-check version number or beta password. Exiting..." && exit 1
  89. curl -so $builddir/SOURCES/MediaCenter-${version}-amd64.deb \
  90. https://files.jriver.com/mediacenter/channels/v${mversion}/beta/${betapwd}/MediaCenter-${version}-amd64.deb
  91. [ $? -ne 0 ] && echo "Cannot find DEB file, re-check version number or beta password. Exiting..." && exit 1
  92. fi
  93. if [ -f $builddir/SOURCES/MediaCenter-${version}-amd64.deb ]; then
  94. echo "Downloaded MC $version DEB file to $builddir/SOURCES/MediaCenter-${version}-amd64.deb"
  95. else
  96. echo "Downloaded DEB file missing or corrupted, exiting..."
  97. exit 1
  98. fi
  99. }
  100. install_dependencies () {
  101. if [ $build_mode == false ]; then
  102. if [ "$ID" == "fedora" ]; then
  103. if ! rpm --quiet --query rpmfusion-free-release; then echo "Installing rpmfusion-free-release repo..."; \
  104. sudo dnf -y --nogpgcheck install https://download1.rpmfusion.org/free/${ID}/rpmfusion-free-release-${VERSION_ID}.noarch.rpm; fi
  105. if ! rpm --quiet --query rpm-build; then echo "Installing rpm-build from RPMFusion Free..."; sudo dnf install rpm-build -y; fi
  106. if ! rpm --quiet --query dpkg; then echo "Installing dpkg from RPMFusion Free..."; sudo dnf install dpkg -y; fi
  107. elif [ "$ID" == "centos" ]; then
  108. if ! rpm --quiet --query epel-release; then echo "Installing epel-release repo..."; \
  109. sudo dnf -y --nogpgcheck install epel-release; fi
  110. if ! rpm --quiet --query rpmfusion-free-release; then echo "Installing rpmfusion-free-release repo..."; \
  111. sudo dnf -y --nogpgcheck install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-${VERSION_ID}.noarch.rpm; fi
  112. if ! rpm --quiet --query rpm-build; then echo "Installing rpm-build from EPEL..."; sudo dnf install rpm-build -y; fi
  113. if ! rpm --quiet --query dpkg; then echo "Installing dpkg from EPEL..."; sudo dnf install dpkg -y; fi
  114. if ! rpm --quiet --query rpm-build; then echo "Installing rpm-build from EPEL testing..."; sudo dnf install --enablerepo=epel-testing rpm-build -y; fi
  115. if ! rpm --quiet --query dpkg; then echo "Installing dpkg from EPEL testing..."; sudo dnf install --enablerepo=epel-testing dpkg -y; fi
  116. fi
  117. else
  118. command -v rpmbuild >/dev/null 2>&1 || { echo "Please install rpmbuild, cannot continue, aborting..." >&2; exit 1; }
  119. command -v dpkg >/dev/null 2>&1 || { echo "Please install dpkg, cannot continue, aborting..." >&2; exit 1; }
  120. fi
  121. }
  122. build_rpm () {
  123. # If necessary, make build directories
  124. [ -d SPECS ] || mkdir -p SPECS
  125. # skip rebuilding the rpm if it already exists
  126. if [ -f $builddir/RPMS/x86_64/MediaCenter-${mversion}-${variation}.x86_64.rpm ]; then
  127. echo "$builddir/RPMS/x86_64/MediaCenter-${mversion}-${variation}.x86_64.rpm already exists! Skipping build step..."
  128. return
  129. fi
  130. # Create spec file
  131. echo 'Name: MediaCenter' > SPECS/mediacenter.spec
  132. echo 'Version: %{_tversion}' >> SPECS/mediacenter.spec
  133. echo 'Release: %{?_variation:%{_variation}}' >> SPECS/mediacenter.spec
  134. echo 'Summary: JRiver Media Center' >> SPECS/mediacenter.spec
  135. echo 'Group: Applications/Media' >> SPECS/mediacenter.spec
  136. echo "Source0: http://files.jriver.com/mediacenter/channels/v${mversion}/latest/MediaCenter-%{_version}-amd64.deb" >> SPECS/mediacenter.spec
  137. echo '' >> SPECS/mediacenter.spec
  138. if [ $build_mode == false ]; then
  139. echo 'BuildRequires: rpm >= 4.11.0' >> SPECS/mediacenter.spec
  140. echo 'BuildRequires: dpkg' >> SPECS/mediacenter.spec
  141. fi
  142. echo 'BuildArch: x86_64' >> SPECS/mediacenter.spec
  143. echo '' >> SPECS/mediacenter.spec
  144. echo 'AutoReq: 0' >> SPECS/mediacenter.spec
  145. if [ $ID != "centos" ]; then
  146. echo 'Requires: lame' >> SPECS/mediacenter.spec
  147. fi
  148. echo 'Requires: libnotify librtmp vorbis-tools alsa-lib' >> SPECS/mediacenter.spec
  149. echo 'Requires: libX11 libX11-common libxcb libXau libXdmcp libuuid' >> SPECS/mediacenter.spec
  150. echo 'Requires: gtk3 mesa-libGL gnutls libgomp webkit2gtk3 ca-certificates' >> SPECS/mediacenter.spec
  151. echo 'Requires: gstreamer1 gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-plugins-ugly gstreamer1-libav' >> SPECS/mediacenter.spec
  152. echo 'Requires: nss libgomp xdg-utils' >> SPECS/mediacenter.spec
  153. echo '' >> SPECS/mediacenter.spec
  154. echo 'License: Copyright 1998-2019, JRiver, Inc. All rights reserved. Protected by U.S. patents #7076468 and #7062468' >> SPECS/mediacenter.spec
  155. echo 'URL: http://www.jriver.com/' >> SPECS/mediacenter.spec
  156. echo '' >> SPECS/mediacenter.spec
  157. echo '%description' >> SPECS/mediacenter.spec
  158. echo 'Media Center is more than a world class player.' >> SPECS/mediacenter.spec
  159. echo '' >> SPECS/mediacenter.spec
  160. echo '%global __os_install_post %{nil}' >> SPECS/mediacenter.spec
  161. echo '%prep' >> SPECS/mediacenter.spec
  162. echo '' >> SPECS/mediacenter.spec
  163. echo '%build' >> SPECS/mediacenter.spec
  164. echo '' >> SPECS/mediacenter.spec
  165. echo '%install' >> SPECS/mediacenter.spec
  166. echo 'dpkg -x %{S:0} %{buildroot}' >> SPECS/mediacenter.spec
  167. echo '' >> SPECS/mediacenter.spec
  168. echo '%post -p /sbin/ldconfig' >> SPECS/mediacenter.spec
  169. echo '%postun -p /sbin/ldconfig' >> SPECS/mediacenter.spec
  170. echo '' >> SPECS/mediacenter.spec
  171. echo '%files' >> SPECS/mediacenter.spec
  172. echo "%{_bindir}/mediacenter${mversion}" >> SPECS/mediacenter.spec
  173. echo '%{_libdir}/jriver' >> SPECS/mediacenter.spec
  174. echo '%{_datadir}' >> SPECS/mediacenter.spec
  175. echo '/etc/security/limits.d/*' >> SPECS/mediacenter.spec
  176. # Run rpmbuild
  177. cd "$builddir"/SPECS
  178. echo "Building version ${version}, please wait..."
  179. rpmbuild --quiet --define="%_topdir $builddir" --define="%_variation $variation" --define="%_tversion ${mversion}" \
  180. --define="%_version ${version}" --define="%_libdir /usr/lib" -bb mediacenter.spec
  181. }
  182. install_rpm () {
  183. # skip installing same version
  184. installed_ver="$(rpm --query MediaCenter)"
  185. to_be_installed_ver="MediaCenter-${mversion}-${variation}.x86_64"
  186. if [ "$installed_ver" == "$to_be_installed_ver" ]; then
  187. echo "JRiver Media Center $version is already installed! Skipping installation..."
  188. return
  189. fi
  190. # install rpm
  191. if [ -f $builddir/RPMS/x86_64/MediaCenter-${mversion}-${variation}.x86_64.rpm ]; then
  192. echo "Attempting to install version ${version}..."
  193. sudo dnf install $builddir/RPMS/x86_64/MediaCenter-${mversion}-${variation}.x86_64.rpm -y
  194. if [ $? -eq 0 ]; then
  195. echo "JRiver Media Center ${version} was installed successfully!"
  196. else
  197. echo "JRiver Media Center ${version} installation failed!"
  198. exit 1
  199. fi
  200. else
  201. echo "$builddir/RPMS/x86_64/MediaCenter-${mversion}-${variation}.x86_64.rpm is missing!"
  202. echo "JRiver Media Center ${version} installation failed!"
  203. exit 1
  204. fi
  205. }
  206. install_repo () {
  207. echo "Installing repo file to /etc/yum.repos.d/jriver.repo"
  208. sudo bash -c 'cat << EOF > /etc/yum.repos.d/jriver.repo
  209. [jriver]
  210. name=JRiver Media Center repo by BryanC
  211. baseurl=https://repos.bryanroessler.com/jriver
  212. gpgcheck=0
  213. EOF'
  214. echo "Installing latest JRiver Media Center from repo..."
  215. sudo dnf update && sudo dnf install MediaCenter -y
  216. if [ $? -eq 0 ]; then
  217. echo "JRiver Media Center installed successfully!"
  218. echo "You can check for future MC updates by running \"sudo dnf|yum update\""
  219. echo "To remove the repo file run \"sudo rm /etc/yum.repos.d/jriver.repo\""
  220. else
  221. echo "JRiver Media Center installation failed!"
  222. exit 1
  223. fi
  224. }
  225. symlink_certs_and_restore () {
  226. if [ -e "/usr/lib/jriver/Media Center ${mversion}/ca-certificates.crt" ] && [ -e "/usr/lib/jriver/Media Center ${mversion}/local-ca-certificates.crt" ]; then
  227. echo 'Symlinking "/usr/lib/jriver/Media Center ${mversion}/ca-certificates.crt" to "/usr/lib/jriver/Media Center ${mversion}/local-ca-certificates.crt"'
  228. sudo ln -sf "/usr/lib/jriver/Media Center ${mversion}/local-ca-certificates.crt" "/usr/lib/jriver/Media Center ${mversion}/ca-certificates.crt"
  229. read -p "To install your .mjr license, enter the full filepath to your .mjr file, or enter Ctrl-C to skip: " restorefile
  230. while [ ! -z "$restorefile" ] || [ ! -f "$restorefile" ]; do
  231. echo "File not found!"
  232. read -p "To install your .mjr license, enter the full filepath to your .mjr file, or enter Ctrl-C to skip: " restorefile
  233. done
  234. mediacenter${mversion} /RestoreFromFile "$restorefile"
  235. fi
  236. }
  237. ##########################
  238. ######## EXECUTE #########
  239. ##########################
  240. # set build directory to current path
  241. builddir="$(pwd)"
  242. parse_input_and_version "${@}"
  243. [ "$install_mode" == true ] && find_os \
  244. && install_dependencies \
  245. && install_repo \
  246. && symlink_certs_and_restore \
  247. && exit 0
  248. find_os
  249. get_source_deb
  250. install_dependencies
  251. build_rpm
  252. [ "$build_mode" == true ] && exit 0
  253. install_rpm
  254. symlink_certs_and_restore
  255. exit 0