#!/bin/sh # SPDX-License-Identifier: GPL-3.0-or-later # # scripts/deps: install krino's optional content extractors with the host's # system package manager, per docs/design.md §14. # # --print prints the exact command this script would run (and the reason, # when one platform's package list differs from the others), then exits # without running anything and without asking for privileges. `make deps` # calls this script with no flag; plain `make`/`make build` never calls it # at all, so plain `make` never asks for privileges (§14). # # Detection: # - Debian family - /etc/os-release's ID *or* ID_LIKE names "debian" as # one of its (possibly multi-word) values. Devuan is ID=devuan, # ID_LIKE=debian: keying on ID=debian alone would leave it unrecognised. # -> apt-get install poppler-utils catdoc antiword # - FreeBSD (uname -s) -> pkg install poppler-utils antiword. catdoc is # left out on purpose: it pulls in tcl/tk. # - OpenBSD (uname -s) -> pkg_add poppler-utils catdoc antiword # - anything else: print what is needed and exit non-zero. This script # never guesses a package manager. # # Privileges: doas if present, else sudo; if neither exists (and we are not # already root), the command is printed for the user to run as root # themselves, rather than attempting it unprivileged and failing silently. set -eu print_only=0 case "${1:-}" in --print) print_only=1 ;; "") ;; *) echo "usage: $0 [--print]" >&2 exit 2 ;; esac # is_debian_family: true if /etc/os-release's ID or ID_LIKE contains # "debian" as one of its space-separated words. is_debian_family() { [ -r /etc/os-release ] || return 1 ( . /etc/os-release for word in ${ID:-} ${ID_LIKE:-}; do [ "$word" = "debian" ] && exit 0 done exit 1 ) } # privileged CMD...: CMD prefixed with doas or sudo, whichever is found # first; unprefixed if we are already root or if neither exists (the # caller decides what to do in that last case). privileged() { if [ "$(id -u)" = 0 ]; then printf '%s\n' "$*" elif command -v doas >/dev/null 2>&1; then printf 'doas %s\n' "$*" elif command -v sudo >/dev/null 2>&1; then printf 'sudo %s\n' "$*" else printf '%s\n' "$*" fi } note="" if is_debian_family; then pkgcmd="apt-get install poppler-utils catdoc antiword" elif [ "$(uname -s)" = "FreeBSD" ]; then pkgcmd="pkg install poppler-utils antiword" note="catdoc left out on FreeBSD: it pulls in tcl/tk." elif [ "$(uname -s)" = "OpenBSD" ]; then pkgcmd="pkg_add poppler-utils catdoc antiword" else echo "krino's optional extractors: poppler-utils (pdftotext), catdoc, antiword" >&2 echo "no supported package manager detected (uname -s: $(uname -s), no debian-family /etc/os-release)" >&2 echo "install them yourself with whatever this system uses" >&2 exit 1 fi cmd=$(privileged $pkgcmd) [ -n "$note" ] && echo "$note" if [ "$print_only" = 1 ]; then echo "$cmd" exit 0 fi if [ "$(id -u)" != 0 ] && ! command -v doas >/dev/null 2>&1 && ! command -v sudo >/dev/null 2>&1; then echo "neither doas nor sudo found; run this yourself as root:" >&2 echo "$cmd" >&2 exit 1 fi echo "$cmd" exec $cmd