LibreOffice

Installation Headless (Server-Betrieb)

Mit LibreOffice-Core landet auch das Java OpenJDK auf der Maschine.

# without packet "libreoffice" document conversion is not possible
yum -y install libreoffice libreoffice-core

Die Dokumentenkonvertierung per Kommandozeile nicht per soffice --headless --convert-to pdf myfile ausführen, sondern besser das Wrapper Shell-Script aufrufen - es ruft soffice aus dem richtigen Verzeichnis heraus auf:

/usr/bin/libreoffice --headless --convert-to pdf myfile
/usr/bin/libreoffice --headless --convert-to pdf --outdir /tmp/ myfile

LibreOffice Headless mit Apache

Falls der Apache-Webserver LibreOffice per beispielsweise PHP-Skript ausführen können soll:

# configure libreoffice to run from inside of apache
mkdir -p /usr/share/httpd/.config/libreoffice
mkdir -p /usr/share/httpd/.cache
chown -R apache:apache /usr/share/httpd/.config
chown -R apache:apache /usr/share/httpd/.cache

Danach einmalig Benutzer Apache die Shell „/bin/bash“ geben:

su - apache
libreoffice         # an der Meldung "Failed to open display" nicht stören
# mit Ctrl-C abbrechen
exit

Benutzer Apache die Shell wegnehmen.

Damit wurde im Home-Verzeichnis des Benutzers apache ein Unterverzeichnis namens .config/libreoffice inklusive passender Cache-/Konfigurationsdateien erzeugt.

SELinux:

setsebool -P httpd_execmem on
setsebool -P httpd_can_network_connect on

semanage fcontext --add --type httpd_sys_rw_content_t '/usr/share/httpd/\.cache(/.*)?'
restorecon -Fvr /usr/share/httpd/.cache

semanage fcontext --add --type httpd_sys_rw_content_t '/usr/share/httpd/\.config(/.*)?'
restorecon -Fvr /usr/share/httpd/.config
Allow soffice.bin (via httpd) setattr access on the directory cache
cat >/tmp/my-sofficebin.te <<EOF
module my-sofficebin 1.0;

require {
    type lib_t;
    type httpd_t;
    type usr_t;
    class file write;
    class dir setattr;
}

#============= httpd_t ==============
allow httpd_t lib_t:dir setattr;

#!!!! WARNING: 'usr_t' is a base type.
allow httpd_t usr_t:file write;
EOF
cd /tmp
checkmodule --mls -m --output my-sofficebin.mod my-sofficebin.te
semodule_package --outfile my-sofficebin.pp --module my-sofficebin.mod
semodule --install my-sofficebin.pp
Allow jre/bin/java (via httpd) read access on sys/fs/cgroup
cat >/tmp/my-java.te <<EOF
module my-java 1.0;

require {
    type cgroup_t;
    type httpd_t;
    class file read;
}

#============= httpd_t ==============
allow httpd_t cgroup_t:file read;
EOF
cd /tmp
checkmodule --mls -m --output my-java.mod my-java.te
semodule_package --outfile my-java.pp --module my-java.mod
semodule --install my-java.pp

Ein passendes PHP-Skript, was zum Test im Kontext des Apache Webservers auszuführen ist:

<?php

print(filesize('myfile.docx'));
shell_exec('/usr/bin/libreoffice --headless --convert-to pdf --outdir /tmp/ myfile.docx');
// file is created at /tmp/systemd-private-cbae11a1dee34e959b880249be1ce7f9-httpd.service-cBqR1U/tmp/myfile.pdf
print(filesize('/tmp/myfile.pdf'));

Troubleshooting

javaldx: Could not find a Java Runtime Environment! Warning: failed to read path from javaldx

Die Warning tritt nicht auf allen Systemen auf (Ursache unbekannt - wahrscheinlich, falls Java selbst installiert wurde), und kann getrost ignoriert werden.

type=AVC msg=audit(1622025710.901:878): avc: denied { write } for pid=25521 comm=“soffice.bin“ name=“autotbl.fmt“ dev=“dm-0“ ino=16932943 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:usr_t:s0 tclass=file

Built on 2022-06-03