installJRMC 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303
  1. #!/usr/bin/env bash
  2. # This script will install JRiver Media Center and associated services
  3. # on Fedora, CentOS, Debian, and Ubuntu
  4. # Copyright (c) 2021 Bryan C. Roessler
  5. # This software is released under the Apache License.
  6. # https://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Use installJRMC --help to see available options or
  9. # read printHelp() below.
  10. #
  11. # TODO:
  12. # 1. Raspberry Pi OS support
  13. # 2. Interactive installation (ncurses?)
  14. # 3. Additional containerization
  15. shopt -s extglob
  16. _scriptversion="1.0b1"
  17. _outputdir="$PWD/output"
  18. _createrepo_webroot="/var/www/jriver"
  19. _exec_user="$(whoami)"
  20. # MC version
  21. _boardurl="https://yabb.jriver.com/interact/index.php/board,71.0.html" # Media Center 28, only required if buildah is unavailable
  22. # _mcversion="28.0.87" # to set manually
  23. printHelp() {
  24. debug "Running: ${FUNCNAME[0]}"
  25. cat <<- 'EOF'
  26. USAGE:
  27. installJRMC [[OPTION] [VALUE]]...
  28. If no options (besides -d) are provided, the script will default to '--install repo'.
  29. OPTIONS
  30. --install, -i repo|rpm
  31. repo: Install MC from repository, updates are handled by the system package manager
  32. rpm: Build and install RPM locally (RPM-based distros only)
  33. --build
  34. Build RPM from source DEB (but don't install it)
  35. --mcversion VERSION
  36. Specify the MC version, ex. "28.0.25" (Default: latest version)
  37. --outputdir PATH
  38. Generate rpmbuild output in this directory (Default: $PWD/output)
  39. --restorefile RESTOREFILE
  40. Restore file location for automatic license registration (Default: skip registration)
  41. --betapass PASSWORD
  42. Enter beta team password for access to beta builds
  43. --service, -s SERVICE
  44. See SERVICES section below for a list of possible services to install
  45. --service-user USER
  46. Install systemd services and containers for user USER (Default: current user)
  47. --container, -c CONTAINER (TODO: Under construction)
  48. See CONTAINERS section below for a list of possible services to install
  49. --createrepo
  50. Build rpm, copy to webroot, and run createrepo
  51. --createrepo-webroot PATH
  52. The webroot directory to install the repo (Default: /var/www/jriver)
  53. --createrepo-user USER
  54. The web server user (Default: current user)
  55. --version, -v
  56. Print this script version and exit
  57. --debug, -d
  58. Print debug output
  59. --help, -h
  60. Print help dialog and exit
  61. --uninstall, -u
  62. Uninstall JRiver MC, cleanup service files, and remove firewall rules (does not remove library files)
  63. SERVICES
  64. jriver-mediaserver
  65. Enable and start a mediaserver systemd service (requires an existing X server)
  66. jriver-mediacenter
  67. Enable and start a mediacenter systemd service (requires an existing X server)
  68. jriver-x11vnc
  69. Enable and start x11vnc for the local desktop (requires an existing X server)
  70. Usually combined with jriver-mediaserver or jriver-mediacenter services
  71. --vncpass and --display are optional (see 'jriver-xvnc-mediacenter' below)
  72. jriver-xvnc-mediacenter
  73. Enable and start a new Xvnc session running JRiver Media Center
  74. --vncpass PASSWORD
  75. Set vnc password for x11vnc/Xvnc access. If no password is set, the script
  76. will either use existing password stored in ~/.vnc/jrmc_passwd or use no password
  77. --display DISPLAY
  78. Display to start x11vnc/Xvnc (Default: The current display (x11vnc) or the
  79. current display incremented by 1 (Xvnc))
  80. jriver-createrepo
  81. Install hourly service to build latest MC RPM and run createrepo
  82. CONTAINERS (TODO: Under construction)
  83. mediacenter-xvnc
  84. createrepo
  85. EOF
  86. }
  87. init() {
  88. debug "Running: ${FUNCNAME[0]}"
  89. getOS
  90. # Agnostic commands
  91. bash_cmd(){ ifSudo bash -c "$@"; }
  92. rm_cmd(){ ifSudo rm -rf "$@"; }
  93. #cp_cmd(){ ifSudo cp -n "$@"; }
  94. mkdir_cmd(){ ifSudo mkdir -p "$@"; }
  95. ln_cmd(){ ifSudo ln -s "$@"; }
  96. systemctl_reload(){ ifSudo systemctl daemon-reload; }
  97. systemctl_enable(){ ifSudo systemctl enable --now "$@"; }
  98. systemctl_disable(){ ifSudo systemctl disable --now "$@"; }
  99. # OS-specific commands
  100. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  101. pkg_install(){ ifSudo dnf install -y "$@"; }
  102. pkg_reinstall(){ ifSudo dnf reinstall -y "$@"; }
  103. pkg_remove(){ ifSudo dnf remove -y "$@"; }
  104. pkg_update(){ ifSudo dnf makecache; }
  105. pkg_query(){ ifSudo rpm -q "$@"; }
  106. firewall_cmd(){ ifSudo firewall-cmd "$@"; }
  107. elif [[ "$ID" =~ ^(debian|ubuntu|linuxmint)$ ]]; then
  108. pkg_install(){ ifSudo apt-get install -y -q0 "$@"; }
  109. pkg_reinstall(){ ifSudo apt-get reinstall -y -q0 "$@"; }
  110. pkg_remove(){ ifSudo apt-get remove --auto-remove -y -q0 "$@"; }
  111. pkg_update(){ ifSudo apt-get update -y -q0; }
  112. pkg_query(){ ifSudo dpkg -s "$@"; }
  113. firewall_cmd(){ ifSudo ufw "$@"; }
  114. elif [[ "$ID" =~ ^opensuse.* ]]; then
  115. echo "SUSE support is experimental!"
  116. pkg_install(){ ifSudo zypper install -y -q "$@"; }
  117. pkg_reinstall(){ ifSudo zypper install -y -q -f "$@"; }
  118. pkg_remove(){ ifSudo zypper remove --clean-deps -y -q "$@"; }
  119. pkg_update(){ ifSudo zypper update -y -q; }
  120. pkg_query(){ ifSudo rpm -q "$@"; }
  121. firewall_cmd(){ ifSudo firewall-cmd "$@"; }
  122. fi
  123. parseInput "$@"
  124. _service_user="${_service_user:-$_exec_user}"
  125. _createrepo_user="${_createrepo_user:-$_exec_user}"
  126. # Set package aliases
  127. if [[ "$ID" =~ ^(debian|ubuntu|linuxmint)$ ]]; then
  128. declare -Ag PKG_ALIASES
  129. PKG_ALIASES["xorg-x11-utils"]="xorg-x11"
  130. PKG_ALIASES["rpm-build"]="rpm"
  131. PKG_ALIASES["createrepo_c"]="createrepo"
  132. PKG_ALIASES["tigervnc-server"]="tigervnc-standalone-server"
  133. fi
  134. # Install script dependencies
  135. [[ "$ID" == "centos" ]] && installPackage epel-release
  136. # Select MC version to work with
  137. if [[ -v _mcversion ]]; then
  138. _version_source="user input"
  139. else
  140. getLatestVersion
  141. fi
  142. [[ ! "$_mcversion" =~ ([0-9]+.[0-9]+.[0-9]+) ]] && err "Invalid version number" && exit 1
  143. debug "Using MC version $_mcversion determined by $_version_source"
  144. # Extract major version number
  145. _mversion="${_mcversion%%.*}"
  146. # Saving this substituion in case it's needed in the future
  147. # _variation="${_mcversion##*.}"
  148. }
  149. # Some helper functions
  150. askOk() {
  151. local _response
  152. read -r -p "$* [y/N]" _response
  153. _response=${_response,,}
  154. [[ ! "$_response" =~ ^(yes|y)$ ]] && return 1
  155. return 0
  156. }
  157. debug() {
  158. if [[ -v _debug ]]; then
  159. if [[ $# -gt 0 ]]; then
  160. echo "Debug: $*"
  161. fi
  162. else
  163. return 1
  164. fi
  165. }
  166. err() { echo "Error: $*" >&2; }
  167. getOS() {
  168. debug "Running: ${FUNCNAME[0]}"
  169. if [[ -e "/etc/os-release" ]]; then
  170. source "/etc/os-release"
  171. else
  172. err "/etc/os-release not found"
  173. err "Your OS is unsupported"
  174. printHelp && exit 1
  175. fi
  176. debug "Platform: $ID $VERSION_ID"
  177. }
  178. ifSudo() {
  179. declare -l _user="root"
  180. if [[ $# == 0 ]]; then
  181. [[ "$_exec_user" == "root" ]]; return $?
  182. elif [[ $# -eq 2 && "$1" == "-u" ]]; then
  183. _user="$2"
  184. [[ "$_exec_user" == "$_user" ]]; return $?
  185. elif [[ $# -gt 2 && "$1" == "-u" ]]; then
  186. _user="$2"
  187. shift 2
  188. fi
  189. if [[ "$_user" == "$_exec_user" ]]; then
  190. "$@"
  191. else
  192. sudo -u "$_user" "$@"
  193. fi
  194. }
  195. parseInput() {
  196. debug "Running: ${FUNCNAME[0]}"
  197. if [[ $# -eq 0 ]] || [[ $# -eq 1 && "$1" =~ ^(--debug|-d)$ ]]; then
  198. debug "No options passed, defaulting to repo installation method"
  199. _install="repo"
  200. fi
  201. if _input=$(getopt -o +i:vdhus:c: -l install:,build,outputdir:,mcversion:,restorefile:,betapass:,service-user:,service:,version,debug,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,vncpass:,display:,container:,tests -- "$@"); then
  202. eval set -- "$_input"
  203. while true; do
  204. case "$1" in
  205. --install|-i)
  206. shift
  207. _install="$1"
  208. if [[ "$_install" == "rpm" ]]; then
  209. if [[ ! "$ID" =~ ^(fedora|centos|opensuse.*)$ ]]; then
  210. err "RPM install method not available on $ID"
  211. printHelp && exit 1
  212. fi
  213. _build=true
  214. fi
  215. ;;
  216. --build)
  217. _build=true
  218. ;;
  219. --outputdir)
  220. shift && _outputdir="$1"
  221. ;;
  222. --mcversion)
  223. shift && _mcversion="$1"
  224. ;;
  225. --restorefile)
  226. shift && _restorefile="$1"
  227. ;;
  228. --betapass)
  229. shift && _betapass="$1"
  230. ;;
  231. --service-user)
  232. shift && _service_user="$1"
  233. ;;
  234. --service|-s)
  235. shift && _services+=("$1")
  236. ;;
  237. --createrepo)
  238. _build=true
  239. _createrepo=true
  240. ;;
  241. --createrepo-webroot)
  242. shift && _createrepo_webroot="$1"
  243. ;;
  244. --createrepo-user)
  245. shift && _createrepo_user="$1"
  246. ;;
  247. --vncpass)
  248. shift && _vncpass="$1"
  249. ;;
  250. --display)
  251. shift && _display="$1"
  252. ;;
  253. --container|-c)
  254. shift && _containers+=("$1")
  255. ;;
  256. --version|-v)
  257. echo "Version: $_scriptversion"
  258. exit 0
  259. ;;
  260. --debug|-d)
  261. echo "Debugging on"
  262. echo "installJRMC version: $_scriptversion"
  263. _debug="true"
  264. ;;
  265. --help|-h)
  266. printHelp && exit $?
  267. ;;
  268. --uninstall|-u)
  269. _uninstall=true
  270. ;;
  271. --tests)
  272. echo "Running tests, all other options are skipped"
  273. tests
  274. ;;
  275. --)
  276. shift
  277. break
  278. ;;
  279. esac
  280. shift
  281. done
  282. else
  283. err "Incorrect options provided"
  284. printHelp && exit 1
  285. fi
  286. }
  287. #######################################
  288. # Use several methods to determine the latest JRiver MC version
  289. #######################################
  290. getLatestVersion() {
  291. debug "Running: ${FUNCNAME[0]}"
  292. declare -g _mcversion
  293. # Use a containerized package manager
  294. # TODO but how to determine build distro ('buster')?
  295. [[ ! -x $(command -v buildah) ]] && installPackage --silent buildah
  296. if [[ -x $(command -v buildah) ]] && CNT=$(buildah from ubuntu:18.04); then
  297. buildah run "$CNT" -- bash -c \
  298. "echo 'deb [trusted=yes arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ buster main' > /etc/apt/sources.list 2>&1"
  299. buildah run "$CNT" -- bash -c \
  300. "apt-get update --allow-insecure-repositories -y > /dev/null 2>&1"
  301. if _mcversion=$(buildah run "$CNT" -- apt-cache policy mediacenter?? | grep Candidate | awk '{print $2}' | sort -V | tail -n1); then
  302. _version_source="containerized package manager"
  303. fi
  304. buildah rm "$CNT" > /dev/null 2>&1
  305. # Else scrape from Interact
  306. elif _mcversion=$(wget -qO- "$_boardurl" | grep -o "[0-9][0-9]\.[0-9]\.[0-9]\+" | head -n 1); then
  307. _version_source="webscrape"
  308. fi
  309. if ! [[ -v _mcversion ]]; then
  310. err "MC version could not be determined. Please check the boardurl: $_boardurl or specify a version manually using --mcversion"
  311. exit 1
  312. fi
  313. }
  314. #######################################
  315. # Installs a package using the system package manager
  316. # Arguments:
  317. # One or more package names
  318. # Options:
  319. # --no-check: Do not check if package is already installed
  320. # --nogpgcheck: Disable GPG checks for RPM based distros
  321. # --silent, -s: Do not report errors (useful if package is not strictly required and errors are noisy)
  322. #######################################
  323. installPackage() {
  324. debug "Running: ${FUNCNAME[0]}" "$@"
  325. local -a _pkg_array _install_flags
  326. local _pkg
  327. if _input=$(getopt -o +s -l no-check,nogpgcheck,silent -- "$@"); then
  328. eval set -- "$_input"
  329. while true; do
  330. case "$1" in
  331. --no-check)
  332. local _no_check=true
  333. ;;
  334. --nogpgcheck)
  335. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  336. _install_flags+=("--nogpgcheck")
  337. elif [[ "$ID" =~ ^opensuse.* ]]; then
  338. _install_flags+=("--allow-unsigned-rpm")
  339. fi
  340. ;;
  341. --silent|-s)
  342. local _silent=true
  343. ;;
  344. --)
  345. shift
  346. break
  347. ;;
  348. esac
  349. shift
  350. done
  351. else
  352. err "Incorrect options provided"
  353. exit 1
  354. fi
  355. for _pkg in "$@"; do
  356. # Check for alias
  357. [[ -v PKG_ALIASES && -v PKG_ALIASES["$_pkg"] ]] && _pkg=PKG_ALIASES["$_pkg"]
  358. # Check if already installed
  359. if [[ -v _no_check ]] || ! pkg_query "$_pkg" > /dev/null 2>&1; then
  360. _pkg_array+=("$_pkg")
  361. fi
  362. done
  363. # Install packages from package array
  364. if [[ ${#_pkg_array[@]} -ge 1 ]]; then
  365. debug "Installing: ${_pkg_array[*]}"
  366. if debug; then
  367. debug "pkg_install ${_install_flags[*]} ${_pkg_array[*]}"
  368. pkg_install "${_install_flags[@]}" "${_pkg_array[@]}"
  369. else
  370. pkg_install "${_install_flags[@]}" "${_pkg_array[@]}" > /dev/null 2>&1
  371. fi
  372. local _return=$?
  373. [[ $_return -ne 0 && ! -v _silent ]] && err "Failed to install ${_pkg_array[*]}. Attempting to continue..."
  374. return $_return
  375. fi
  376. }
  377. #######################################
  378. # Add the JRiver repository files
  379. #######################################
  380. addRepo() {
  381. debug "Running: ${FUNCNAME[0]}"
  382. if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
  383. bash_cmd 'cat <<- EOF > /etc/yum.repos.d/jriver.repo
  384. [jriver]
  385. name=JRiver Media Center repo by BryanC
  386. baseurl=https://repos.bryanroessler.com/jriver
  387. gpgcheck=0
  388. EOF'
  389. elif [[ "$ID" =~ ^(debian|ubuntu|linuxmint)$ ]]; then
  390. installPackage wget
  391. wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | ifSudo apt-key add - > /dev/null 2>&1
  392. ifSudo wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/mediacenter$_mversion.list" > /dev/null 2>&1
  393. elif [[ "$ID" =~ ^opensuse.* ]]; then
  394. ifSudo zypper addrepo --no-gpgcheck "https://repos.bryanroessler.com/jriver" jriver
  395. fi
  396. }
  397. #######################################
  398. # Installs JRiver Media Center from a repository
  399. #######################################
  400. installMCFromRepo() {
  401. debug "Running: ${FUNCNAME[0]}"
  402. local _mcpkg
  403. echo "Installing JRiver Media Center $_mcversion from repository."
  404. echo "Future updates will be handled by your package manager."
  405. if ! debug; then
  406. echo "This may take a few minutes to complete."
  407. echo "Use --debug for verbose output."
  408. fi
  409. addRepo
  410. # Update package list
  411. debug "Updating package list"
  412. if ! pkg_update > /dev/null 2>&1; then
  413. err "Package update failed!"
  414. exit 1
  415. fi
  416. if [[ "$ID" =~ ^(fedora|centos|opensuse.*)$ ]]; then
  417. _mcpkg="MediaCenter"
  418. elif [[ "$ID" =~ ^(debian|ubuntu|linuxmint)$ ]]; then
  419. _mcpkg="mediacenter$_mversion"
  420. fi
  421. if [[ -v _specific_version ]]; then
  422. if [[ "$ID" =~ ^(fedora|centos|opensuse.*)$ ]]; then
  423. _mcpkg="$_mcpkg-$_mcversion"
  424. elif [[ "$ID" =~ ^(debian|ubuntu|linuxmint)$ ]]; then
  425. _mcpkg="$_mcpkg=$_mcversion"
  426. fi
  427. fi
  428. if debug; then
  429. debug "installPackage --no-check $_mcpkg"
  430. installPackage --no-check --nogpgcheck "$_mcpkg"
  431. else
  432. installPackage --no-check --nogpgcheck "$_mcpkg" > /dev/null 2>&1
  433. fi
  434. return $?
  435. }
  436. #######################################
  437. # Acquire the source DEB package from JRiver's servers
  438. #######################################
  439. acquireDeb() {
  440. debug "Running: ${FUNCNAME[0]}"
  441. declare -g DEBFILENAME
  442. DEBFILENAME="$_outputdir/SOURCES/MediaCenter-$_mcversion-amd64.deb"
  443. # If necessary, create SOURCES dir
  444. [[ ! -d "$_outputdir/SOURCES" ]] && mkdir -p "$_outputdir/SOURCES"
  445. # If deb file already exists, skip download
  446. if [[ -f "$DEBFILENAME" ]]; then
  447. echo "Using local DEB file: $DEBFILENAME"
  448. elif [[ -v _betapass ]]; then
  449. echo "Checking beta repo..."
  450. if wget -q -O "$DEBFILENAME" \
  451. "https://files.jriver.com/mediacenter/channels/v$_mversion/beta/$_betapass/MediaCenter-$_mcversion-amd64.deb"; then
  452. echo "Found!"
  453. fi
  454. elif echo "Checking test repo..." && wget -q -O "$DEBFILENAME" \
  455. "https://files.jriver.com/mediacenter/test/MediaCenter-$_mcversion-amd64.deb"; then
  456. echo "Found!"
  457. # Else check latest repo
  458. elif echo "Checking latest repo..." && wget -q -O "$DEBFILENAME" \
  459. "https://files.jriver.com/mediacenter/channels/v$_mversion/latest/MediaCenter-$_mcversion-amd64.deb"; then
  460. echo "Found!"
  461. else
  462. err "Cannot find DEB file."
  463. exit 1
  464. fi
  465. if [[ ! -f "$DEBFILENAME" ]]; then
  466. err "Downloaded DEB file missing or corrupted."
  467. exit 1
  468. fi
  469. }
  470. #######################################
  471. # Creates a SPEC file and builds the RPM from the source DEB using rpmbuild
  472. #######################################
  473. buildRPM() {
  474. debug "Running: ${FUNCNAME[0]}"
  475. # install build dependencies
  476. installPackage wget dpkg rpm-build
  477. # If necessary, make build directories
  478. [[ ! -d "$_outputdir/SPECS" ]] && mkdir -p "$_outputdir/SPECS"
  479. # rpmbuild uses rpm to check for build dependencies
  480. # this will fail on non-rpm distros
  481. if [[ "$ID" =~ ^(fedora|centos|opensuse.*)$ ]]; then
  482. local _build_requires=$'BuildRequires: rpm >= 4.11.0\nBuildRequires: dpkg'
  483. fi
  484. # Create spec file
  485. cat <<- EOF > "$_outputdir/SPECS/mediacenter.spec"
  486. Name: MediaCenter
  487. Version: $_mcversion
  488. Release: 1
  489. Summary: JRiver Media Center
  490. Group: Applications/Media
  491. Source0: http://files.jriver.com/mediacenter/channels/v$_mversion/latest/MediaCenter-$_mcversion-amd64.deb
  492. ${_build_requires:-}
  493. BuildArch: x86_64
  494. %define _rpmfilename %%{ARCH}/%%{NAME}-%%{version}.%%{ARCH}.rpm
  495. AutoReq: 0
  496. Requires: glibc >= 2.28
  497. Requires: alsa-lib >= 1.1.8
  498. Requires: libuuid >= 2.33
  499. Requires: libX11 >= 1.6
  500. Requires: libX11-common >= 1.6
  501. Requires: libXext >= 1.3
  502. Requires: libxcb >= 1.1
  503. Requires: libXdmcp >= 1.1
  504. Requires: libstdc++ >= 7.4
  505. Requires: gtk3 >= 3.24
  506. Requires: mesa-libGL
  507. Requires: libglvnd-glx
  508. Requires: pango >= 1.42
  509. Requires: nss >= 3.42
  510. Requires: nspr >= 4.20
  511. Requires: python3
  512. Requires: xdg-utils
  513. Requires: libgomp >= 7.4
  514. Requires: fribidi >= 1.0.5
  515. Requires: fontconfig >= 2.13
  516. Requires: freetype >= 2.9.1
  517. Requires: harfbuzz >= 2.3.1
  518. Requires: mesa-libgbm >= 18.3.6
  519. Requires: libva >= 2.4.0
  520. Requires: libepoxy >= 1.5.3
  521. Requires: lcms2 >= 2.9
  522. Requires: vulkan-headers >= 1.1
  523. Requires: mesa-vulkan-drivers
  524. Requires: ca-certificates
  525. Requires: libXScrnSaver
  526. Recommends: vorbis-tools >= 1.4.0
  527. Recommends: lame >= 3.0
  528. Provides: mediacenter$_mversion
  529. License: Copyright 1998-2021, JRiver, Inc. All rights reserved. Protected by U.S. patents #7076468 and #7062468
  530. URL: http://www.jriver.com/
  531. %define __provides_exclude_from ^%{_libdir}/jriver/.*/.*\\.so.*$
  532. %description
  533. Media Center is more than a world class player.
  534. %global __os_install_post %{nil}
  535. %prep
  536. %build
  537. %install
  538. dpkg -x %{S:0} %{buildroot}
  539. %post -p /sbin/ldconfig
  540. %postun -p /sbin/ldconfig
  541. %files
  542. %{_bindir}/mediacenter$_mversion
  543. %{_libdir}/jriver
  544. %{_datadir}
  545. %exclude %{_datadir}/applications/media_center_packageinstaller_$_mversion.desktop
  546. /etc/security/limits.d/*
  547. EOF
  548. declare -g _mcrpm="$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm"
  549. # skip rebuilding the rpm if it already exists
  550. if [[ -f "$_mcrpm" ]]; then
  551. echo "$_mcrpm already exists. Skipping build step..."
  552. return 0
  553. fi
  554. # Run rpmbuild
  555. echo "Building version $_mcversion, please wait..."
  556. if debug; then
  557. rpmbuild --define="%_topdir $_outputdir" --define="%_libdir /usr/lib" -bb "$_outputdir/SPECS/mediacenter.spec"
  558. else
  559. rpmbuild --quiet --define="%_topdir $_outputdir" --define="%_libdir /usr/lib" -bb "$_outputdir/SPECS/mediacenter.spec" > /dev/null 2>&1
  560. fi
  561. return $?
  562. }
  563. #######################################
  564. # Copy the RPM to createrepo-webroot and runs createrepo as the createrepo-user
  565. #######################################
  566. runCreaterepo() {
  567. debug "Running: ${FUNCNAME[0]}"
  568. declare -a createrepo_cmd
  569. installPackage createrepo_c
  570. # If the webroot does not exist, create it
  571. if [[ ! -d "$_createrepo_webroot" ]]; then
  572. debug "ifSudo -u $_createrepo_user mkdir -p $_createrepo_webroot"
  573. if ! ifSudo -u "$_createrepo_user" mkdir -p "$_createrepo_webroot"; then
  574. debug "ifSudo mkdir -p $_createrepo_webroot"
  575. if ifSudo mkdir -p "$_createrepo_webroot" && \
  576. ifSudo chown -R "$_createrepo_user":"$_createrepo_user" "$_createrepo_webroot"; then
  577. :
  578. else
  579. err "Could not create the createrepo-webroot path!"
  580. err "Make sure that the createrepo-webroot is writeable by createrepo-user: $_createrepo_user"
  581. return 1
  582. fi
  583. fi
  584. fi
  585. # Copy built rpms to webroot
  586. debug "ifSudo -u $_createrepo_user cp -n -f $_mcrpm $_createrepo_webroot"
  587. if ! ifSudo -u "$_createrepo_user" cp -n -f "$_mcrpm" "$_createrepo_webroot"; then
  588. debug "ifSudo cp -n -f $_mcrpm $_createrepo_webroot"
  589. if ifSudo cp -n -f "$_mcrpm" "$_createrepo_webroot" && \
  590. ifSudo chown -R "$_createrepo_user":"$_createrepo_user" "$_createrepo_webroot"; then
  591. :
  592. else
  593. err "Could not copy $_mcrpm to $_createrepo_webroot"
  594. err "Make sure that the createrepo-webroot path is writeable by createrepo-user: $_createrepo_user"
  595. return 1
  596. fi
  597. fi
  598. # Run createrepo
  599. createrepo_cmd=("sudo" "-u" "$_createrepo_user" "createrepo" "-q")
  600. [[ -d "$_createrepo_webroot" ]] && createrepo_cmd+=("--update")
  601. debug "${createrepo_cmd[*]} $_createrepo_webroot"
  602. if "${createrepo_cmd[@]}" "$_createrepo_webroot"; then
  603. echo "Successfully updated repo"
  604. return 0
  605. else
  606. err "Update repo failed"
  607. return 1
  608. fi
  609. }
  610. #######################################
  611. # Symlink certificates where JRiver Media Center expects them to be on Fedora/CentOS
  612. #######################################
  613. symlinkCerts() {
  614. debug "Running: ${FUNCNAME[0]}"
  615. if [[ ! -f /etc/ssl/certs/ca-certificates.crt && \
  616. -f /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem ]]; then
  617. if ! ln_cmd /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt; then
  618. err "Symlinking certificates failed"
  619. return 1
  620. fi
  621. fi
  622. }
  623. #######################################
  624. # Automatically restore the mjr license file if it is found next to
  625. # installJRMC or _restorefile is set
  626. #######################################
  627. restoreLicense() {
  628. debug "Running: ${FUNCNAME[0]}"
  629. local _mjr
  630. # Allow user to put the mjr file next to installJRMC
  631. if [[ ! -v _restorefile ]]; then
  632. for _mjr in "$PWD"/*.mjr; do
  633. [[ $_mjr -nt $_restorefile ]] && _restorefile="$_mjr"
  634. done
  635. fi
  636. # Restore license
  637. if [[ -f "$_restorefile" ]]; then
  638. if ! "mediacenter$_mversion" /RestoreFromFile "$_restorefile"; then
  639. err "Automatic license restore failed"
  640. return 1
  641. fi
  642. fi
  643. }
  644. #######################################
  645. # Opens ports using the system firewall tool
  646. # Arguments
  647. # Pre-defined service to enable
  648. #######################################
  649. openFirewall() {
  650. debug "Running: ${FUNCNAME[0]}" "$@"
  651. # Create OS-specific port rules based on argument (service) name
  652. local -a _f_ports # for firewall-cmd
  653. local _u_ports # for ufw
  654. if [[ "$1" == "jriver" ]]; then
  655. _f_ports=("52100-52200/tcp" "1900/udp")
  656. _u_ports="52100:52200/tcp|1900/udp"
  657. elif [[ "$1" =~ ^(jriver-x11vnc|jriver-xvnc)$ ]]; then
  658. _f_ports=("$_port/tcp" "1900/udp")
  659. _u_ports="$_port/tcp|1900/udp"
  660. fi
  661. # Open the ports
  662. if [[ "$ID" =~ ^(fedora|centos|opensuse.*)$ ]]; then
  663. [[ ! -x $(command -v firewall-cmd) ]] && installPackage firewalld
  664. if ! firewall_cmd --get-services | grep -q "$1"; then
  665. firewall_cmd --permanent --new-service="$1" > /dev/null 2>&1
  666. firewall_cmd --permanent --service="$1" --set-description="$1 installed by installJRMC" > /dev/null 2>&1
  667. firewall_cmd --permanent --service="$1" --set-short="$1" > /dev/null 2>&1
  668. for _f_port in "${_f_ports[@]}"; do
  669. firewall_cmd --permanent --service="$1" --add-port="$_f_port" > /dev/null 2>&1
  670. done
  671. firewall_cmd --add-service "$1" --permanent > /dev/null 2>&1
  672. firewall_cmd --reload > /dev/null 2>&1
  673. fi
  674. elif [[ "$ID" =~ ^(debian|ubuntu|linuxmint)$ ]]; then
  675. # Debian ufw package state is broken on fresh installations
  676. [[ ! -x $(command -v ufw) ]] && installPackage ufw
  677. if [[ ! -f "/etc/ufw/applications.d/$1" ]]; then
  678. bash_cmd "cat <<- EOF > /etc/ufw/applications.d/$1
  679. [$1]
  680. title=$1
  681. description=$1 installed by installJRMC
  682. ports=$_u_ports
  683. EOF"
  684. fi
  685. firewall_cmd app update "$1"
  686. firewall_cmd allow "$1" > /dev/null 2>&1
  687. fi
  688. # shellcheck disable=SC2181 # More concise
  689. if [[ $? -ne 0 ]]; then
  690. err "Firewall ports could not be opened"
  691. return 1
  692. fi
  693. }
  694. #######################################
  695. # Create the x11vnc password file
  696. #######################################
  697. setX11VNCPass() {
  698. debug "Running: ${FUNCNAME[0]}"
  699. _vncpassfile="$HOME/.vnc/jrmc_passwd"
  700. [[ ! -d "${_vncpassfile%/*}" ]] && mkdir -p "${_vncpassfile%/*}"
  701. if [[ -f "$_vncpassfile" ]]; then
  702. if [[ ! -v _vncpass ]]; then
  703. err "Refusing to overwrite existing $_vncpassfile with an empty password"
  704. err "Remove existing $_vncpassfile or set --vncpass to use an empty password"
  705. exit 1
  706. else
  707. rm -f "$_vncpassfile"
  708. fi
  709. fi
  710. if [[ -v _vncpass ]]; then
  711. if ! x11vnc -storepasswd "$_vncpass" "$_vncpassfile"; then
  712. err "Could not create VNC password file"
  713. return 1
  714. fi
  715. else
  716. _novncauth="true"
  717. fi
  718. }
  719. #######################################
  720. # Create the Xvnc password file
  721. #######################################
  722. setVNCPass() {
  723. debug "Running: ${FUNCNAME[0]}"
  724. _vncpassfile="$HOME/.vnc/jrmc_passwd"
  725. [[ ! -d "${_vncpassfile%/*}" ]] && mkdir -p "${_vncpassfile%/*}"
  726. if [[ -f "$_vncpassfile" ]]; then
  727. if [[ ! -v _vncpass ]]; then
  728. err "Refusing to overwrite existing $_vncpassfile with an empty password"
  729. err "Remove existing $_vncpassfile or set --vncpass to use an empty password"
  730. exit 1
  731. else
  732. rm -f "$_vncpassfile"
  733. fi
  734. fi
  735. if [[ -v _vncpass ]]; then
  736. if ! echo "$_vncpass" | vncpasswd -f > "$_vncpassfile"; then
  737. err "Could not create VNC password file"
  738. return 1
  739. fi
  740. else
  741. _novncauth="true"
  742. fi
  743. }
  744. #######################################
  745. # Set display and port variables
  746. #######################################
  747. setDisplay() {
  748. debug "Running: ${FUNCNAME[0]}"
  749. # Check _display, else DISPLAY, else set to :0 by default
  750. if [[ -v _display ]]; then
  751. _next_display="$_display"
  752. elif [[ -v DISPLAY ]]; then
  753. _display="${DISPLAY}"
  754. _displaynum="${_display#:}" # strip colon
  755. _displaynum="${_displaynum%.*}" # strip suffix
  756. _next_displaynum=$(( _displaynum + 1 ))
  757. _next_display=":$_next_displaynum"
  758. else
  759. _display=":0"
  760. _next_display=":1"
  761. fi
  762. _displaynum="${_display#:}" # strip colon
  763. _displaynum="${_displaynum%.*}" # strip suffix
  764. _next_displaynum=$(( _displaynum + 1 ))
  765. }
  766. #######################################
  767. # Create associated service variables based on service name
  768. #######################################
  769. setServiceVars() {
  770. debug "Running: ${FUNCNAME[0]}"
  771. if [[ "$_service_user" == "root" ]]; then
  772. _service_fname="/usr/lib/systemd/system/${1}.service"
  773. _timer_fname="/usr/lib/systemd/system/${1}.timer"
  774. _service_name="jriver-${1}.service"
  775. _timer_name="jriver-${1}.timer"
  776. _user_specifier=""
  777. else
  778. _service_fname="/usr/lib/systemd/system/${1}@.service"
  779. _timer_fname="/usr/lib/systemd/system/${1}@.timer"
  780. _service_name="${1}@$_service_user.service"
  781. _timer_name="${1}@$_service_user.timer"
  782. _user_specifier="User=%I"
  783. fi
  784. }
  785. #######################################
  786. # Starts and enables (at startup) a JRiver Media Center service
  787. # Arguments:
  788. # Passes arguments as startup options to /usr/bin/mediacenter??
  789. #######################################
  790. service_jriver-mediacenter() {
  791. debug "Running: ${FUNCNAME[0]}"
  792. bash_cmd "cat <<- EOF > $_service_fname
  793. [Unit]
  794. Description=JRiver Media Center $_mversion
  795. After=graphical.target
  796. [Service]
  797. $_user_specifier
  798. Type=simple
  799. Environment=DISPLAY=$_display
  800. Environment=XAUTHORITY=$XAUTHORITY
  801. ExecStart=/usr/bin/mediacenter$_mversion $*
  802. Restart=always
  803. RestartSec=10
  804. KillSignal=SIGHUP
  805. TimeoutStopSec=30
  806. [Install]
  807. WantedBy=graphical.target
  808. EOF"
  809. systemctl_reload && \
  810. systemctl_enable "$_service_name" && \
  811. openFirewall "jriver"
  812. }
  813. #######################################
  814. # Starts and enables (at startup) a JRiver Media Server service
  815. #######################################
  816. service_jriver-mediaserver() {
  817. debug "Running: ${FUNCNAME[0]}"
  818. service_jriver-mediacenter "/MediaServer"
  819. }
  820. #######################################
  821. # Starts and enables (at startup) JRiver Media Center in a new Xvnc session
  822. #######################################
  823. service_jriver-xvnc-mediacenter() {
  824. debug "Running: ${FUNCNAME[0]}"
  825. installPackage tigervnc-server
  826. setVNCPass
  827. local _port=$(( _next_displaynum + 5900 ))
  828. if [[ -v _novncauth ]]; then
  829. _exec_start_cmd="/usr/bin/vncserver $_next_display -geometry 1440x900 -alwaysshared -name jriver$_next_display -SecurityTypes None -autokill -xstartup /usr/bin/mediacenter$_mversion"
  830. else
  831. _exec_start_cmd="/usr/bin/vncserver $_next_display -geometry 1440x900 -alwaysshared -rfbauth $HOME/.vnc/jrmc_passwd -autokill -xstartup /usr/bin/mediacenter$_mversion"
  832. fi
  833. bash_cmd "cat <<- EOF > $_service_fname
  834. [Unit]
  835. Description=Remote desktop service (VNC)
  836. After=syslog.target network.target
  837. [Service]
  838. Type=simple
  839. $_user_specifier
  840. ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill $_next_display > /dev/null 2>&1 || :'
  841. ExecStart=$_exec_start_cmd
  842. ExecStop=/usr/bin/vncserver -kill $_next_display
  843. Restart=always
  844. [Install]
  845. WantedBy=multi-user.target
  846. EOF"
  847. systemctl_reload && \
  848. systemctl_enable "$_service_name" && \
  849. echo "Xvnc running on localhost:$_port" && \
  850. openFirewall "jriver-xvnc" && \
  851. openFirewall "jriver"
  852. }
  853. #######################################
  854. # Starts and enables (at startup) JRiver Media Server and x11vnc sharing the local desktop
  855. #######################################
  856. service_jriver-x11vnc() {
  857. debug "Running: ${FUNCNAME[0]}"
  858. installPackage x11vnc
  859. setX11VNCPass
  860. local _port=$(( _displaynum + 5900 ))
  861. # Get current desktop resolution
  862. # TODO: may need to break this out into its own function and get smarter at identifying multi-monitors
  863. _getResolution() {
  864. debug "Running: ${FUNCNAME[0]}"
  865. installPackage xorg-x11-utils
  866. _res=$(xdpyinfo | grep dimensions | awk '{print $2}')
  867. }
  868. _getResolution
  869. if [[ -v _novncauth ]]; then
  870. _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry $_res -auth guess -forever -bg -nopw"
  871. else
  872. _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry $_res -auth guess -forever -bg -rfbauth $HOME/.vnc/jrmc_passwd"
  873. fi
  874. bash_cmd "cat <<-EOF > $_service_fname
  875. [Unit]
  876. Description=x11vnc
  877. After=multi.service
  878. [Service]
  879. $_user_specifier
  880. Type=forking
  881. Environment=DISPLAY=$_display
  882. ExecStart=$_exec_start_cmd
  883. Restart=always
  884. RestartSec=10
  885. [Install]
  886. WantedBy=multi-user.target
  887. EOF"
  888. systemctl_reload && \
  889. systemctl_enable "$_service_name" && \
  890. echo "x11vnc running on localhost:$_port" && \
  891. openFirewall "jriver-x11vnc"
  892. }
  893. #######################################
  894. # Starts and enables (at startup) an hourly service to build the latest version of JRiver Media
  895. # Center RPM from the source DEB and create/update an RPM repository
  896. #######################################
  897. service_jriver-createrepo() {
  898. debug "Running: ${FUNCNAME[0]}"
  899. bash_cmd "cat <<-EOF > $_service_fname
  900. [Unit]
  901. Description=Builds JRiver Media Center RPM file, moves it to the repo dir, and runs createrepo
  902. [Service]
  903. $_user_specifier
  904. ExecStart=$PWD/installJRMC --outputdir $_outputdir --createrepo --createrepo-webroot $_createrepo_webroot --createrepo-user $_createrepo_user
  905. [Install]
  906. WantedBy=default.target
  907. EOF"
  908. bash_cmd "cat <<-EOF > $_timer_fname
  909. [Unit]
  910. Description=Run JRiver MC rpmbuild hourly
  911. [Timer]
  912. OnCalendar=hourly
  913. Persistent=true
  914. [Install]
  915. WantedBy=timers.target
  916. EOF"
  917. systemctl_reload && \
  918. systemctl_enable "$_timer_name"
  919. }
  920. #######################################
  921. # CONTAINERS
  922. #######################################
  923. # containerCreaterepo() {
  924. # :
  925. # }
  926. # containerVNC() {
  927. # :
  928. # }
  929. # containerMC() {
  930. # installPackage buildah podman
  931. # cnt=$(buildah from docker.io/jlesage/baseimage-gui:debian-10)
  932. # podman_create_cmd=("podman" "create" "--name" "$CNAME")
  933. # buildah_config_cmd=("buildah" "config" \
  934. # "--author" "bryanroessler@gmail.com" \
  935. # "--label" "maintainer=$MAINTAINER" \
  936. # "--env" "TZ=$TZ" \
  937. # "--workingdir" "/app" \
  938. # "--cmd" "mediacenter$_mversion")
  939. # mkcdirs() {
  940. # local dir
  941. # for dir in "$@"; do
  942. # if [[ ! -d "$dir" ]]; then
  943. # if ! mkdir -p "$dir"; then
  944. # err "Could not create directory $dir, check your permissions"
  945. # fi
  946. # fi
  947. # if ! chcon -t container_file_t -R "$dir"; then
  948. # err "Could not set container_file_t attribute for $dir, check your permissions"
  949. # fi
  950. # done
  951. # }
  952. # mkcdirs "$HOME/.jriver"
  953. # podman_create_cmd+=("-v" "$HOME/.jriver:/root/.jriver")
  954. # podman_create_cmd+=("-v" "$DOWNLOAD_ROOT:/downloads:z")
  955. # podman_create_cmd+=("-v" "$MONITOR_ROOT/nzbs:/nzbs")
  956. # podman_create_cmd+=("-p" "${CONTAINER[HOST_PORT]}:${CONTAINER[CONTAINER_PORT]}")
  957. # brc() { buildah run "$1" "${@:2}" || return 1; }
  958. # brc add-pkg gnupg2 libxss1 wmctrl xdotool ca-certificates inotify-tools libgbm1
  959. # brc add-pkg --virtual .build-deps wget
  960. # brc sh -s <<- EOF
  961. # wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | apt-key add - > /dev/null 2>&1
  962. # EOF
  963. # brc wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/mediacenter$_mversion.list"
  964. # brc apt-get update -y -q0
  965. # brc add-pkg "mediacenter$_mversion"
  966. # brc del-pkg .build-deps
  967. # }
  968. uninstall() {
  969. debug "Running: ${FUNCNAME[0]}"
  970. if ! askOk "Do you really want to uninstall JRiver Media Center?"; then
  971. echo "Cancelling uninstall..."
  972. exit 0
  973. fi
  974. debug "Stopping and removing all associated Media Center services"
  975. for _service in $(compgen -A "function" "service"); do
  976. _service="${_service##service_}"
  977. setServiceVars "$_service"
  978. for unit in "$_service_name."{service,timer} "$_service_name@$_service_user."{service,timer}; do
  979. if systemctl is-active -q "$unit" > /dev/null 2>&1 || systemctl is-enabled -q "$unit" > /dev/null 2>&1; then
  980. debug "Disabling $unit"
  981. systemctl_disable "$unit"
  982. fi
  983. done
  984. for f in "/usr/lib/systemd/system/${_service_name}."{service,timer} \
  985. "/usr/lib/systemd/system/${_service_name}@${_service_user}."{service,timer}; do
  986. debug "Removing $f"
  987. rm_cmd "$f"
  988. done
  989. systemctl_reload
  990. done
  991. debug "Removing repo files"
  992. [[ -f "/etc/yum.repos.d/jriver.repo" ]] \
  993. && rm_cmd "/etc/yum.repos.d/jriver.repo"
  994. [[ -f "/etc/apt/sources.list.d/jriver.list" ]] \
  995. && rm_cmd "/etc/apt/sources.list.d/jriver.list"
  996. debug "Removing firewall rules"
  997. if [[ -x $(command -v firewall-cmd) ]]; then
  998. if [[ -v debug ]]; then
  999. debug "firewall_cmd --permanent --remove-service=jriver"
  1000. firewall_cmd --permanent --remove-service=jriver
  1001. debug "firewall_cmd --permanent --delete-service=jriver"
  1002. firewall_cmd --permanent --delete-service=jriver
  1003. debug "firewall_cmd --reload"
  1004. firewall_cmd --reload
  1005. else
  1006. firewall_cmd --permanent --remove-service=jriver > /dev/null 2>&1
  1007. firewall_cmd --permanent --delete-service=jriver > /dev/null 2>&1
  1008. firewall_cmd --reload > /dev/null 2>&1
  1009. fi
  1010. elif [[ -x $(command -v ufw) ]]; then
  1011. if [[ -v debug ]]; then
  1012. firewall_cmd delete allow jriver
  1013. else
  1014. firewall_cmd delete allow jriver > /dev/null 2>&1
  1015. fi
  1016. [[ -f "/etc/ufw/applications.d/jriver" ]] \
  1017. && rm_cmd /etc/ufw/applications.d/jriver
  1018. fi
  1019. debug "Uninstalling Media Center packages"
  1020. if [[ "$ID" =~ ^(fedora|centos|opensuse.*)$ ]]; then
  1021. _mcpkg="MediaCenter"
  1022. elif [[ "$ID" =~ ^(debian|ubuntu|linuxmint)$ ]]; then
  1023. _mcpkg="mediacenter$_mversion"
  1024. fi
  1025. if debug; then
  1026. debug "pkg_remove -q $_mcpkg"
  1027. pkg_remove "-q" "$_mcpkg"
  1028. else
  1029. pkg_remove "-q" "$_mcpkg" > /dev/null 2>&1
  1030. fi
  1031. echo "JRiver Media Center has been completely uninstalled."
  1032. echo "To remove your library files, run: rm -rf $HOME/.jriver"
  1033. echo "To remove your rpmbuild output files, run: rm -rf $_outputdir"
  1034. exit 0
  1035. }
  1036. tests() {
  1037. # To test on Mint: sudo apt-get install -y spice-vdagent ca-certificates git; export GIT_SSL_NO_VERIFY=1
  1038. exit $?
  1039. }
  1040. main() {
  1041. debug "Running: ${FUNCNAME[0]}"
  1042. init "$@"
  1043. # Uninstall and exit
  1044. if [[ -v _uninstall ]]; then
  1045. uninstall
  1046. exit $?
  1047. fi
  1048. # Install MC using package manager
  1049. if [[ -v _install && "$_install" == "repo" ]]; then
  1050. if ! installMCFromRepo; then
  1051. err "JRiver Media Center installation failed"
  1052. exit 1
  1053. else
  1054. echo "JRiver Media Center installed successfully"
  1055. fi
  1056. symlinkCerts
  1057. restoreLicense
  1058. openFirewall "jriver"
  1059. fi
  1060. # Build RPM from source deb package
  1061. if [[ -v _build ]]; then
  1062. acquireDeb
  1063. if ! buildRPM || [[ ! -f "$_mcrpm" ]] ; then
  1064. err "Build failed."
  1065. [[ -f "$DEBFILENAME" ]] && echo "Removing source DEB" && rm -f "$DEBFILENAME"
  1066. exit 1
  1067. else
  1068. echo "Build successful. The RPM file is located at: $_mcrpm"
  1069. fi
  1070. fi
  1071. # Run createrepo
  1072. if [[ -v _createrepo ]]; then
  1073. runCreaterepo
  1074. fi
  1075. # Install RPM
  1076. if [[ -v _install && "$_install" == "rpm" ]]; then
  1077. installPackage --no-check --nogpgcheck "$_mcrpm"
  1078. symlinkCerts
  1079. restoreLicense
  1080. openFirewall "jriver"
  1081. fi
  1082. # Install services
  1083. setDisplay
  1084. for _service in "${_services[@]}"; do
  1085. setServiceVars "$_service"
  1086. if ! "service_$_service"; then
  1087. if [[ $? -eq 127 ]]; then
  1088. err "Service $_service does not exist, check your service name"
  1089. else
  1090. err "Failed to create service: $_service"
  1091. fi
  1092. fi
  1093. done
  1094. # Install containers
  1095. # for _container in "${_containers[@]}"; do
  1096. # if ! "_container_$_container"; then
  1097. # if [[ $? -eq 127 ]]; then
  1098. # err "Container $_container does not exist, check your container name"
  1099. # else
  1100. # err "Failed to create container: $_container"
  1101. # fi
  1102. # fi
  1103. # done
  1104. }
  1105. main "$@"