Page 1 of 2

Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 13:00
by Jolinar
Es ist ja bekannt, daß KeyHelp bei der Aktualisierung von Roundcube den Plugin-Ordner komplett neu schreibt und dadurch benutzerdefinierte Plugins, die man manuell eingepflegt hat, danach logischerweise nicht mehr vorhanden sind.

Ich hatte hier-> Roundcube & 2FA schon mal einen Workaround geschrieben, wo man mittels eines kleinen Shellscripts ein Plugin (in dem Workaround das 2FA-Plugin) wiederherstellen kann.

Da das Script nur eine Notlösung war, hab ich mich mal hingesetzt und ein vernünftiges Shellscript entworfen, mit dem man beliebige manuell eingepflegte Plugins nach einem RC Update wiederherstellen kann.
Ich habe auch die Arbeitsweise des Scripts optimiert, so daß es nicht in Zeitintervallen immer wieder neu aufgerufen werden muß. In dieser Version reicht ein Cronjob @reboot.
Das Script benötigt die beiden Pakete "inotify-tools" und "mailutils", welche automatisch installiert werden, wenn sie nicht vorhanden sind.
Weiterhin schreibt das Script ein Logfile und versendet Mails bei Aktivität.
Alle Details sind in der Kommentarsektion am Anfang des Scripts nochmal erläutert.

Ich habe im Script beispielhaft wieder das 2FA Plugin verwendet. Wer dieses Plugin nicht benötigt, sollte es natürlich aus dem assoziativen Array entfernen, bevor das Script zum Einsatz kommt. ;)

Hinweis:
Benutzderfinierte Plugins werden von Roundcube erst dann verwendet, wenn diese im Panel unter Konfiguration >> Webmail >> Plugins eingetragen sind.

Hier das vollständige Script:

Code: Select all

#!/bin/bash

#
#
# Automated Roundcube Plugin Monitoring Script
# Script Name: rc-plugin-watcher.sh
#
# Purpose:
# This script monitors selected Roundcube plugins for changes
# and automatically restores them if they are deleted.
#
# Note:
# The script uses inotify to respond to delete events in the
# plugin directories and sends email notifications when plugins are restored.
# The script automatically ensures that the packages "inotify-tools" and "mailutils"
# are installed on your system.
#
# Usage:
# 1. Define the "notification_email" variable as the
#    email address for notifications.
# 2. Set up the script as a @reboot cron job to run it automatically after a reboot.
#    Add the following line to your crontab file (using crontab -e):
#    @reboot /bin/bash /path/to/script/rc-plugin-watcher.sh
# 3. Add plugin information (Name and URL) to the "plugins"
#    associative array to monitor different plugins.
#
# Log File:
# The script writes its activities to a log file. The log file
# is located at: /var/log/rc-plugin-watcher.log
#
# Example of Plugin Definition:
# declare -A plugins=(
#     ["plugin_name"]="https://github.com/plugin_author/plugin_repo/archive/refs/heads/master.zip"
#     # Add more plugins here
# )
#
# Author: Jolinar
#

# Checking user privileges
if [[ $EUID -ne 0 ]]; then
    exit 1
fi

# Email address for notifications
notification_email="your@email.tld"

# Determining the server name
server_name=$(hostname)

# Path to the log file
logfile="/var/log/rc-plugin-watcher.log"

# Function to check and install packages if not present
check_and_install_packages() {
    local packages=("inotify-tools" "mailutils")

    for package in "${packages[@]}"; do
        if ! dpkg -l | grep -q "^ii\s*$package"; then
            apt-get -y install -q "$package" >/dev/null 2>&1
            echo "$(date '+%Y-%m-%d %H:%M:%S') - Package $package was installed." >> "$logfile"
        fi
    done
}

# Checking and possibly installing the packages
check_and_install_packages

# Creating the log file if not present
touch "$logfile"

# Directories
workdir="/usr/src/workdir"
plugindir="/home/keyhelp/www/roundcube/plugins"

# List of desired plugins and their URLs
declare -A plugins=(
    ["twofactor_gauthenticator"]="https://github.com/alexandregz/twofactor_gauthenticator/archive/refs/heads/master.zip"
    # Add more plugins here
)

# Function to download and install a plugin
install_plugin() {
    local plugin_name="$1"
    local plugin_url="${plugins[$plugin_name]}"
    
    if [ ! -d "$plugindir/$plugin_name" ]; then
        mkdir -p "$workdir"
        cd "$workdir" || exit 1
    
        wget -q "$plugin_url" -O plugin.zip
        if [ $? -eq 0 ]; then
            unzip -q plugin.zip
            rm plugin.zip
            mv "$plugin_name"-master "$plugindir/$plugin_name"
            chown -R keyhelp:keyhelp "$plugindir/$plugin_name"
            find "$plugindir/$plugin_name" \( -type d -exec chmod 755 {} + \) -o \( -type f -exec chmod 644 {} + \)
            
            # Using mailutils for email sending
            echo "$(date '+%Y-%m-%d %H:%M:%S') - Roundcube Plugin '$plugin_name' was restored on server '$server_name'." >> "$logfile"
            echo "Roundcube Plugin '$plugin_name' was restored on server '$server_name'." | mail -s "Plugin Restoration on Server $server_name" "$notification_email"
        fi
    fi
}

# Loop through the defined plugins and install them if missing
for plugin_name in "${!plugins[@]}"; do
    if [ ! -d "$plugindir/$plugin_name" ]; then
        install_plugin "$plugin_name"
    fi
done

# Monitoring plugin directories using inotify
while true; do
    event=$(inotifywait -q -e delete "$plugindir")
    plugin_name=$(echo "$event" | awk '{print $3}')
    if [[ -n "${plugins[$plugin_name]}" ]]; then
        install_plugin "$plugin_name"
    fi
done

exit 0

Alternativ auch direkt zum Download:

Code: Select all

wget -q https://ngc4594.eu/rc-plugin-watcher.sh

Ich lege solche Scripte immer im Verzeichnis /usr/local/bin/ ab.

Das Script jetzt noch mit:

Code: Select all

chmod +x /pfad/zum/script/rc-plugin-watcher.sh
ausführbar machen und den Cronjob @reboot einrichten.
Das wars auch schon! :mrgreen:



Bitte nochmal auf Fehler bzw. Unzulänglichkeiten prüfen.
Ansonsten viel Spaß bei der Nutzung :mrgreen: :geek: :ugeek:

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 16:01
by 24unix
Jolinar wrote: Tue 22. Aug 2023, 13:00 Bitte nochmal auf Fehler bzw. Unzulänglichkeiten prüfen.
Ich würde die Variablen, die man ändern muss nach ganz oben setzen.

Ansonsten habe ich nicht weiter geschaut, sorry, meine Aversion gegen Denglisch … :)

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 16:07
by Jolinar
24unix wrote: Tue 22. Aug 2023, 16:01 sorry, meine Aversion gegen Denglisch … :)
Bis auf die Benennung der Funktionen ist das Script in deutsch.
Funktionen benenne ich deshalb schon grundsätzlich in englisch, weil in den Funktionen sowieso immer irgendwelche Systembefehle verarbeitet werden...da wäre es dann komisch, wenn die Funktionen eine deutsche Bennenung hätten.

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 16:10
by 24unix
Jolinar wrote: Tue 22. Aug 2023, 16:07
24unix wrote: Tue 22. Aug 2023, 16:01 sorry, meine Aversion gegen Denglisch … :)
Bis auf die Benennung der Funktionen ist das Script in deutsch.
Ja, und da sträubt sich bei mir innerlich alles.

Ist mein persönliche Problem, muss Dich nicht tangieren :-) Ich bekomme bei IT-Zeitschriften mit solchen Listings auch immer Zustände.

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 16:29
by Jolinar
24unix wrote: Tue 22. Aug 2023, 16:10 Ist mein persönliche Problem, muss Dich nicht tangieren
Zumindest in diesem Fall hab ich dein Problem gelöst...Hab mal alles übersetzt. :mrgreen: :geek: :ugeek:

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 16:46
by 24unix
Jolinar wrote: Tue 22. Aug 2023, 16:29
24unix wrote: Tue 22. Aug 2023, 16:10 Ist mein persönliche Problem, muss Dich nicht tangieren
Zumindest in diesem Fall hab ich dein Problem gelöst...Hab mal alles übersetzt. :mrgreen: :geek: :ugeek:
Oh, wow, aber ich brauche nicht wirklich immer eine Extrawurst, evtl. haben andere es lieber in ihrer Muttersprache.

Da tickt eben jeder anders, ich habe mal mit einen studiertem Informatiker (Uni-BW) gearbeitet, der mir was von Verklemmungen erzählt hat, bis ich dann peilte, dass er dead locks meinte :)

Ich bin halt Autodidakt, habe das Meiste in der Vor-Internet-Zeit aus den O'Reilly-Schinken (und mein berufsbegleitendes Info-Studium nach dem drittem Semester wegen Sinnlosigkeit geschmissen) und danach von englischsprachigen Seiten gelernt.

Aber, wenn Du Dir schon die Mühe macht, schau ich mir mal das ganze Script an :)
# Checking user privileges
if [[ $EUID -ne 0 ]]; then
exit 1
fi
OK, braucht root Rechte.

Code: Select all

            sudo apt-get -y install -q "$package" >/dev/null 2>&1
Merkste selber, oder? :)

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 16:53
by Jolinar
24unix wrote: Tue 22. Aug 2023, 16:46 Merkste selber, oder? :)
Ganz ehrlich?
Das ist eher Gewohnheit und hat damit zu tun, daß ich grundsätzlich kein Ubuntu verwende und daher nicht immer sicher weiß, wie sich Ubuntu da verhält. Deswegen pack ich eigentlich immer ein sudo davor, so bin ich (ohne großes Nachdenken) auf jeden Fall immer auf der sicheren Seite. ;)

Aber von der Logik her hast du natürlich recht. Hab das sudo mal entfernt. :mrgreen: :geek: :ugeek:

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 22. Aug 2023, 17:01
by 24unix
Jolinar wrote: Tue 22. Aug 2023, 16:53
24unix wrote: Tue 22. Aug 2023, 16:46 Merkste selber, oder? :)
Ganz ehrlich?
Das ist eher Gewohnheit und hat damit zu tun, daß ich grundsätzlich kein Ubuntu verwende und daher nicht immer sicher weiß, wie sich Ubuntu da verhält. Deswegen pack ich eigentlich immer ein sudo davor, so bin ich (ohne großes Nachdenken) auf jeden Fall immer auf der sicheren Seite. ;)

Aber von der Logik her hast du natürlich recht. Hab das sudo mal entfernt. :mrgreen: :geek: :ugeek:
In diesem Fall passt es, weil unter KH immer sudo vorhanden ist, bei einem Debian per debootstrap knallt es dann.

Ausser auf meinem Macs und den Kisten mit KH habe ich kein sudo auf den Kisten.

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 29. Aug 2023, 14:35
by Grissom
Hi,

ich habe mein Keyhelp unter Debian 11 laufen und bekomme beim Ausführen des Scripts folgende Fehler:
rc-plugin-watcher.sh: 41: [[: not found
rc-plugin-watcher.sh: 56: Syntax error: "(" unexpected (expecting "}")
Ist das mit "...bei einem Debian per debootstratp knallt es dann." gemeint? Was müßte ich wie ändern?

Grüße
Christian

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 29. Aug 2023, 14:56
by 24unix
Grissom wrote: Tue 29. Aug 2023, 14:35 Hi,

ich habe mein Keyhelp unter Debian 11 laufen und bekomme beim Ausführen des Scripts folgende Fehler:
rc-plugin-watcher.sh: 41: [[: not found
rc-plugin-watcher.sh: 56: Syntax error: "(" unexpected (expecting "}")
Ist das mit "...bei einem Debian per debootstratp knallt es dann." gemeint? Was müßte ich wie ändern?
Das ist eine Fehlermeldung die normalerweise Auftritt, wenn man z.B. eine Bash Funktionalität via /bin/sh aufruft.
Aber das Script von Jolinar ruft explizit /bin/bash auf.
Ist die bei Dir installiert, oder nur dash?

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 29. Aug 2023, 15:36
by Grissom
Also wenn ich es mit /bin/bash aufrufe, scheint es in eine Art Loop zu verfallen...es geht nichts weiter und ich muss mit Ctrl-C abbrechen.

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 29. Aug 2023, 17:37
by Jolinar
Grissom wrote: Tue 29. Aug 2023, 14:35 bekomme beim Ausführen des Scripts folgende Fehler:

Code: Select all

rc-plugin-watcher.sh: 41: [[: not found
rc-plugin-watcher.sh: 56: Syntax error: "(" unexpected (expecting "}")
Ungetestet, da ich grad unterwegs bin:

Ändere (Zeile 41):

Code: Select all

if [[ $EUID -ne 0 ]]; then
in:

Code: Select all

if [ "$EUID" -ne 0 ]; then

Und ändere (Zeile 110):

Code: Select all

if [[ -n "${plugins[$plugin_name]}" ]]; then
in:

Code: Select all

if [ -n "${plugins[$plugin_name]}" ]; then

Falls ich mich recht erinnere, beherrscht sh keine assoziativen Arrays. Wenn bei Zeile 77 ff. auch noch eine Fehlermeldung kommen sollte, dann mußt du noch eine weitere Anpassung machen.

Ersetze (Zeilen 77-80):

Code: Select all

declare -A plugins=(
    ["twofactor_gauthenticator"]="https://github.com/alexandregz/twofactor_gauthenticator/archive/refs/heads/master.zip"
    # Add more plugins here
)
durch:

Code: Select all

plugins[twofactor_gauthenticator]="https://github.com/alexandregz/twofactor_gauthenticator/archive/refs/heads/master.zip"
# Add more plugins here

Alternativ: Stell bash als Standardshell ein. bash hat einen größeren Funktionsumfang als sh.

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 29. Aug 2023, 17:53
by Grissom
Habe die ersten beiden Änderungen durchgeführt, aber das war's wohl noch nicht...
rc-plugin-watcher.sh: 41: [: Illegal number:
rc-plugin-watcher.sh: 56: Syntax error: "(" unexpected (expecting "}")

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 29. Aug 2023, 18:00
by 24unix
Grissom wrote: Tue 29. Aug 2023, 17:53 Habe die ersten beiden Änderungen durchgeführt, aber das war's wohl noch nicht...
rc-plugin-watcher.sh: 41: [: Illegal number:
rc-plugin-watcher.sh: 56: Syntax error: "(" unexpected (expecting "}")
Hast Du die bash denn installiert?

Code: Select all

dpkg -l |grep bash
und

Code: Select all

file /bin/bash

Re: Roundcube & benutzerdefinierte Plugins

Posted: Tue 29. Aug 2023, 19:18
by Grissom

Code: Select all

dpkg -l |grep bash
ii bash 5.1-2+deb11u1 amd64 GNU Bourne Again SHell
ii bash-completion 1:2.11-2 all programmable completion for the bash shell

Code: Select all

file /bin/bash
/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=31c321f9f0c1f86a379f7efaaeb75f707998f27f, for GNU/Linux 3.2.0, stripped