installJRMC 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914
  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" "update" "-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. # parse commands
  208. for _pkg in "$@"; do
  209. _pkg=$(_packageOverrides "$_pkg")
  210. # Insert the package name to test if already installed one element from the end
  211. # and silence output
  212. if ! "${_pkg_query_cmd[@]}" "$_pkg" > /dev/null 2>&1; then
  213. _pkg_array+=("$_pkg")
  214. fi
  215. done
  216. if [[ ${#_pkg_array[@]} -ge 1 ]]; then
  217. echo "Installing ${_pkg_array[*]}"
  218. "${_install_cmd[@]}" "${_pkg_array[@]}" > /dev/null 2>&1
  219. fi
  220. }
  221. _packageOverrides () {
  222. if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then
  223. if [[ "$1" == "rpm-build" ]]; then
  224. echo "rpm"
  225. elif [[ "$1" == "createrepo_c" ]]; then
  226. echo "createrepo"
  227. else
  228. echo "$1"
  229. fi
  230. else
  231. echo "$1"
  232. fi
  233. }
  234. _setVersion () {
  235. if [[ -z "$_mcversion" ]]; then
  236. _installPackage wget
  237. # Get latest version from Interact
  238. echo "Scraping MC version number from Interact..."
  239. if ! _mcversion=$(wget -qO- "$_boardurl" | grep -o "[0-9][0-9]\.[0-9]\.[0-9]\+" | head -n 1); then
  240. echo "MC version could not be scraped. Please specify a version manually using --mcversion or check your --boardurl"
  241. fi
  242. fi
  243. if [[ "$_mcversion" =~ ^[0-9]+.[0-9].[0-9]+ ]]; then
  244. echo "Using MC version: $_mcversion"
  245. else
  246. echo "MC version: $_mcversion could not be parsed!"
  247. _printHelpAndExit 1
  248. fi
  249. # Extract major and variation version numbers
  250. _mversion="${_mcversion%%.*}"
  251. #_variation="${_mcversion##*.}"
  252. }
  253. _sanityChecks () {
  254. # Cannot create a repo without an rpm
  255. if [[ -n $_createrepo ]]; then
  256. _rpmbuild="true"
  257. fi
  258. # Check for bad service name
  259. if [[ -n $_service && ! "$_service" =~ ^(mediaserver|x11vnc-mediaserver|createrepo)$ ]]; then
  260. echo "Incorrect service type provided!"
  261. _printHelpAndExit 1
  262. fi
  263. }
  264. _installExternalRepos () {
  265. if [[ "$ID" == "fedora" ]]; then
  266. if ! rpm --quiet --query rpmfusion-free-release; then
  267. echo "Installing rpmfusion-free-release repo..."
  268. "${_install_cmd_nogpg[@]}" "https://download1.rpmfusion.org/free/$ID/rpmfusion-free-release-$VERSION_ID.noarch.rpm" > /dev/null 2>&1
  269. fi
  270. elif [[ "$ID" == "centos" ]]; then
  271. if ! rpm --quiet --query epel-release; then
  272. echo "Installing epel-release repo..."
  273. "${_install_cmd_nogpg[@]}" epel-release > /dev/null 2>&1
  274. fi
  275. if ! rpm --quiet --query rpmfusion-free-release; then
  276. echo "Installing rpmfusion-free-release repo..."
  277. "${_install_cmd_nogpg[@]}" "https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$VERSION_ID.noarch.rpm" > /dev/null 2>&1
  278. fi
  279. fi
  280. }
  281. _installRepo () {
  282. _installPackage wget gnupg
  283. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  284. "${_bash_cmd[@]}" 'cat <<-EOF > /etc/yum.repos.d/jriver.repo
  285. [jriver]
  286. name=JRiver Media Center repo by BryanC
  287. baseurl=https://repos.bryanroessler.com/jriver
  288. gpgcheck=0
  289. EOF'
  290. [[ -n $_debug ]] && cat /etc/yum.repos.d/jriver.repo
  291. echo "Installing latest JRiver Media Center from repo..."
  292. if "${_update_cmd[@]}" && "${_install_cmd[@]}" MediaCenter; then
  293. echo "JRiver Media Center installed successfully!"
  294. echo "You can check for future MC updates by running \"sudo dnf update\""
  295. else
  296. echo "JRiver Media Center installation failed!"
  297. _printHelpAndExit 1
  298. fi
  299. elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
  300. if [[ $_user != "root" ]]; then
  301. wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | sudo apt-key add -
  302. sudo wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/jriver.list"
  303. else
  304. wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | apt-key add -
  305. wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/jriver.list"
  306. fi
  307. [[ -n $_debug ]] && cat "/etc/apt/sources.list.d/jriver.list"
  308. echo "Installing latest JRiver Media Center from repo..."
  309. if "${_update_cmd[@]}" && "${_install_cmd[@]}" "mediacenter$_mversion"; then
  310. echo "JRiver Media Center installed successfully!"
  311. echo "You can check for future MC updates by running \"apt-get update && apt-get dist-upgrade\""
  312. else
  313. echo "JRiver Media Center installation failed!"
  314. _printHelpAndExit 1
  315. fi
  316. fi
  317. }
  318. _acquireDeb () {
  319. # If necessary, create SOURCES dir
  320. [[ ! -d "$_outputdir/SOURCES" ]] && mkdir -p "$_outputdir/SOURCES"
  321. # if $_deburl is set, try it first and overwrite local files
  322. if [[ -n "$_deburl" ]]; then
  323. if wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" "$_deburl"; then
  324. true
  325. else
  326. echo "Your --deburl is broken, trying automatic download instead"
  327. fi
  328. # If deb file already exists, skip download
  329. elif [[ -f "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" ]]; then
  330. echo "Using local DEB file: $_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb"
  331. # Else check beta repo
  332. elif [[ -n $_betapass ]]; then
  333. if wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
  334. "https://files.jriver.com/mediacenter/channels/v${_mversion}/beta/${_betapass}/MediaCenter-${_mcversion}-amd64.deb"; then
  335. true
  336. fi
  337. # Else check test repo
  338. elif wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
  339. "https://files.jriver.com/mediacenter/test/MediaCenter-${_mcversion}-amd64.deb"; then
  340. true
  341. # Else check latest repo
  342. elif wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
  343. "https://files.jriver.com/mediacenter/channels/v${_mversion}/latest/MediaCenter-${_mcversion}-amd64.deb"; then
  344. true
  345. else
  346. echo "Cannot find DEB file. Exiting..." && exit 1
  347. fi
  348. if [[ ! -f "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" ]]; then
  349. echo "Downloaded DEB file missing or corrupted, exiting..."
  350. exit 1
  351. fi
  352. }
  353. _buildRPM () {
  354. # install build dependencies
  355. _installPackage wget dpkg rpm-build
  356. # If necessary, make build directories
  357. [[ ! -d "$_outputdir/SPECS" ]] && mkdir -p "$_outputdir/SPECS"
  358. # rpmbuild uses rpm to check for build dependencies
  359. # this will fail on non-rpm distros
  360. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  361. _build_requires=$'BuildRequires: rpm >= 4.11.0\nBuildRequires: dpkg'
  362. else
  363. _build_requires=''
  364. fi
  365. # Create spec file
  366. bash -c "cat <<EOF > $_outputdir/SPECS/mediacenter.spec
  367. Name: MediaCenter
  368. Version: $_mcversion
  369. Release: 1
  370. Summary: JRiver Media Center
  371. Group: Applications/Media
  372. Source0: http://files.jriver.com/mediacenter/channels/v$_mversion/latest/MediaCenter-$_mcversion-amd64.deb
  373. $_build_requires
  374. BuildArch: x86_64
  375. %define _rpmfilename %%{ARCH}/%%{NAME}-%%{version}.%%{ARCH}.rpm
  376. AutoReq: 0
  377. Requires: glibc >= 2.19
  378. Requires: alsa-lib >= 1.0.28
  379. Requires: libuuid >= 2.25
  380. Requires: libX11 >= 1.6
  381. Requires: libX11-common >= 1.6
  382. Requires: libXext >= 1.3
  383. Requires: libxcb >= 1.1
  384. Requires: libXdmcp >= 1.1
  385. Requires: libstdc++ >= 4.9
  386. Requires: gtk3 >= 3.14
  387. Requires: mesa-libGL
  388. Requires: libglvnd-glx
  389. Requires: pango >= 1.36
  390. Requires: pangox-compat >= 0.0.2
  391. Requires: xdg-utils
  392. Requires: libgomp >= 4.9
  393. Requires: gstreamer1 >= 1.4.4
  394. Requires: gstreamer1-plugins-base >= 1.4.4
  395. Requires: nss >= 3.26
  396. Requires: nspr >= 4.12
  397. Requires: ca-certificates
  398. Requires: python3
  399. Recommends: vorbis-tools >= 1.4.0
  400. Provides: mediacenter$_mversion
  401. License: Copyright 1998-2020, JRiver, Inc. All rights reserved. Protected by U.S. patents #7076468 and #7062468
  402. URL: http://www.jriver.com/
  403. %description
  404. Media Center is more than a world class player.
  405. %global __os_install_post %{nil}
  406. %prep
  407. %build
  408. %install
  409. dpkg -x %{S:0} %{buildroot}
  410. %post -p /sbin/ldconfig
  411. %postun -p /sbin/ldconfig
  412. %files
  413. %{_bindir}/mediacenter$_mversion
  414. %{_libdir}/jriver
  415. %{_datadir}
  416. /etc/security/limits.d/*
  417. EOF"
  418. # skip rebuilding the rpm if it already exists
  419. if [[ -f "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" ]]; then
  420. echo "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm already exists! Skipping build step..."
  421. else
  422. # Run rpmbuild
  423. echo "Building version $_mcversion, please wait..."
  424. if rpmbuild --quiet --define="%_topdir $_outputdir" --define="%_libdir /usr/lib" -bb "$_outputdir/SPECS/mediacenter.spec"; then
  425. echo "Build complete!"
  426. echo "The RPM is located at $_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm"
  427. else
  428. echo "Build failed! Exiting..."
  429. exit 1
  430. fi
  431. fi
  432. }
  433. _runCreateRepo () {
  434. _installPackage createrepo_c
  435. unset _prefix
  436. if [[ $_createrepo_user != "root" ]]; then
  437. _prefix=("sudo" "-u" "$_createrepo_user")
  438. fi
  439. _createrepo_cmd=("createrepo" "-q")
  440. # If the webroot does not exist, create it
  441. if [[ ! -d "$_createrepo_webroot" ]]; then
  442. if ! "${_prefix[@]}" mkdir -p "$_createrepo_webroot"; then
  443. echo "Could not create the createrepo-webroot path!"
  444. echo "Make sure that the createrepo-webroot is writeable by createrepo-user!"
  445. fi
  446. fi
  447. # Copy built rpms to webroot
  448. if "${_prefix[@]}" cp -n "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" "$_createrepo_webroot"; then
  449. echo "Copied $_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm to $_createrepo_webroot/MediaCenter-$_mcversion.x86_64.rpm"
  450. else
  451. echo "Could not copy the RPM to the createrepo-webroot path!"
  452. echo "Make sure that the createrepo-webroot path is writeable by createrepo-user!"
  453. fi
  454. # If repodata exists, append --update to createrepo command
  455. [[ -d "$_createrepo_webroot/repodata" ]] && _createrepo_cmd+=("--update")
  456. # Run createrepo
  457. if "${_prefix[@]}" "${_createrepo_cmd[@]}" "$_createrepo_webroot"; then
  458. echo "Successfully updated repo!"
  459. else
  460. echo "Update repo failed!"
  461. return 1
  462. fi
  463. }
  464. _installRPM () {
  465. # skip installing same version
  466. _installed_ver="$(rpm --query MediaCenter)"
  467. _to_be_installed_ver="MediaCenter-$_mcversion.x86_64"
  468. if [[ $_installed_ver == "$_to_be_installed_ver" ]]; then
  469. echo "JRiver Media Center $_mcversion is already installed! Skipping installation..."
  470. return
  471. fi
  472. # install rpm
  473. if [[ -f "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" ]]; then
  474. echo "Attempting to install version $_mcversion..."
  475. if "${_install_cmd[@]}" "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm"; then
  476. echo "JRiver Media Center $_mcversion was installed successfully!"
  477. else
  478. echo "JRiver Media Center $_mcversion installation failed!"
  479. exit 1
  480. fi
  481. else
  482. echo "$_outputdir/RPMS/x86_64/MediaCenter-${_mcversion}.x86_64.rpm is missing!"
  483. echo "JRiver Media Center ${_mcversion} installation failed!"
  484. exit 1
  485. fi
  486. }
  487. _symlinkCerts () {
  488. if [[ ! -f /etc/ssl/certs/ca-certificates.crt && \
  489. -f /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem ]]; then
  490. echo "Symlinking /etc/ssl/certs/ca-certificates.crt to /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"
  491. if [[ "$_user" == "root" ]]; then
  492. ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt
  493. else
  494. sudo ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt
  495. fi
  496. fi
  497. }
  498. _restoreLicense () {
  499. # Allow user to drop an mjr file next to installJRMC
  500. if [[ -z $_restorefile ]]; then
  501. for _mjr in "$_basedir"/*.mjr; do
  502. [[ $_mjr -nt $_restorefile ]] && _restorefile="$_mjr"
  503. done
  504. fi
  505. # Restore license
  506. if [[ -f "$_restorefile" ]]; then
  507. if ! "mediacenter${_mversion}" /RestoreFromFile "$_restorefile"; then
  508. echo "Automatic license restore failed"
  509. fi
  510. fi
  511. }
  512. _openFirewall () {
  513. # RHEL
  514. if [[ "$ID" =~ ^(fedora|centos)$ ]] && [[ -x $(command -v firewall-cmd) ]]; then
  515. if ! firewall-cmd --get-services | grep -q jriver; then
  516. if [[ "$_user" == "root" ]]; then
  517. _firewallcmd=("firewall-cmd")
  518. else
  519. _firewallcmd=("sudo" "firewall-cmd")
  520. fi
  521. # shellcheck disable=SC2140,SC1079,SC1078
  522. "${_firewallcmd[@]}" --permanent --new-service=jriver > /dev/null 2>&1
  523. "${_firewallcmd[@]}" --permanent --service=jriver --set-description="JRiver Media Center Media Server" > /dev/null 2>&1
  524. "${_firewallcmd[@]}" --permanent --service=jriver --set-short="jriver" > /dev/null 2>&1
  525. "${_firewallcmd[@]}" --permanent --service=jriver --add-port=52100-52200/tcp > /dev/null 2>&1
  526. "${_firewallcmd[@]}" --permanent --service=jriver --add-port=1900/udp > /dev/null 2>&1
  527. "${_firewallcmd[@]}" --reload > /dev/null 2>&1
  528. fi
  529. # Ubuntu
  530. elif [[ "$ID" =~ ^(ubuntu|debian)$ ]] && [[ -x $(command -v ufw) ]]; then
  531. if [[ ! -f "/etc/ufw/applications.d/jriver.service" ]]; then
  532. "${_bash_cmd[@]}" "cat <<-EOF > /etc/ufw/applications.d/jriver.service
  533. [jriver]
  534. title=JRiver Media Center
  535. description=Allows JRiver Media Server access
  536. ports=52100:52200/tcp|1900/udp
  537. EOF"
  538. fi
  539. # Enable service
  540. if [[ "$_user" == "root" ]]; then
  541. ufw allow jriver
  542. else
  543. sudo ufw allow jriver
  544. fi
  545. fi
  546. }
  547. _setVNCPass () {
  548. if [[ "$_user" == "root" ]]; then
  549. _vncpassfile="/root/.vnc/jrmc_passwd"
  550. else
  551. _vncpassfile="$HOME/.vnc/jrmc_passwd"
  552. fi
  553. if [[ -n $_vncpass ]]; then
  554. # Remove existing password file if it exists and write a new one
  555. [[ -f "$_vncpassfile" ]] && rm -f "$_vncpassfile"
  556. x11vnc -storepasswd "$_vncpass" "$_vncpassfile"
  557. # Else disable authentication
  558. elif [[ ! -f "$_vncpassfile" ]]; then
  559. _novncauth="true"
  560. fi
  561. }
  562. _systemctlReloadAndEnable () {
  563. echo "Enabling $1"
  564. if [[ "$_user" == "root" ]]; then
  565. systemctl daemon-reload
  566. systemctl enable --now "$1"
  567. else
  568. sudo systemctl daemon-reload
  569. sudo systemctl enable --now "$1"
  570. fi
  571. }
  572. _generateServiceVars () {
  573. unset _service_fname _service_name _timer_fname _timer_name _user_specifier
  574. if [[ "$_user" == "root" ]]; then
  575. _service_fname="/usr/lib/systemd/system/$1.service"
  576. _timer_fname="/usr/lib/systemd/system/$1.timer"
  577. _service_name="$1.service"
  578. _timer_name="$1.timer"
  579. _user_specifier=""
  580. else
  581. _service_fname="/usr/lib/systemd/system/$1@.service"
  582. _timer_fname="/usr/lib/systemd/system/$1@.timer"
  583. _service_name="$1@$_user.service"
  584. _timer_name="$1@$_user.timer"
  585. _user_specifier="User=%I"
  586. fi
  587. }
  588. _serviceMediaserver () {
  589. _generateServiceVars "jriver-mediaserver"
  590. "${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
  591. [Unit]
  592. Description=JRiver Media Center $_mversion Media Server
  593. After=graphical.target
  594. [Service]
  595. $_user_specifier
  596. Type=simple
  597. Environment=DISPLAY=$_display
  598. ExecStart=/usr/bin/mediacenter$_mversion /MediaServer
  599. Restart=always
  600. RestartSec=10
  601. KillSignal=SIGHUP
  602. TimeoutStopSec=30
  603. [Install]
  604. WantedBy=graphical.target
  605. EOF"
  606. _systemctlReloadAndEnable "$_service_name"
  607. }
  608. _serviceX11VNC () {
  609. _installPackage x11vnc
  610. _setVNCPass
  611. _generateServiceVars "jriver-x11vnc"
  612. if [[ "$_novncauth" == "true" ]]; then
  613. _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -auth guess -forever -bg -nopw"
  614. else
  615. _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -rfbauth $HOME/.vnc/jrmc_passwd -auth guess -forever -bg"
  616. fi
  617. "${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
  618. [Unit]
  619. Description=x11vnc
  620. After=display-manager.service
  621. [Service]
  622. $_user_specifier
  623. Type=forking
  624. Environment=DISPLAY=$_display
  625. ExecStart=$_exec_start_cmd
  626. Restart=always
  627. RestartSec=10
  628. [Install]
  629. WantedBy=default.target
  630. EOF"
  631. _systemctlReloadAndEnable "$_service_name"
  632. }
  633. _serviceCreaterepo () {
  634. _generateServiceVars "jriver-createrepo"
  635. "${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
  636. [Unit]
  637. Description=Builds JRiver Media Center RPM file, moves it to the repo dir, and runs createrepo
  638. [Service]
  639. $_user_specifier
  640. ExecStart=$_basedir/installJRMC --outputdir $_outputdir --createrepo --createrepo-webroot $_createrepo_webroot --createrepo-user $_createrepo_user
  641. [Install]
  642. WantedBy=default.target
  643. EOF"
  644. "${_bash_cmd[@]}" "cat <<-EOF > $_timer_fname
  645. [Unit]
  646. Description=Run JRiver MC rpmbuild hourly
  647. [Timer]
  648. OnCalendar=hourly
  649. Persistent=true
  650. [Install]
  651. WantedBy=timers.target
  652. EOF"
  653. _systemctlReloadAndEnable "$_timer_name"
  654. }
  655. _uninstall () {
  656. read -r -p "Do you really want to uninstall all JRiver Media Center files? [y/N] " _response
  657. _response=${_response,,} # tolower
  658. [[ ! "$_response" =~ ^(yes|y)$ ]] && echo "Cancelling uninstall..." && exit 0
  659. echo "Stopping and disabling all Media Center services"
  660. sudo systemctl disable --now jriver-createrepo.timer jriver-x11vnc.service jriver-mediaserver.service
  661. echo "Removing repo and service files"
  662. for _service in "jriver-mediaserver" "jriver-x11vnc" "jriver-createrepo"; do
  663. [[ -f "/usr/lib/systemd/system/$_service.service" ]] \
  664. && sudo rm -f "/usr/lib/systemd/system/$_service.service"
  665. [[ -f "$HOME/.config/systemd/user/$_service.service" ]] \
  666. && sudo rm -f "$HOME/.config/systemd/user/$_service.service"
  667. done
  668. [[ -e /etc/yum.repos.d/jriver.repo ]] \
  669. && sudo rm -f "/etc/yum.repos.d/jriver.repo"
  670. [[ -e /etc/apt/sources.list.d/jriver.list ]] \
  671. && sudo rm -f "/etc/apt/sources.list.d/jriver.list"
  672. sudo rm /etc/apt/sources.list.d/mediacenter26.list
  673. if [[ -x $(command -v firewall-cmd) ]]; then
  674. echo "Removing firewall rules"
  675. sudo firewall-cmd --permanent --remove-service=jriver
  676. sudo firewall-cmd --permanent --delete-service=jriver
  677. sudo firewall-cmd --reload
  678. fi
  679. if [[ -x $(command -v ufw) ]]; then
  680. echo "Removing firewall rules"
  681. sudo ufw delete allow jriver
  682. [[ -f "/etc/ufw/applications.d/jriver.service" ]] && sudo rm /etc/ufw/applications.d/jriver.service
  683. fi
  684. echo "Uninstalling Media Center"
  685. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  686. sudo dnf remove MediaCenter -y
  687. elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
  688. sudo apt-get remove "mediacenter$_mversion" -y
  689. fi
  690. echo "JRiver Media Center has been completely uninstalled"
  691. [[ "$_user" != "root" ]] && echo "Your library files will remain at $HOME/.jriver"
  692. }
  693. __main () {
  694. # Check user
  695. _checkUser
  696. # Parse input
  697. _parseInput "$@"
  698. # Detect OS
  699. _getOS
  700. # Build some commands based on the selected OS
  701. _buildCommands
  702. # Set version to install/uninstall
  703. _setVersion
  704. # Sanity checks
  705. _sanityChecks
  706. # Uninstall and exit
  707. if [[ -n $_uninstall ]]; then
  708. _uninstall
  709. return $?
  710. fi
  711. # Install external repos
  712. _installExternalRepos
  713. # install MC using package manager (default)
  714. if [[ -z $_rpmbuild ]]; then
  715. _installRepo
  716. _symlinkCerts
  717. _restoreLicense
  718. _openFirewall
  719. else
  720. _acquireDeb
  721. _buildRPM
  722. if [[ -n $_createrepo ]]; then
  723. _runCreateRepo
  724. # Go ahead and install MC from RPM if on a supported platform
  725. elif [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  726. _installRPM
  727. _symlinkCerts
  728. _restoreLicense
  729. _openFirewall
  730. fi
  731. fi
  732. # Install systemd services
  733. if [[ "$_service" == "createrepo" ]]; then
  734. _serviceCreaterepo
  735. elif [[ "$_service" == "x11vnc-mediaserver" ]]; then
  736. _serviceMediaserver
  737. _serviceX11VNC
  738. elif [[ "$_service" == "mediaserver" ]]; then
  739. _serviceMediaserver
  740. fi
  741. }
  742. # Execute main function when called
  743. __main "$@"
  744. }
  745. # Allow this file to be executed directly if not being sourced
  746. if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  747. _basedir=$(dirname "$(readlink -f "$0")")
  748. installJRMC "$@"
  749. fi