installJRMC 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  1. #!/usr/bin/env bash
  2. # This script will download, build, and install JRiver Media Center with optional systemd services
  3. # on Fedora, CentOS, Debian, and Ubuntu
  4. #
  5. # To-dos:
  6. # 1. Raspberry Pi support -- do not own one so difficult to test
  7. # 2. Arch support -- would love some testing and PRs
  8. # 3. ncurses graphical installer
  9. shopt -s extglob
  10. installJRMC () {
  11. ########################
  12. ####### DEFAULTS #######
  13. ########################
  14. _scriptversion="0.1"
  15. [[ -z "$_boardurl" ]] && \
  16. _boardurl="https://yabb.jriver.com/interact/index.php/board,64.0.html"
  17. [[ -z "$_outputdir" ]] && \
  18. _outputdir="$_basedir/output"
  19. [[ -z $_createrepo_webroot ]] && \
  20. _createrepo_webroot="/srv/jriver"
  21. [[ -z $_createrepo_user ]] && \
  22. _createrepo_user="$(whoami)"
  23. [[ -z $_user ]] && \
  24. _user="$(whoami)"
  25. [[ -z $_display ]] && \
  26. _display="${DISPLAY:-":0"}"
  27. ########################
  28. ###### FUNCTIONS #######
  29. ########################
  30. _printHelpAndExit () {
  31. cat <<-'EOF'
  32. USAGE:
  33. installJRMC [[OPTION] [VALUE]]...
  34. OPTIONS
  35. --rpmbuild
  36. Build RPM from source DEB (Default: install MC from repository)
  37. This will build the RPM on all OSes, and additionally install it on Fedora/CentOS
  38. --outputdir PATH
  39. Generate rpmbuild output in this directory (Default: the current working directory)
  40. --mcversion VERSION
  41. Build or install a specific version (Default: scrape the latest version from Interact)
  42. --restorefile RESTOREFILE
  43. Restore file location for registration (Default: skip registration)
  44. --boardurl URL
  45. Interact board url to scrape for latest version number (Default: see DEFAULTS)
  46. --deburl URL
  47. Specify URL to source DEB package (Default: automatic)
  48. --betapass PASSWORD
  49. Enter beta team password for access to beta builds
  50. --service SERVICE
  51. See SERVICES section below for a list of possible service to install
  52. -v|--version
  53. Print this script version and exit
  54. -d|--debug
  55. Enter debug mode
  56. -h|--help
  57. Print help dialog and exit
  58. -u|--uninstall
  59. Uninstall JRiver MC, cleanup service files, and remove firewall rules (does not remove
  60. library files)
  61. CREATEREPO
  62. --createrepo
  63. Build rpm, copy to webroot, and run createrepo
  64. --createrepo-webroot PATH
  65. The webroot directory to install the repo (Default: /srv/jriver/)
  66. --createrepo-user USER
  67. The web server user (Default: current user)
  68. SERVICES
  69. mediaserver
  70. Create and enable a JRiver MC Media Server systemd service for the current user
  71. x11vnc-mediaserver
  72. Create and enable a JRiver MC mediaserver service and x11vnc (for headless
  73. installations without an existing X server) service for the current user
  74. --vncpass PASSWORD
  75. Set vnc password for x11vnc access. If no password is set, the script will either use
  76. existing password stored in ~/.vnc/jrmc_passwd or use no password
  77. --display DISPLAY
  78. Start X11VNC on this display (Default: The current display or :0 if current display is
  79. unaccessible)
  80. createrepo
  81. Install service to build latest MC RPM and run createrepo hourly for the current user
  82. EOF
  83. # Exit using passed exit code
  84. [[ -z $1 ]] && exit 0 || exit "$1"
  85. }
  86. _parseInput () {
  87. if _input=$(getopt -o +vdhu -l rpmbuild,outputdir:,mcversion:,restorefile:,boardurl:,deburl:,betapass:,service:,version,debug,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,vncpass:,display: -- "$@"); then
  88. eval set -- "$_input"
  89. while true; do
  90. case "$1" in
  91. --rpmbuild)
  92. _rpmbuild="true"
  93. ;;
  94. --outputdir)
  95. shift && _outputdir="$1"
  96. ;;
  97. --mcversion)
  98. shift && _mcversion="$1"
  99. ;;
  100. --restorefile)
  101. shift && _restorefile="$1"
  102. ;;
  103. --boardurl)
  104. shift && _boardurl="$1"
  105. ;;
  106. --deburl)
  107. shift && _deburl="$1"
  108. ;;
  109. --betapass)
  110. shift && _betapass="$1"
  111. ;;
  112. --service)
  113. shift && _service="$1"
  114. ;;
  115. --version|-v)
  116. echo "Version: $_scriptversion"
  117. exit 0
  118. ;;
  119. --debug|-d)
  120. echo "Debugging on"
  121. _debug="true"
  122. ;;
  123. --help|-h)
  124. _printHelpAndExit 0
  125. ;;
  126. --uninstall|-u)
  127. _uninstall="true"
  128. ;;
  129. --createrepo)
  130. _createrepo="true"
  131. ;;
  132. --createrepo-webroot)
  133. shift && _createrepo_webroot="$1"
  134. ;;
  135. --createrepo-user)
  136. shift && _createrepo_user="$1"
  137. ;;
  138. --vncpass)
  139. shift && _vncpass="$1"
  140. ;;
  141. --display)
  142. shift && _display="$1"
  143. ;;
  144. --)
  145. shift
  146. break
  147. ;;
  148. esac
  149. shift
  150. done
  151. else
  152. echo "Incorrect options provided"
  153. _printHelpAndExit 1
  154. fi
  155. }
  156. _checkUser () {
  157. if [[ "$_user" == "root" ]]; then
  158. cat <<EOF
  159. Warning! You are currently running installJRMC as the root user. This is not recommended! When
  160. running as a regular user, installJRMC will ask you for your sudo password when necessary.
  161. Installation will continue but any systemd services will be installed as system services and you
  162. may run into permissions issues.
  163. EOF
  164. else
  165. [[ -n $_debug ]] && echo "Installing as user: $_user"
  166. fi
  167. }
  168. _getOS () {
  169. if [[ -e /etc/os-release ]]; then
  170. source /etc/os-release
  171. else
  172. echo "No /etc/os-release found!"
  173. echo "Your OS is unsupported"
  174. _printHelpAndExit 1
  175. fi
  176. }
  177. _buildCommands () {
  178. # build some basic command arrays based on OS and user input
  179. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  180. _install_cmd=("dnf" "install" "-y")
  181. _update_cmd=("dnf" "makecache" "-y")
  182. _pkg_query_cmd=("rpm" "-q")
  183. elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
  184. _install_cmd=("apt-get" "install" "-y")
  185. _update_cmd=("apt-get" "update" "-y")
  186. _pkg_query_cmd=("dpkg" "-l")
  187. fi
  188. _bash_cmd=("bash" "-c")
  189. _install_cmd_nogpg=("${_install_cmd[@]}" "--nogpgcheck")
  190. # append sudo for non-root users
  191. if [[ "$_user" != "root" ]]; then
  192. _install_cmd=("sudo" "${_install_cmd[@]}")
  193. _install_cmd_nogpg=("sudo" "${_install_cmd_nogpg[@]}")
  194. _update_cmd=("sudo" "${_update_cmd[@]}")
  195. _bash_cmd=("sudo" "${_bash_cmd[@]}")
  196. #_pkg_query_cmd=("sudo" "${_pkg_query_cmd[@]}")
  197. fi
  198. [[ -n $_debug ]] && \
  199. echo "Install command: " "${_install_cmd[@]}" && \
  200. echo "Update command: " "${_update_cmd[@]}" && \
  201. echo "Bash command: " "${_bash_cmd[@]}" && \
  202. echo "Package query command: " "${_pkg_query_cmd[@]}"
  203. }
  204. _installPackage () {
  205. # We will add packages to this array if their command is not available
  206. local -a _pkg_array
  207. local -a _url_pkg_array
  208. # parse commands
  209. for _pkg in "$@"; do
  210. # Clean up package name and handle OS-specific tweaks
  211. _pkg=$(_packageOverrides "$_pkg")
  212. # Insert the package name to test if already installed
  213. if [[ "$_pkg" != "" ]] && ! "${_pkg_query_cmd[@]}" "$_pkg" > /dev/null 2>&1; then
  214. if [[ -n $_url_pkg ]]; then
  215. _url_pkg_array+=("$_url_pkg")
  216. else
  217. _pkg_array+=("$_pkg")
  218. fi
  219. fi
  220. done
  221. if [[ ${#_pkg_array[@]} -ge 1 ]]; then
  222. [[ -n $_debug ]] && echo "Installing: " "${_pkg_array[@]}"
  223. "${_install_cmd[@]}" "${_pkg_array[@]}" > /dev/null 2>&1
  224. fi
  225. if [[ ${#_url_pkg_array[@]} -ge 1 ]]; then
  226. [[ -n $_debug ]] && echo "Installing: " "${_url_pkg_array[@]}"
  227. "${_install_cmd_nogpg[@]}" "${_url_pkg_array[@]}" > /dev/null 2>&1
  228. fi
  229. }
  230. _packageOverrides () {
  231. unset _url_pkg
  232. if [[ "$1" == "rpm-build" && "$ID" =~ ^(ubuntu|debian)$ ]]; then
  233. echo "rpm"
  234. elif [[ "$1" == "createrepo_c" && "$ID" =~ ^(ubuntu|debian)$ ]]; then
  235. echo "createrepo"
  236. elif [[ "$1" == "rpmfusion-free-release" ]]; then
  237. if [[ "$ID" == "fedora" ]]; then
  238. _url_pkg="https://download1.rpmfusion.org/free/$ID/rpmfusion-free-release-$VERSION_ID.noarch.rpm"
  239. echo "$1"
  240. elif [[ "$ID" == "centos" ]]; then
  241. _url_pkg="https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$VERSION_ID.noarch.rpm"
  242. echo "$1"
  243. else
  244. echo ""
  245. fi
  246. elif [[ "$1" == "epel-release" && "$ID" != "centos" ]]; then
  247. echo ""
  248. else
  249. echo "$1"
  250. fi
  251. }
  252. _setVersion () {
  253. if [[ -z "$_mcversion" ]]; then
  254. _installPackage wget
  255. # Get latest version from Interact
  256. echo -n "Scraping latest MC version number from Interact..."
  257. if ! _mcversion=$(wget -qO- "$_boardurl" | grep -o "[0-9][0-9]\.[0-9]\.[0-9]\+" | head -n 1); then
  258. echo "MC version could not be scraped. Please specify a version manually using --mcversion or check your --boardurl"
  259. fi
  260. fi
  261. if [[ "$_mcversion" =~ ^[0-9]+.[0-9].[0-9]+ ]]; then
  262. echo "$_mcversion"
  263. else
  264. echo "MC version: $_mcversion could not be parsed!"
  265. _printHelpAndExit 1
  266. fi
  267. # Extract major and variation version numbers
  268. _mversion="${_mcversion%%.*}"
  269. #_variation="${_mcversion##*.}"
  270. }
  271. _sanityChecks () {
  272. # Cannot create a repo without an rpm
  273. if [[ -n $_createrepo ]]; then
  274. _rpmbuild="true"
  275. fi
  276. # Check for bad service name
  277. if [[ -n $_service && ! "$_service" =~ ^(mediaserver|x11vnc-mediaserver|createrepo)$ ]]; then
  278. echo "Incorrect service type provided!"
  279. _printHelpAndExit 1
  280. fi
  281. }
  282. _installExternalRepos () {
  283. _installPackage rpmfusion-free-release epel-release
  284. }
  285. _installRepo () {
  286. _installPackage wget gnupg
  287. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  288. "${_bash_cmd[@]}" 'cat <<-EOF > /etc/yum.repos.d/jriver.repo
  289. [jriver]
  290. name=JRiver Media Center repo by BryanC
  291. baseurl=https://repos.bryanroessler.com/jriver
  292. gpgcheck=0
  293. EOF'
  294. [[ -n $_debug ]] && cat /etc/yum.repos.d/jriver.repo
  295. echo "Installing latest JRiver Media Center from repo..."
  296. if "${_update_cmd[@]}" && "${_install_cmd[@]}" MediaCenter > /dev/null 2>&1; then
  297. echo "JRiver Media Center installed successfully!"
  298. echo "You can check for future MC updates by running \"sudo dnf update\""
  299. else
  300. echo "JRiver Media Center installation failed!"
  301. _printHelpAndExit 1
  302. fi
  303. elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
  304. if [[ $_user != "root" ]]; then
  305. wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | sudo apt-key add - > /dev/null 2>&1
  306. sudo wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/jriver.list" > /dev/null 2>&1
  307. else
  308. wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | apt-key add - > /dev/null 2>&1
  309. wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/jriver.list" > /dev/null 2>&1
  310. fi
  311. [[ -n $_debug ]] && cat "/etc/apt/sources.list.d/jriver.list"
  312. echo "Installing JRiver Media Center from repo..."
  313. if "${_update_cmd[@]}" > /dev/null 2>&1 && "${_install_cmd[@]}" "mediacenter$_mversion" > /dev/null 2>&1; then
  314. echo "JRiver Media Center installed successfully!"
  315. echo "You can check for future MC updates by running \"apt-get update && apt-get dist-upgrade\""
  316. else
  317. echo "JRiver Media Center installation failed!"
  318. _printHelpAndExit 1
  319. fi
  320. fi
  321. }
  322. _acquireDeb () {
  323. # If necessary, create SOURCES dir
  324. [[ ! -d "$_outputdir/SOURCES" ]] && mkdir -p "$_outputdir/SOURCES"
  325. # if $_deburl is set, try it first and overwrite local files
  326. if [[ -n "$_deburl" ]]; then
  327. if wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" "$_deburl"; then
  328. true
  329. else
  330. echo "Your --deburl is broken, trying automatic download instead"
  331. fi
  332. # If deb file already exists, skip download
  333. elif [[ -f "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" ]]; then
  334. echo "Using local DEB file: $_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb"
  335. # Else check beta repo
  336. elif [[ -n $_betapass ]]; then
  337. if wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
  338. "https://files.jriver.com/mediacenter/channels/v${_mversion}/beta/${_betapass}/MediaCenter-${_mcversion}-amd64.deb"; then
  339. true
  340. fi
  341. # Else check test repo
  342. elif wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
  343. "https://files.jriver.com/mediacenter/test/MediaCenter-${_mcversion}-amd64.deb"; then
  344. true
  345. # Else check latest repo
  346. elif wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
  347. "https://files.jriver.com/mediacenter/channels/v${_mversion}/latest/MediaCenter-${_mcversion}-amd64.deb"; then
  348. true
  349. else
  350. echo "Cannot find DEB file. Exiting..." && exit 1
  351. fi
  352. if [[ ! -f "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" ]]; then
  353. echo "Downloaded DEB file missing or corrupted, exiting..."
  354. exit 1
  355. fi
  356. }
  357. _buildRPM () {
  358. # install build dependencies
  359. _installPackage wget dpkg rpm-build
  360. # If necessary, make build directories
  361. [[ ! -d "$_outputdir/SPECS" ]] && mkdir -p "$_outputdir/SPECS"
  362. # rpmbuild uses rpm to check for build dependencies
  363. # this will fail on non-rpm distros
  364. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  365. _build_requires=$'BuildRequires: rpm >= 4.11.0\nBuildRequires: dpkg'
  366. else
  367. _build_requires=''
  368. fi
  369. # Create spec file
  370. bash -c "cat <<EOF > $_outputdir/SPECS/mediacenter.spec
  371. Name: MediaCenter
  372. Version: $_mcversion
  373. Release: 1
  374. Summary: JRiver Media Center
  375. Group: Applications/Media
  376. Source0: http://files.jriver.com/mediacenter/channels/v$_mversion/latest/MediaCenter-$_mcversion-amd64.deb
  377. $_build_requires
  378. BuildArch: x86_64
  379. %define _rpmfilename %%{ARCH}/%%{NAME}-%%{version}.%%{ARCH}.rpm
  380. AutoReq: 0
  381. Requires: glibc >= 2.19
  382. Requires: alsa-lib >= 1.0.28
  383. Requires: libuuid >= 2.25
  384. Requires: libX11 >= 1.6
  385. Requires: libX11-common >= 1.6
  386. Requires: libXext >= 1.3
  387. Requires: libxcb >= 1.1
  388. Requires: libXdmcp >= 1.1
  389. Requires: libstdc++ >= 4.9
  390. Requires: gtk3 >= 3.14
  391. Requires: mesa-libGL
  392. Requires: libglvnd-glx
  393. Requires: pango >= 1.36
  394. Requires: pangox-compat >= 0.0.2
  395. Requires: xdg-utils
  396. Requires: libgomp >= 4.9
  397. Requires: gstreamer1 >= 1.4.4
  398. Requires: gstreamer1-plugins-base >= 1.4.4
  399. Requires: nss >= 3.26
  400. Requires: nspr >= 4.12
  401. Requires: ca-certificates
  402. Requires: python3
  403. Recommends: vorbis-tools >= 1.4.0
  404. Provides: mediacenter$_mversion
  405. License: Copyright 1998-2020, JRiver, Inc. All rights reserved. Protected by U.S. patents #7076468 and #7062468
  406. URL: http://www.jriver.com/
  407. %description
  408. Media Center is more than a world class player.
  409. %global __os_install_post %{nil}
  410. %prep
  411. %build
  412. %install
  413. dpkg -x %{S:0} %{buildroot}
  414. %post -p /sbin/ldconfig
  415. %postun -p /sbin/ldconfig
  416. %files
  417. %{_bindir}/mediacenter$_mversion
  418. %{_libdir}/jriver
  419. %{_datadir}
  420. /etc/security/limits.d/*
  421. EOF"
  422. # skip rebuilding the rpm if it already exists
  423. if [[ -f "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" ]]; then
  424. echo "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm already exists! Skipping build step..."
  425. else
  426. # Run rpmbuild
  427. echo "Building version $_mcversion, please wait..."
  428. if rpmbuild --quiet --define="%_topdir $_outputdir" --define="%_libdir /usr/lib" -bb "$_outputdir/SPECS/mediacenter.spec"; then
  429. echo "Build complete!"
  430. echo "The RPM is located at $_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm"
  431. else
  432. echo "Build failed! Exiting..."
  433. exit 1
  434. fi
  435. fi
  436. }
  437. _runCreateRepo () {
  438. _installPackage createrepo_c
  439. unset _prefix
  440. if [[ $_createrepo_user != "root" ]]; then
  441. _prefix=("sudo" "-u" "$_createrepo_user")
  442. fi
  443. _createrepo_cmd=("createrepo" "-q")
  444. # If the webroot does not exist, create it
  445. if [[ ! -d "$_createrepo_webroot" ]]; then
  446. if ! "${_prefix[@]}" mkdir -p "$_createrepo_webroot"; then
  447. echo "Could not create the createrepo-webroot path!"
  448. echo "Make sure that the createrepo-webroot is writeable by createrepo-user!"
  449. fi
  450. fi
  451. # Copy built rpms to webroot
  452. if "${_prefix[@]}" cp -n "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" "$_createrepo_webroot"; then
  453. echo "Copied $_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm to $_createrepo_webroot/MediaCenter-$_mcversion.x86_64.rpm"
  454. else
  455. echo "Could not copy the RPM to the createrepo-webroot path!"
  456. echo "Make sure that the createrepo-webroot path is writeable by createrepo-user!"
  457. fi
  458. # If repodata exists, append --update to createrepo command
  459. [[ -d "$_createrepo_webroot/repodata" ]] && _createrepo_cmd+=("--update")
  460. # Run createrepo
  461. if "${_prefix[@]}" "${_createrepo_cmd[@]}" "$_createrepo_webroot"; then
  462. echo "Successfully updated repo!"
  463. else
  464. echo "Update repo failed!"
  465. return 1
  466. fi
  467. }
  468. _installRPM () {
  469. # skip installing same version
  470. _installed_ver="$(rpm --query MediaCenter)"
  471. _to_be_installed_ver="MediaCenter-$_mcversion.x86_64"
  472. if [[ $_installed_ver == "$_to_be_installed_ver" ]]; then
  473. echo "JRiver Media Center $_mcversion is already installed! Skipping installation..."
  474. return
  475. fi
  476. # install rpm
  477. if [[ -f "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" ]]; then
  478. echo "Attempting to install version $_mcversion..."
  479. if "${_install_cmd[@]}" "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm"; then
  480. echo "JRiver Media Center $_mcversion was installed successfully!"
  481. else
  482. echo "JRiver Media Center $_mcversion installation failed!"
  483. exit 1
  484. fi
  485. else
  486. echo "$_outputdir/RPMS/x86_64/MediaCenter-${_mcversion}.x86_64.rpm is missing!"
  487. echo "JRiver Media Center ${_mcversion} installation failed!"
  488. exit 1
  489. fi
  490. }
  491. _symlinkCerts () {
  492. if [[ ! -f /etc/ssl/certs/ca-certificates.crt && \
  493. -f /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem ]]; then
  494. echo "Symlinking /etc/ssl/certs/ca-certificates.crt to /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"
  495. if [[ "$_user" == "root" ]]; then
  496. ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt
  497. else
  498. sudo ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt
  499. fi
  500. fi
  501. }
  502. _restoreLicense () {
  503. # Allow user to drop an mjr file next to installJRMC
  504. if [[ -z $_restorefile ]]; then
  505. for _mjr in "$_basedir"/*.mjr; do
  506. [[ $_mjr -nt $_restorefile ]] && _restorefile="$_mjr"
  507. done
  508. fi
  509. # Restore license
  510. if [[ -f "$_restorefile" ]]; then
  511. if ! "mediacenter${_mversion}" /RestoreFromFile "$_restorefile"; then
  512. echo "Automatic license restore failed"
  513. fi
  514. fi
  515. }
  516. _openFirewall () {
  517. # RHEL
  518. if [[ "$ID" =~ ^(fedora|centos)$ ]] && [[ -x $(command -v firewall-cmd) ]]; then
  519. if ! firewall-cmd --get-services | grep -q jriver; then
  520. if [[ "$_user" == "root" ]]; then
  521. _firewallcmd=("firewall-cmd")
  522. else
  523. _firewallcmd=("sudo" "firewall-cmd")
  524. fi
  525. # shellcheck disable=SC2140,SC1079,SC1078
  526. "${_firewallcmd[@]}" --permanent --new-service=jriver > /dev/null 2>&1
  527. "${_firewallcmd[@]}" --permanent --service=jriver --set-description="JRiver Media Center Media Server" > /dev/null 2>&1
  528. "${_firewallcmd[@]}" --permanent --service=jriver --set-short="jriver" > /dev/null 2>&1
  529. "${_firewallcmd[@]}" --permanent --service=jriver --add-port=52100-52200/tcp > /dev/null 2>&1
  530. "${_firewallcmd[@]}" --permanent --service=jriver --add-port=1900/udp > /dev/null 2>&1
  531. "${_firewallcmd[@]}" --reload > /dev/null 2>&1
  532. fi
  533. # Ubuntu
  534. elif [[ "$ID" =~ ^(ubuntu|debian)$ ]] && [[ -x $(command -v ufw) ]]; then
  535. if [[ ! -f "/etc/ufw/applications.d/jriver.service" ]]; then
  536. "${_bash_cmd[@]}" "cat <<-EOF > /etc/ufw/applications.d/jriver.service
  537. [jriver]
  538. title=JRiver Media Center
  539. description=Allows JRiver Media Server access
  540. ports=52100:52200/tcp|1900/udp
  541. EOF"
  542. fi
  543. # Enable service
  544. if [[ "$_user" == "root" ]]; then
  545. ufw allow jriver > /dev/null 2>&1
  546. else
  547. sudo ufw allow jriver > /dev/null 2>&1
  548. fi
  549. fi
  550. }
  551. _setVNCPass () {
  552. if [[ "$_user" == "root" ]]; then
  553. _vncpassfile="/root/.vnc/jrmc_passwd"
  554. else
  555. _vncpassfile="$HOME/.vnc/jrmc_passwd"
  556. fi
  557. if [[ -n $_vncpass ]]; then
  558. # Remove existing password file if it exists and write a new one
  559. [[ -f "$_vncpassfile" ]] && rm -f "$_vncpassfile"
  560. x11vnc -storepasswd "$_vncpass" "$_vncpassfile"
  561. # Else disable authentication
  562. elif [[ ! -f "$_vncpassfile" ]]; then
  563. _novncauth="true"
  564. fi
  565. }
  566. _systemctlReloadAndEnable () {
  567. [[ -n $_debug ]] && echo "Enabling $1"
  568. if [[ "$_user" == "root" ]]; then
  569. systemctl daemon-reload
  570. systemctl enable --now "$1"
  571. else
  572. sudo systemctl daemon-reload
  573. sudo systemctl enable --now "$1"
  574. fi
  575. }
  576. _generateServiceVars () {
  577. unset _service_fname _service_name _timer_fname _timer_name _user_specifier
  578. if [[ "$_user" == "root" ]]; then
  579. _service_fname="/usr/lib/systemd/system/$1.service"
  580. _timer_fname="/usr/lib/systemd/system/$1.timer"
  581. _service_name="$1.service"
  582. _timer_name="$1.timer"
  583. _user_specifier=""
  584. else
  585. _service_fname="/usr/lib/systemd/system/$1@.service"
  586. _timer_fname="/usr/lib/systemd/system/$1@.timer"
  587. _service_name="$1@$_user.service"
  588. _timer_name="$1@$_user.timer"
  589. _user_specifier="User=%I"
  590. fi
  591. }
  592. _serviceMediaserver () {
  593. _generateServiceVars "jriver-mediaserver"
  594. "${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
  595. [Unit]
  596. Description=JRiver Media Center $_mversion Media Server
  597. After=graphical.target
  598. [Service]
  599. $_user_specifier
  600. Type=simple
  601. Environment=DISPLAY=$_display
  602. ExecStart=/usr/bin/mediacenter$_mversion /MediaServer
  603. Restart=always
  604. RestartSec=10
  605. KillSignal=SIGHUP
  606. TimeoutStopSec=30
  607. [Install]
  608. WantedBy=graphical.target
  609. EOF"
  610. _systemctlReloadAndEnable "$_service_name"
  611. }
  612. _serviceX11VNC () {
  613. _installPackage x11vnc
  614. _setVNCPass
  615. _generateServiceVars "jriver-x11vnc"
  616. if [[ "$_novncauth" == "true" ]]; then
  617. _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -auth guess -forever -bg -nopw"
  618. else
  619. _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -rfbauth $HOME/.vnc/jrmc_passwd -auth guess -forever -bg"
  620. fi
  621. "${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
  622. [Unit]
  623. Description=x11vnc
  624. After=display-manager.service
  625. [Service]
  626. $_user_specifier
  627. Type=forking
  628. Environment=DISPLAY=$_display
  629. ExecStart=$_exec_start_cmd
  630. Restart=always
  631. RestartSec=10
  632. [Install]
  633. WantedBy=default.target
  634. EOF"
  635. _systemctlReloadAndEnable "$_service_name"
  636. }
  637. _serviceCreaterepo () {
  638. _generateServiceVars "jriver-createrepo"
  639. "${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
  640. [Unit]
  641. Description=Builds JRiver Media Center RPM file, moves it to the repo dir, and runs createrepo
  642. [Service]
  643. $_user_specifier
  644. ExecStart=$_basedir/installJRMC --outputdir $_outputdir --createrepo --createrepo-webroot $_createrepo_webroot --createrepo-user $_createrepo_user
  645. [Install]
  646. WantedBy=default.target
  647. EOF"
  648. "${_bash_cmd[@]}" "cat <<-EOF > $_timer_fname
  649. [Unit]
  650. Description=Run JRiver MC rpmbuild hourly
  651. [Timer]
  652. OnCalendar=hourly
  653. Persistent=true
  654. [Install]
  655. WantedBy=timers.target
  656. EOF"
  657. _systemctlReloadAndEnable "$_timer_name"
  658. }
  659. _uninstall () {
  660. read -r -p "Do you really want to uninstall all JRiver Media Center files? [y/N] " _response
  661. _response=${_response,,} # tolower
  662. [[ ! "$_response" =~ ^(yes|y)$ ]] && echo "Cancelling uninstall..." && exit 0
  663. echo "Stopping and disabling all Media Center services"
  664. sudo systemctl disable --now jriver-createrepo.timer jriver-x11vnc.service jriver-mediaserver.service
  665. echo "Removing repo and service files"
  666. for _service in "jriver-mediaserver" "jriver-x11vnc" "jriver-createrepo"; do
  667. [[ -f "/usr/lib/systemd/system/$_service.service" ]] \
  668. && sudo rm -f "/usr/lib/systemd/system/$_service.service"
  669. [[ -f "$HOME/.config/systemd/user/$_service.service" ]] \
  670. && sudo rm -f "$HOME/.config/systemd/user/$_service.service"
  671. done
  672. [[ -e /etc/yum.repos.d/jriver.repo ]] \
  673. && sudo rm -f "/etc/yum.repos.d/jriver.repo"
  674. [[ -e /etc/apt/sources.list.d/jriver.list ]] \
  675. && sudo rm -f "/etc/apt/sources.list.d/jriver.list"
  676. sudo rm /etc/apt/sources.list.d/mediacenter26.list
  677. if [[ -x $(command -v firewall-cmd) ]]; then
  678. echo "Removing firewall rules"
  679. sudo firewall-cmd --permanent --remove-service=jriver
  680. sudo firewall-cmd --permanent --delete-service=jriver
  681. sudo firewall-cmd --reload
  682. fi
  683. if [[ -x $(command -v ufw) ]]; then
  684. echo "Removing firewall rules"
  685. sudo ufw delete allow jriver
  686. [[ -f "/etc/ufw/applications.d/jriver.service" ]] && sudo rm /etc/ufw/applications.d/jriver.service
  687. fi
  688. echo "Uninstalling Media Center"
  689. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  690. sudo dnf remove MediaCenter -y
  691. elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
  692. sudo apt-get remove "mediacenter$_mversion" -y
  693. fi
  694. echo "JRiver Media Center has been completely uninstalled"
  695. [[ "$_user" != "root" ]] && echo "Your library files will remain at $HOME/.jriver"
  696. }
  697. __main () {
  698. # Check user
  699. _checkUser
  700. # Parse input
  701. _parseInput "$@"
  702. # Detect OS
  703. _getOS
  704. # Build some commands based on the selected OS
  705. _buildCommands
  706. # Set version to install/uninstall
  707. _setVersion
  708. # Sanity checks
  709. _sanityChecks
  710. # Uninstall and exit
  711. if [[ -n $_uninstall ]]; then
  712. _uninstall
  713. return $?
  714. fi
  715. # Install external repos
  716. _installExternalRepos
  717. # install MC using package manager (default)
  718. if [[ -z $_rpmbuild ]]; then
  719. _installRepo
  720. _symlinkCerts
  721. _restoreLicense
  722. _openFirewall
  723. else
  724. _acquireDeb
  725. _buildRPM
  726. if [[ -n $_createrepo ]]; then
  727. _runCreateRepo
  728. # Go ahead and install MC from RPM if on a supported platform
  729. elif [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  730. _installRPM
  731. _symlinkCerts
  732. _restoreLicense
  733. _openFirewall
  734. fi
  735. fi
  736. # Install systemd services
  737. if [[ "$_service" == "createrepo" ]]; then
  738. _serviceCreaterepo
  739. elif [[ "$_service" == "x11vnc-mediaserver" ]]; then
  740. _serviceMediaserver
  741. _serviceX11VNC
  742. elif [[ "$_service" == "mediaserver" ]]; then
  743. _serviceMediaserver
  744. fi
  745. }
  746. # Execute main function when called
  747. __main "$@"
  748. }
  749. # Allow this file to be executed directly if not being sourced
  750. if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  751. _basedir=$(dirname "$(readlink -f "$0")")
  752. installJRMC "$@"
  753. fi