#!/bin/bash readonly toolName="paperless-ngx" readonly toolUser="paperless" readonly toolDeps="python3 python3-pip python3-dev imagemagick fonts-liberation gnupg libpq-dev libmagic-dev mime-support libzbar0 poppler-utils redis-server" readonly toolDepsOcr="unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr" readonly versionUrl="https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest" versionNew= versionNow= downUrl= sq_paperlessDownLoc="/tmp/paperless_latest.tar.xz" sq_aptOpt= sc_paperlessHome="/opt/paperless" sc_paperlessDir="${sc_paperlessHome}/paperless-ngx" seq_config() { ## Called once before executing steps. ## e.g. to source a config file manually: #. "${seq_origin:?}/${seq_configName:?}" ## or to use sequencer api with profile config file support: #if initSeqConfig -p "${seq_fileName:?}" "${seq_configTemplate:?}" ; then ## or to use sequencer api with global config file: #if initSeqConfig "${seq_configName:?}" "${seq_configTemplate:?}" ; then # sq_config=1 #else # # End if no configuration file exists # dry || return 1 #fi ## Apt cmdline option to suppress user interaction interactive || sq_aptOpt="-y" ## Disable error checks if external scripts are used ## e.g. error on unbound variables #disableErrorCheck ## Return of non zero value will abort the sequence return 0 } getVersions() { versionNew="${versionNew:-$(curl --silent "$versionUrl" | grep -Po '"tag_name": "v\K.*?(?=")')}" versionNow=1.7.1 #${versionNow:-$(grep -Po 'Changelog.*Paperless-ngx \K.*?(?= )' 2>/dev/null < "${sc_paperlessDir}/docs/changelog.html")} downUrl="${downUrl:-"https://github.com/paperless-ngx/paperless-ngx/releases/download/v${versionNew:?}/paperless-ngx-v${versionNew:?}.tar.xz"}" } step_1_info() { echo "Status of ${toolName}"; } step_1_alias() { echo "status"; } step_1() { die "Testende" getVersions info -n "${toolName} " if [[ -n "${versionNow}" ]] ; then color green info -d "version ${versionNow} installed" if [[ ! ${versionNow:-} == ${versionNew} ]] ; then info -a "Update available to version ${versionNew} from:" info -a "${downUrl}" fi else color yellow info -d "not installed" info -a "Version ${versionNew} available for installation from:" info -a "${downUrl}" fi } step_3_info() { echoinfoArgs "[status|start|stop]"; echo "Manage ${toolName} services"; } step_3_alias() { echo "service"; } step_3() { shift local serviceCommand="status" local serviceOpt="-n 0" case "${1:-}" in start) serviceOpt= serviceCommand="${1}" ;; stop) serviceOpt= serviceCommand="${1}" ;; status) serviceCommand="${1}" ;; "") ;; *) error "Unknown command ${1:-"-"}" return 1 ;; esac exe systemctl ${serviceOpt:-} "${serviceCommand:?}" paperless-webserver exe systemctl ${serviceOpt:-} "${serviceCommand:?}" paperless-scheduler exe systemctl ${serviceOpt:-} "${serviceCommand:?}" paperless-consumer } step_10_info() { echo "Install python3"; } step_10_alias() { echo "install"; } step_10() { exe apt update exe apt install ${toolDeps} ${aptOpt:-} exe apt install ${toolDepsOcr} ${aptOpt:-} } step_11_info() { echo "Add system user"; } step_11() { if id "${toolUser}" >/dev/null 2>&1 ; then endReturn -o 1 "User ${toolUser} already exists" fi exe adduser "${toolUser}" --system --group --home "${sc_paperlessHome}" } step_12_info() { echo "Install/upgrade ${toolName}"; } step_12_alias() { echo "upgrade"; } step_12() { local toolUpgrade=0 getVersions if [[ ${versionNow:-} == ${versionNew} ]] ; then endReturn -o 1 "Latest version ${versionNow} already installed" else if [ -n "${versionNow:-}" ] ; then info "Upgrading $toolName from ${versionNow} to ${versionNew}" else info "Installing $toolName version ${versionNew}" fi fi exe wget ${downUrl} -q -O "${sq_paperlessDownLoc}" endReturn -o $? "Download failed" if [ -e "${sc_paperlessDir}" ] ; then if step backup --nostart; then info "Backup successful" else endReturn -o 1 "Backup failed." fi toolUpgrade=1 exe mv "${sc_paperlessDir}" "${sc_paperlessDir}_bu" fi exe tar -xf "${sq_paperlessDownLoc}" -C "${sc_paperlessHome}" exe chown -R "${toolUser}": "${sc_paperlessDir}" exe install --owner="${toolUser}" --group="${toolUser}" -d "${sc_paperlessHome}/"{consume,data,media} if ((toolUpgrade)) ; then info "Moving over ${toolName} and gunicorn configuration" addConf -c -f "${sc_paperlessDir}_bu/paperless.conf" "${sc_paperlessDir}/paperless.conf" saveReturn $? addConf -c -f "${sc_paperlessDir}_bu/gunicorn.conf.py" "${sc_paperlessDir}/gunicorn.conf.py" saveReturn $? endReturn "${toolName} configuration could not be transferred. ${sc_paperlessDir}_bu not deleted." exe rm -rf "${sc_paperlessDir}_bu" info "Starting post upgrade procedure" step postupgrade step service start die "Upgrade finished" fi } step_13_info() { echo "Install other dependcies"; } step_13() { exe cd "${sc_paperlessHome}" exe sudo -Hu paperless pip3 install --upgrade pip info "Remove '-e' before the line for django-q" ask "Press Enter to continue?" editor "${sc_paperlessDir}/requirements.txt" exe sudo -Hu paperless pip3 install --requirement "${sc_paperlessDir}/requirements.txt" } step_14_info() { echo "Initialization"; } step_14() { exe cd "${sc_paperlessDir}/src" exe sudo -Hu paperless python3 manage.py migrate exe sudo -Hu paperless python3 manage.py createsuperuser } step_16_info() { echo "Post upgrade steps"; } step_16_alias() { echo "postupgrade"; } step_16() { exe cd "${sc_paperlessDir}/src" step 13 exe sudo -Hu paperless python3 manage.py migrate } step_20_info() { echo "Notes"; } step_20_alias() { echo "notes"; } step_20() { color green cat < EOF_NOTES color none } step_30_info() { echoinfoArgs "[--nostart]"; echo "Backup ${toolName}"; } step_30_alias() { echo "backup"; } step_30() { shift info "Doing backup..." step service stop exe cd "$(dirname -- "${sc_paperlessHome}")" exe tar czf "/root/backup/paperless_backup_$(date +%Y%m%d-%H%M%S).tar.gz" "$(basename -- "${sc_paperlessHome}")" if [[ ${1:-} == "--nostart" ]] ; then info "Not starting ${toolName} services after backup" else step service start fi } readonly sqr_minVersion=16 . sequencer.sh