diff --git a/INSTALL.md b/INSTALL.md index a861c858..c8ca7807 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -29,36 +29,48 @@ sudo apt-get install \ Note that OwnTone will also work with other versions and flavours of libgcrypt and libcurl, so the above are just suggestions. -While OwnTone will work with versions of libevent between 2.0.0 and 2.1.3, -it is recommended to use 2.1.4+. Otherwise you may not have support for -simultaneous streaming to multiple DAAP clients. - -Optional packages: +The following features require extra packages, and that you add a configure +argument when you run ./configure: Feature | Configure argument | Packages - ---------------------|--------------------------|------------------------------------------------ - Chromecast | `--enable-chromecast` | libgnutls*-dev libprotobuf-c-dev - Spotify (built-in) | `--disable-spotify` | libprotobuf-c-dev + ---------------------|--------------------------|------------------------------------- + Chromecast | `--enable-chromecast` | libgnutls*-dev Spotify (libspotify) | `--enable-libspotify` | libspotify-dev - Player web UI | `--disable-webinterface` | libwebsockets-dev - Live web UI | `--with-libwebsockets` | libwebsockets-dev Pulseaudio | `--with-pulseaudio` | libpulse-dev +These features can be disabled saving you package dependencies: + + Feature | Configure argument | Packages + ---------------------|--------------------------|------------------------------------- + Spotify (built-in) | `--disable-spotify` | libprotobuf-c-dev + Player web UI | `--disable-webinterface` | libwebsockets-dev + Live web UI | `--without-libwebsockets`| libwebsockets-dev + Then run the following (adding configure arguments for optional features): ```bash git clone https://github.com/owntone/owntone-server.git cd owntone-server autoreconf -i -./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-install-user make sudo make install ``` -Finally, read the section [Long version - after installation -](#Long-version---after-installation) in the bottom of this document, which -describes configuration, setting up init scripts and adding a system user. -Also see the [README.md](README.md) for usage information. +Using `--enable-install-user` means that `make install` will also add system +user and group for owntone. + +With the above configure arguments, a systemd service file will be installed to +`/etc/systemd/system/owntone.service` so that the server will start on boot. +Use `--disable-install-systemd` if you don't want that. + +Now edit `/etc/owntone.conf`. Note the guide at the top highlighting which +settings that normally require modification. + +Start the server with `sudo systemctl start owntone` and check that it is +running with `sudo systemctl status owntone`. + +See the [README.md](README.md) for usage information. ## Quick version for Fedora @@ -93,29 +105,31 @@ Then run the following: ```bash autoreconf -i -./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-install-user make sudo make install ``` -Finally, read the section [Long version - after installation -](#Long-version---after-installation) in the bottom of this document, which -describes configuration, setting up init scripts and adding a system user. -Also see the README for usage information. +Using `--enable-install-user` means that `make install` will also add system +user and group for owntone. + +With the above configure arguments, a systemd service file will be installed to +`/etc/systemd/system/owntone.service` so that the server will start on boot. +Use `--disable-install-systemd` if you don't want that. + +Now edit `/etc/owntone.conf`. Note the guide at the top highlighting which +settings that normally require modification. + +Start the server with `sudo systemctl start owntone` and check that it is +running with `sudo systemctl status owntone`. + +See the [README.md](README.md) for usage information. ## Quick version for FreeBSD -You can use the ports framework to handle dependencies and build options, so -the following is sufficient to build from source on FreeBSD: - -```sh -cd /usr/ports/audio/forked-daapd -make install -``` - -Otherwise, there is a script in the 'scripts' folder that will at least attempt -to do all the work for you. And should the script not work for you, -you can still look through it and use it as an installation guide. +There is a script in the 'scripts' folder that will at least attempt to do all +the work for you. And should the script not work for you, you can still look +through it and use it as an installation guide. ## Quick version for macOS (using Homebrew) @@ -125,9 +139,11 @@ all the steps that you need to execute: ## "Quick" version for macOS (using macports) -Caution: macports requires many downloads and lots of time to install -(and sometimes build) ports... you'll want a decent network connection -and some patience! +Caution: +1) this approach may be out of date, consider using the Homebrew method above +since it is continuously tested. +2) macports requires many downloads and lots of time to install (and sometimes +build) ports... you'll want a decent network connection and some patience! Install macports (which requires Xcode): https://www.macports.org/install.php @@ -240,8 +256,8 @@ Libraries: from - sqlite3 3.5.0+ with unlock notify API enabled (read below) from -- libav 9+ or ffmpeg 0.11+ - from or +- ffmpeg (libav) + from - libconfuse from - libevent 2.0+ (best with 2.1.4+) @@ -284,10 +300,6 @@ enable the unlock notify API (you can check for the presence of the sqlite3_unlock_notify symbol in the sqlite3 library). Refer to the sqlite3 documentation, look for `SQLITE_ENABLE_UNLOCK_NOTIFY`. -libav (or ffmpeg) is a central piece of OwnTone and most other FLOSS -multimedia applications. The version of libav you use will potentially have a -great influence on your experience with OwnTone. - ## Long version - building and installing Start by generating the build system by running `autoreconf -i`. This will @@ -355,11 +367,18 @@ present (with headers). Use `--without-pulseaudio` to disable. Recommended build settings: ```bash -./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-install-user ``` After configure run the usual make, and if that went well, `sudo make install`. +With the above configure arguments, a systemd service file will be installed to +`/etc/systemd/system/owntone.service` so that the server will start on boot. +Use `--disable-install-systemd` if you don't want that. + +Using `--enable-install-user` means that `make install` will also add a system +user and group for owntone. + You may see two kinds of warnings during make. First, `/usr/bin/antlr3` may generate a long series of warnings that begin like this: @@ -379,59 +398,15 @@ RSPLexer.c:2674:16: warning: unused variable `_type' [-Wunused-variable] You can safely ignore all of these warnings. -## Long version - after installation - After installation: - edit the configuration file, `/etc/owntone.conf` - make sure the Avahi daemon is installed and running (Debian: `apt install avahi-daemon`) -Note that `sudo make install` will not install any system files to start the -service after boot, and it will not setup a system user. +OwnTone will drop privileges to any user you specify in the configuration file +if it's started as root. -OwnTone will drop privileges to any user you'll specify in the -configuration file if it's started as root. +This user must have read permission to your library and read/write permissions +to the database location (`$localstatedir/cache/owntone` by default). -This user must have read permission on your library (you can create a group for -this and make the user a member of the group, for instance) and read/write -permissions on the database location (`$localstatedir/cache/owntone` by -default). - -If your system uses systemd then you might be able to use the service file -included, see `owntone.service`. - -Otherwise you might need an init script to start OwnTone at boot. A simple -init script will do, OwnTone daemonizes all by itself and creates a -pidfile under `/var/run`. Different distributions have different standards for -init scripts and some do not use init scripts anymore; check the documentation -for your distribution. - -For dependency-based boot systems, here are the OwnTone dependencies: - -- local filesystems -- network filesystems, if needed in your setup (library on NFS, ...) -- networking -- NTP -- Avahi daemon - -The LSB header below sums it up: - -```bash -### BEGIN INIT INFO -# Provides: owntone -# Required-Start: $local_fs $remote_fs $network $time -# Required-Stop: $local_fs $remote_fs $network $time -# Should-Start: avahi -# Should-Stop: avahi -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: DAAP/DACP (iTunes) server, support for AirPlay and Spotify -# Description: OwnTone is an iTunes-compatible media server for sharing -# your media library over the local network with DAAP/DACP -# clients like iTunes. Like iTunes, it can be controlled by -# Apple Remote (and compatibles) and stream music directly to -# AirPlay devices. It also supports streaming to RSP clients -# (Roku devices) and streaming from Spotify. -### END INIT INFO -``` diff --git a/Makefile.am b/Makefile.am index b9c3b3bc..29080d96 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,10 @@ RPM_SPEC_FILE = owntone.spec CONF_FILE = owntone.conf SYSTEMD_SERVICE_FILE = owntone.service -sysconf_DATA = $(CONF_FILE) +if COND_INSTALL_SYSTEMD +systemddir = $(SYSTEMD_DIR) +systemd_DATA = $(SYSTEMD_SERVICE_FILE) +endif BUILT_SOURCES = $(CONF_FILE) $(SYSTEMD_SERVICE_FILE) @@ -33,9 +36,34 @@ EXTRA_DIST = \ $(RPM_SPEC_FILE) install-data-hook: - $(MKDIR_P) "$(DESTDIR)$(localstatedir)/cache/$(PACKAGE)/libspotify" $(MKDIR_P) "$(DESTDIR)$(localstatedir)/log" $(MKDIR_P) "$(DESTDIR)$(localstatedir)/run" + $(MKDIR_P) "$(DESTDIR)$(localstatedir)/cache/$(PACKAGE)" +if COND_INSTALL_USER + ( $(GETENT) group $(OWNTONE_GROUP) &> /dev/null || $(GROUPADD) --system $(OWNTONE_GROUP) ) + ( $(GETENT) passwd $(OWNTONE_USER) &> /dev/null || $(USERADD) --system --no-create-home --gid $(OWNTONE_GROUP) --groups audio --shell /usr/sbin/nologin $(OWNTONE_USER) ) + ( ! $(GETENT) group pulse-access &> /dev/null || $(USERMOD) --append --groups pulse-access $(OWNTONE_USER) ) + $(CHOWN) $(OWNTONE_USER).$(OWNTONE_GROUP) "$(DESTDIR)$(localstatedir)/cache/$(PACKAGE)" +endif +if COND_LIBSPOTIFY + $(MKDIR_P) "$(DESTDIR)$(localstatedir)/cache/$(PACKAGE)/libspotify" +endif +# we do this manually instead of using sysconf_DATA because it overwrites existing config +if COND_INSTALL_CONF_FILE + $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" + [ -f $(DESTDIR)$(sysconfdir)/$(CONF_FILE) ] || $(INSTALL_DATA) $(CONF_FILE) $(DESTDIR)$(sysconfdir)/$(CONF_FILE) +endif + +uninstall-hook: + ( cd "$(DESTDIR)$(localstatedir)/cache" && rm -rf $(PACKAGE) ) + ( cd "$(DESTDIR)$(localstatedir)/log" && rm -f "$(PACKAGE).log*" ) + ( cd "$(DESTDIR)$(localstatedir)/run" && rm -f "$(PACKAGE).pid" ) +if COND_INSTALL_USER + ( ! $(GETENT) passwd $(OWNTONE_USER) &> /dev/null || $(USERDEL) $(OWNTONE_USER) ) +endif +if COND_INSTALL_CONF_FILE + ( cd "$(DESTDIR)$(sysconfdir)" && rm -f $(CONF_FILE) ) +endif CLEANFILES = $(BUILT_SOURCES) diff --git a/configure.ac b/configure.ac index 8732fd92..778a0af1 100644 --- a/configure.ac +++ b/configure.ac @@ -350,26 +350,54 @@ OWNTONE_ARG_DISABLE([MPD client protocol support], [mpd], [MPD]) AM_CONDITIONAL([COND_MPD], [[test "x$enable_mpd" = "xyes"]]) dnl Include default webinterface -OWNTONE_ARG_DISABLE([Include default web interface], [webinterface], [WEBINTERFACE], +OWNTONE_ARG_DISABLE([include default web interface], [webinterface], [WEBINTERFACE], [AS_IF([[test "x$with_libwebsockets" = "xno"]], [AC_MSG_ERROR([[Web interface requires libwebsockets >= 2.0.2 (or use --disable-webinterface)]])]) ]) AM_CONDITIONAL([COND_WEBINTERFACE], [[test "x$enable_webinterface" = "xyes"]]) -dnl Defining users and groups +dnl Creating and defining users and groups +OWNTONE_ARG_ENABLE([having 'make install' add user/group and 'make uninstall' delete], [install_user], [INSTALL_USER], + [AC_PATH_PROG([GETENT], [[getent]], [], [$PATH$PATH_SEPARATOR/usr/sbin]) + AC_PATH_PROG([USERADD], [[useradd]], [], [$PATH$PATH_SEPARATOR/usr/sbin]) + AC_PATH_PROG([USERDEL], [[userdel]], [], [$PATH$PATH_SEPARATOR/usr/sbin]) + AC_PATH_PROG([USERMOD], [[usermod]], [], [$PATH$PATH_SEPARATOR/usr/sbin]) + AC_PATH_PROG([GROUPADD], [[groupadd]], [], [$PATH$PATH_SEPARATOR/usr/sbin]) + AC_PATH_PROG([CHOWN], [[chown]], [], [$PATH$PATH_SEPARATOR/usr/sbin]) + AS_IF([[test -z "$GETENT" -o -z "$USERADD" -o -z "$USERDEL" -o -z "$USERMOD" -o -z "$GROUPADD" -o -z "$CHOWN"]], + [AC_MSG_ERROR([[Required program for --enable-install-user not found]])]) + ]) +AM_CONDITIONAL([COND_INSTALL_USER], [[test "x$enable_install_user" = "xyes"]]) + AC_ARG_WITH([owntone_user], - [AS_HELP_STRING([--with-user=USER], - [User for running OwnTone (default=owntone)])], + [AS_HELP_STRING([--with-user=USER], [User for running OwnTone (default=owntone)])], [[test x"$withval" = xyes && withval=]], [[withval=]]) OWNTONE_USER=${withval:-owntone} AC_SUBST([OWNTONE_USER]) AC_ARG_WITH([owntone_group], - [AS_HELP_STRING([--with-group=GROUP], - [Group for owntone user (default=USER)])], + [AS_HELP_STRING([--with-group=GROUP], [Group for owntone user (default=USER)])], [[test x"$withval" = xyes && withval=]], [[withval=]]) OWNTONE_GROUP=${withval:-$OWNTONE_USER} AC_SUBST([OWNTONE_GROUP]) + +dnl Install config file +OWNTONE_ARG_DISABLE([install configuration file], [install_conf_file], [INSTALL_CONF_FILE]) +AM_CONDITIONAL([COND_INSTALL_CONF_FILE], [[test "x$enable_install_conf_file" = "xyes"]]) + +# Service files are not installed like https://www.freedesktop.org/software/systemd/man/daemon.html +# instructs, because that means they go to /lib/systemd/system (the destination +# for package service files!) instead of /usr/local/etc/systemd/system with a +# default ./configure, and I don't want that on my machine. Also, the suggested +# approach is incredibly ugly. +OWNTONE_ARG_DISABLE([install systemd service file], [install_systemd], [INSTALL_SYSTEMD]) +AM_CONDITIONAL([COND_INSTALL_SYSTEMD], [[test "x$enable_install_systemd" = "xyes"]]) +AC_ARG_WITH([systemddir], + [AS_HELP_STRING([--with-systemddir=DIR], [Directory for systemd service files (default=SYSCONFDIR/systemd/system)])], + [[test x"$withval" = xyes && withval=]], [[withval=]]) +SYSTEMD_DIR=${withval:-$sysconfdir/systemd/system} +AC_SUBST([SYSTEMD_DIR]) + dnl --- End options --- dnl Unconditional since we always want to produce Makefiles for dist targets diff --git a/scripts/freebsd_install.sh b/scripts/freebsd_install.sh index ed8b5573..f569b692 100644 --- a/scripts/freebsd_install.sh +++ b/scripts/freebsd_install.sh @@ -89,14 +89,10 @@ if [ "$yn" = "y" ]; then export CFLAGS="-march=native -g -I/usr/local/include -I/usr/include" export LDFLAGS="-L/usr/local/lib -L/usr/lib" - ./configure && gmake + ./configure --disable-install-systemd && gmake read -p "Should the script install owntone and add service startup scripts? [y/N] " yn if [ "$yn" = "y" ]; then - if [ -f $CONFIG ]; then - echo "Backing up old config file to $CONFIG.bak" - sudo cp "$CONFIG" "$CONFIG.bak" - fi sudo gmake install sudo sed -i -- 's/\/var\/cache/\/usr\/local\/var\/cache/g' $CONFIG