diff --git a/roles/calibre-web/README.rst b/roles/calibre-web/README.rst index 28ea2b38b..84b5cadae 100644 --- a/roles/calibre-web/README.rst +++ b/roles/calibre-web/README.rst @@ -147,11 +147,11 @@ Known Issues it's not a priority, as URL's like {http://192.168.0.x/books, http://10.8.0.x/books, http://127.0.0.1/books and http://box/books} all work. |se| |nbsp| Marked as "wontfix" on 2018-09-12: `#1050 `_ -* Calibre-Web does not currently use version numbers, so glitches may +* |ss| Calibre-Web does not currently use version numbers, so glitches may occasionally arise, when upstream developers change its master branch without - warning. + warning. |se| -* Imagemagick policy prevents generating thumbnails for PDF's during upload: `#1530 `_ `janeczku/calibre-web#827 `_ +* |ss| Imagemagick policy prevents generating thumbnails for PDF's during upload: `#1530 `_ `janeczku/calibre-web#827 `_ |se| * Upload of not supported file formats gives no feedback to the user: `janeczku/calibre-web#828 `_ diff --git a/roles/calibre-web/defaults/main.yml b/roles/calibre-web/defaults/main.yml index 689808dec..59a38fb1e 100644 --- a/roles/calibre-web/defaults/main.yml +++ b/roles/calibre-web/defaults/main.yml @@ -19,16 +19,16 @@ calibreweb_version: 0.6.5 # WAS: master, 0.6.4 calibreweb_venv_path: /usr/local/calibre-web calibreweb_exec_path: "{{ calibreweb_venv_path }}/cps.py" -# calibre-web folder to store configuration files. +# Config files put in: calibreweb_config: "{{ calibreweb_home }}/config" -# calibre-web setup will be provisioned with default administrative account, +# Calibre-Web will be provisioned with default administrative account, # metadata.db and language if /library/calibre-web/metadata.db does not exist. # NOT CURRENTLY IN USE: calibreweb_provision: True calibreweb_settings_database: app.db calibreweb_database: metadata.db -# calibre-web system user +# Files owned by: calibreweb_user: root # UNUSED variables, as of March 2019: diff --git a/roles/calibre-web/tasks/apache.yml b/roles/calibre-web/tasks/apache.yml new file mode 100644 index 000000000..34bf00f32 --- /dev/null +++ b/roles/calibre-web/tasks/apache.yml @@ -0,0 +1,12 @@ +- name: Enable http://box{{ calibreweb_url1 }}, http://box{{ calibreweb_url2 }}, http://box{{ calibreweb_url3 }} via Apache # http://box/books, http://box/libros, http://box/livres + command: a2ensite calibre-web.conf + when: calibreweb_enabled | bool + +- name: Disable http://box{{ calibreweb_url1 }}, http://box{{ calibreweb_url2 }}, http://box{{ calibreweb_url3 }} via Apache + command: a2dissite calibre-web.conf + when: not calibreweb_enabled + +- name: Restart '{{ apache_service }}' systemd service + systemd: + name: "{{ apache_service }}" # apache2 or httpd, as set in /opt/iiab/iiab/vars/.yml + state: restarted diff --git a/roles/calibre-web/tasks/enable.yml b/roles/calibre-web/tasks/enable.yml deleted file mode 100644 index 07812fc59..000000000 --- a/roles/calibre-web/tasks/enable.yml +++ /dev/null @@ -1,85 +0,0 @@ -- name: Enable & Restart 'calibre-web' systemd service - systemd: - name: calibre-web - daemon_reload: yes - enabled: yes - state: restarted - when: calibreweb_enabled | bool - -- name: Disable & Stop 'calibre-web' systemd service - systemd: - name: calibre-web - enabled: no - state: stopped - when: not calibreweb_enabled - -# SEE ALSO: https://github.com/janeczku/calibre-web/wiki/Setup-Reverse-Proxy - -# Apache - -# i.e. http://box/books, http://box/libros, http://box/livres - -- name: Enable http://box{{ calibreweb_url1 }}, http://box{{ calibreweb_url2 }}, http://box{{ calibreweb_url3 }} via Apache - command: a2ensite calibre-web.conf - when: apache_install and calibreweb_enabled - -- name: Disable http://box{{ calibreweb_url1 }}, http://box{{ calibreweb_url2 }}, http://box{{ calibreweb_url3 }} via Apache - command: a2dissite calibre-web.conf - when: apache_install and not calibreweb_enabled - -- name: Restart Apache systemd service ({{ apache_service }}) - systemd: - name: "{{ apache_service }}" # apache2 or httpd, as set in /opt/iiab/iiab/vars/.yml - state: restarted - when: apache_enabled | bool - -# NGINX - -# TO DO: restore http://box/libros & http://box/livres, alongside English (#2195) - -- name: Enable http://box{{ calibreweb_url1 }} via NGINX, by installing {{ nginx_conf_dir }}/calibre-web-nginx.conf from template # http://box/books - template: - src: calibre-web-nginx.conf.j2 - dest: "{{ nginx_conf_dir }}/calibre-web-nginx.conf" # /etc/nginx/conf.d - when: nginx_install and calibreweb_enabled - -- name: Disable http://box{{ calibreweb_url1 }} via NGINX, by removing {{ nginx_conf_dir }}/calibre-web-nginx.conf - file: - path: "{{ nginx_conf_dir }}/calibre-web-nginx.conf" # /etc/nginx/conf.d - state: absent - when: nginx_install and not calibreweb_enabled - -- name: Restart 'nginx' systemd service - systemd: - name: nginx - state: restarted - when: nginx_enabled | bool - - -- name: Add 'calibre-web' variable values to {{ iiab_ini_file }} - ini_file: - path: "{{ iiab_ini_file }}" - section: calibre-web - option: "{{ item.option }}" - value: "{{ item.value | string }}" - with_items: - - option: name - value: Calibre-Web - - option: description - value: '"Calibre-Web is a web app providing a clean interface for browsing, reading and downloading e-books."' - - option: calibreweb_url1 - value: "{{ calibreweb_url1 }}" - - option: calibreweb_url2 - value: "{{ calibreweb_url2 }}" - - option: calibreweb_url3 - value: "{{ calibreweb_url3 }}" - - option: calibreweb_path - value: "{{ calibreweb_venv_path }}" - - option: calibreweb_home - value: "{{ calibreweb_home }}" - - option: calibreweb_port - value: "{{ calibreweb_port }}" - - option: calibreweb_database - value: "{{ calibreweb_database }}" - - option: calibreweb_enabled - value: "{{ calibreweb_enabled }}" diff --git a/roles/calibre-web/tasks/install.yml b/roles/calibre-web/tasks/install.yml index 96a4940ca..6b98dd2b3 100644 --- a/roles/calibre-web/tasks/install.yml +++ b/roles/calibre-web/tasks/install.yml @@ -1,39 +1,36 @@ -- name: Install ImageMagick package (debuntu) +- name: "Install ImageMagick package: imagemagick" package: name: imagemagick state: present - when: is_debuntu | bool -- name: Allow ImageMagick to read PDFs (debuntu) +- name: Allow ImageMagick to read PDFs, per /etc/ImageMagick-6/policy.xml, to create book cover thumbnails lineinfile: path: /etc/ImageMagick-6/policy.xml regexp: '' backrefs: yes line: ' ' state: present - when: is_debuntu | bool -- name: "Create 3 Calibre-Web folders to store data and configuration files: {{ calibreweb_home }}, {{ calibreweb_venv_path }}, {{ calibreweb_config }}" +- name: "Create 3 Calibre-Web folders to store data and config files: {{ calibreweb_home }}, {{ calibreweb_venv_path }}, {{ calibreweb_config }} (all set to {{ calibreweb_user }}:{{ apache_user }}, '0755')" file: - path: "{{ item }}" - owner: "{{ calibreweb_user }}" - group: "{{ apache_user }}" - mode: '0755' state: directory + path: "{{ item }}" + owner: "{{ calibreweb_user }}" # root + group: "{{ apache_user }}" # www-data on debuntu + mode: '0755' with_items: - - "{{ calibreweb_home }}" - - "{{ calibreweb_venv_path }}" - - "{{ calibreweb_config }}" + - "{{ calibreweb_home }}" # /library/calibre-web + - "{{ calibreweb_venv_path }}" # /usr/local/calibre-web + - "{{ calibreweb_config }}" # /library/calibre-web/config ## TODO: Calibre-web future release might get into pypi https://github.com/janeczku/calibre-web/issues/456 -- name: Download Calibre-Web github repository to {{ calibreweb_venv_path }} +- name: Clone i.e. download Calibre-Web ({{ calibreweb_version }}) from https://github.com/janeczku/calibre-web.git to {{ calibreweb_venv_path }} git: repo: https://github.com/janeczku/calibre-web.git - dest: "{{ calibreweb_venv_path }}" + dest: "{{ calibreweb_venv_path }}" # /usr/local/calibre-web force: yes - #update: yes # not needed, as Ansible's default is to update depth: 1 - version: "{{ calibreweb_version }}" + version: "{{ calibreweb_version }}" # e.g. master, 0.6.5 when: internet_available | bool ## Ansible Pip Bug: Cannot use 'chdir' with 'env' https://github.com/ansible/ansible/issues/37912 (Patch landed) @@ -45,31 +42,32 @@ # ignore_errors: True ## # Implementing this with Ansible command module for now. -- name: Download Calibre-Web dependencies (using pip) into virtual environment +- name: Download Calibre-Web dependencies (using pip) into python2.7 virtual environment {{ calibreweb_venv_path }} pip: requirements: "{{ calibreweb_venv_path }}/requirements.txt" - virtualenv: "{{ calibreweb_venv_path }}" + virtualenv: "{{ calibreweb_venv_path }}" # /usr/local/calibre-web virtualenv_site_packages: no virtualenv_command: /usr/bin/virtualenv virtualenv_python: python2.7 when: internet_available | bool -- name: Symlink {{ calibreweb_venv_path }}/vendor to {{ calibreweb_venv_path }}/lib/python2.7/site-packages to keep cps.py happy +# 2020-02-02: IS PYTHON 3 POSSIBLE ABOVE AND BELOW? + +- name: Symlink {{ calibreweb_venv_path }}/vendor -> {{ calibreweb_venv_path }}/lib/python2.7/site-packages - to keep {{ calibreweb_venv_path }}/cps.py happy file: src: "{{ calibreweb_venv_path }}/lib/python2.7/site-packages" - dest: "{{ calibreweb_venv_path }}/vendor" + path: "{{ calibreweb_venv_path }}/vendor" # /usr/local/calibre-web state: link -- name: Install unit file /etc/systemd/system/calibre-web.service & /etc/apache2/sites-available/calibre-web.conf for http://box{{ calibreweb_url1 }}, http://box{{ calibreweb_url2 }}, http://box{{ calibreweb_url3 }} from templates +- name: Install /etc/systemd/system/calibre-web.service from template template: - src: "{{ item.src }}" - dest: "{{ item.dest }}" - # owner: root - # group: root - # mode: '0644' - with_items: - - { src: 'calibre-web.service.j2', dest: '/etc/systemd/system/calibre-web.service' } - - { src: 'calibre-web.conf.j2', dest: '/etc/apache2/sites-available/calibre-web.conf' } + src: calibre-web.service.j2 + dest: /etc/systemd/system/calibre-web.service + +- name: Install /etc/{{ apache_conf_dir }}/calibre-web.conf from template, for http://box{{ calibreweb_url1 }}, http://box{{ calibreweb_url2 }}, http://box{{ calibreweb_url3 }} via Apache # http://box/books, http://box/libros, http://box/livres + template: + src: calibre-web.conf.j2 + dest: "/etc/{{ apache_conf_dir }}/calibre-web.conf" # apache2/sites-available on debuntu when: apache_install | bool - name: Does /library/calibre-web/metadata.db exist? @@ -77,12 +75,12 @@ path: /library/calibre-web/metadata.db register: metadatadb -- name: Provision/Copy both default metadata files into /library/calibre-web IF metadata.db did not exist +- name: Provision/Copy both default metadata files (metadata.db, metadata_db_prefs_backup.json) into {{ calibreweb_home }} IF metadata.db did not exist copy: src: "{{ item }}" - dest: "{{ calibreweb_home }}" - owner: "{{ calibreweb_user }}" - group: "{{ apache_user }}" + dest: "{{ calibreweb_home }}" # /library/calibre-web + owner: "{{ calibreweb_user }}" # root + group: "{{ apache_user }}" # www-data on debuntu mode: '0644' backup: yes with_items: @@ -91,12 +89,12 @@ when: not metadatadb.stat.exists #when: calibreweb_provision | bool -- name: Provision/Copy default admin settings to {{ calibreweb_config }}/app.db IF metadata.db did not exist # {{ calibreweb_config }} is /library/calibre-web/config +- name: Provision/Copy default admin settings to {{ calibreweb_config }}/app.db IF metadata.db did not exist copy: src: roles/calibre-web/files/app.db - dest: "{{ calibreweb_config }}" - owner: "{{ calibreweb_user }}" - group: "{{ apache_user }}" + dest: "{{ calibreweb_config }}" # /library/calibre-web/config + owner: "{{ calibreweb_user }}" # root + group: "{{ apache_user }}" # www-data on debuntu mode: '0644' backup: yes when: not metadatadb.stat.exists diff --git a/roles/calibre-web/tasks/main.yml b/roles/calibre-web/tasks/main.yml index 6b4276c8d..76d294179 100644 --- a/roles/calibre-web/tasks/main.yml +++ b/roles/calibre-web/tasks/main.yml @@ -1,5 +1,77 @@ -- include_tasks: install.yml - when: calibreweb_install and not calibreweb_installed is defined +# "How do i fail a task in Ansible if the variable contains a boolean value? +# I want to perform input validation for Ansible playbooks" +# https://stackoverflow.com/questions/46664127/how-do-i-fail-a-task-in-ansible-if-the-variable-contains-a-boolean-value-i-want/46667499#46667499 -- include_tasks: enable.yml - when: calibreweb_install or calibreweb_installed is defined +# We assume 0-init/tasks/validate_vars.yml has DEFINITELY been run, so no need +# to re-check whether vars are defined here. As Ansible vars cannot be unset: +# https://serverfault.com/questions/856729/how-to-destroy-delete-unset-a-variable-value-in-ansible + +- name: Assert that "calibreweb_install is sameas true" (boolean not string etc) + assert: + that: calibreweb_install is sameas true + fail_msg: "PLEASE SET 'calibreweb_install: True' e.g. IN: /etc/iiab/local_vars.yml" + quiet: yes + +- name: Assert that "calibreweb_enabled | type_debug == 'bool'" (boolean not string etc) + assert: + that: calibreweb_enabled | type_debug == 'bool' + fail_msg: "PLEASE GIVE VARIABLE 'calibreweb_enabled' A PROPER (UNQUOTED) ANSIBLE BOOLEAN VALUE e.g. IN: /etc/iiab/local_vars.yml" + quiet: yes + + +- name: Install Calibre-Web if 'calibreweb_installed' not defined, e.g. in {{ iiab_state_file }} # /etc/iiab/iiab_state.yml + include_tasks: install.yml + when: calibreweb_installed is undefined + + +- name: Enable & Restart 'calibre-web' systemd service, if calibreweb_enabled + systemd: + name: calibre-web + daemon_reload: yes + enabled: yes + state: restarted + when: calibreweb_enabled | bool + +- name: Disable & Stop 'calibre-web' systemd service, if not calibreweb_enabled + systemd: + name: calibre-web + enabled: no + state: stopped + when: not calibreweb_enabled + +- name: Enable/Disable/Restart Apache if primary + include_tasks: apache.yml + when: not nginx_enabled + +- name: Enable/Disable/Restart NGINX if primary + include_tasks: nginx.yml + when: nginx_enabled | bool + + +- name: Add 'calibre-web' variable values to {{ iiab_ini_file }} + ini_file: + path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini + section: calibre-web + option: "{{ item.option }}" + value: "{{ item.value | string }}" + with_items: + - option: name + value: Calibre-Web + - option: description + value: '"Calibre-Web is a web app providing a clean interface for browsing, reading and downloading e-books."' + - option: calibreweb_url1 + value: "{{ calibreweb_url1 }}" + - option: calibreweb_url2 + value: "{{ calibreweb_url2 }}" + - option: calibreweb_url3 + value: "{{ calibreweb_url3 }}" + - option: calibreweb_path + value: "{{ calibreweb_venv_path }}" + - option: calibreweb_home + value: "{{ calibreweb_home }}" + - option: calibreweb_port + value: "{{ calibreweb_port }}" + - option: calibreweb_database + value: "{{ calibreweb_database }}" + - option: calibreweb_enabled + value: "{{ calibreweb_enabled }}" diff --git a/roles/calibre-web/tasks/nginx.yml b/roles/calibre-web/tasks/nginx.yml new file mode 100644 index 000000000..9c9a0f63e --- /dev/null +++ b/roles/calibre-web/tasks/nginx.yml @@ -0,0 +1,19 @@ +# TO DO: restore http://box/libros & http://box/livres etc, alongside English (#2195) +# RELATED: https://github.com/janeczku/calibre-web/wiki/Setup-Reverse-Proxy + +- name: Enable http://box{{ calibreweb_url1 }} via NGINX, by installing {{ nginx_conf_dir }}/calibre-web-nginx.conf from template # http://box/books + template: + src: calibre-web-nginx.conf.j2 + dest: "{{ nginx_conf_dir }}/calibre-web-nginx.conf" # /etc/nginx/conf.d + when: calibreweb_enabled | bool + +- name: Disable http://box{{ calibreweb_url1 }} via NGINX, by removing {{ nginx_conf_dir }}/calibre-web-nginx.conf + file: + path: "{{ nginx_conf_dir }}/calibre-web-nginx.conf" # /etc/nginx/conf.d + state: absent + when: not calibreweb_enabled + +- name: Restart 'nginx' systemd service + systemd: + name: nginx + state: restarted diff --git a/roles/calibre-web/templates/calibre-web-nginx.conf.j2 b/roles/calibre-web/templates/calibre-web-nginx.conf.j2 index 8a9e435c0..dd9d1d912 100644 --- a/roles/calibre-web/templates/calibre-web-nginx.conf.j2 +++ b/roles/calibre-web/templates/calibre-web-nginx.conf.j2 @@ -1,3 +1,6 @@ +# TO DO: restore http://box/libros & http://box/livres etc, alongside English (#2195) +# RELATED: https://github.com/janeczku/calibre-web/wiki/Setup-Reverse-Proxy + location {{ calibreweb_url1 }}/ { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/vars/default_vars.yml b/vars/default_vars.yml index 7025ed4d5..340381f4e 100644 --- a/vars/default_vars.yml +++ b/vars/default_vars.yml @@ -577,7 +577,7 @@ calibre_via_python: False calibre_port: 8080 # http://box:8080 & http://box:8080/mobile WORK FOR NOW, but short/mnemonic # URL's like http://box/calibre DON'T YET WORK -- BOOKS RARELY DISPLAY: -calibre_web_path: calibre # NEEDS WORK: https://github.com/iiab/iiab/issues/529 +calibre_web_path: calibre #NEEDS WORK: https://github.com/iiab/iiab/issues/529 # Avoid URL collisions w/ calibreweb_url1, calibreweb_url2, calibreweb_url3 below! # WARNING: Calibre-Web (below) depends on Calibre's own /usr/bin/ebook-convert