installJRMC 30 KB

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