From f2b759c72cb8cb0696ca4a9206cd9f38d89db48d Mon Sep 17 00:00:00 2001 From: Martin Winkler Date: Sun, 28 Aug 2022 18:16:04 +0200 Subject: [PATCH] paperless - Heavy rework to support paperless-ngx (not configurable yet) --- seqs/paperless.sh | 248 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 225 insertions(+), 23 deletions(-) diff --git a/seqs/paperless.sh b/seqs/paperless.sh index 42fe2ef..b59d764 100755 --- a/seqs/paperless.sh +++ b/seqs/paperless.sh @@ -1,32 +1,234 @@ #!/bin/bash -step_1_info() { echo "Install python3"; } +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() { - exe apt update - exe apt install python3 python3-pip -} - -step_2_info() { echo "Get paperless using git (checkout 2.7.0)"; } -step_2() { - exe git clone https://github.com/the-paperless-project/paperless.git /opt/paperless - exe cd /opt/paperless && git checkout 2.7.0 -} - -step_3_info() { echo "Install other dependcies"; } -step_3() { - exe apt install gnupg tesseract-ocr tesseract-ocr-deu imagemagick unpaper libpoppler-cpp-dev optipng - exe pip3 install --user --requirement /opt/paperless/requirements.txt -} - -step_4_info() { echo "Paperless configuration file"; } -step_4() { - if [ ! -f /etc/paperless.conf ] ; then - cp -ar paperless.conf.example /etc/paperless.conf + 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 - echo "[ WARN ] Configuration already exists. Doing nothing" + 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