Roundcube & benutzerdefinierte Plugins

Für Modifikationen in und um KeyHelp.
User avatar
Jolinar
Community Moderator
Posts: 3612
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Roundcube & benutzerdefinierte Plugins

Post 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:
Last edited by Jolinar on Sun 15. Oct 2023, 11:12, edited 1 time in total.
Reason: Edit Beitrag aktualisiert
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
User avatar
24unix
Posts: 1643
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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 … :)
mfg Micha
--
If Bill Gates had a nickel for every time Windows crashed …
… oh wait, he does.
User avatar
Jolinar
Community Moderator
Posts: 3612
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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.
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
User avatar
24unix
Posts: 1643
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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.
mfg Micha
--
If Bill Gates had a nickel for every time Windows crashed …
… oh wait, he does.
User avatar
Jolinar
Community Moderator
Posts: 3612
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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:
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
User avatar
24unix
Posts: 1643
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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? :)
mfg Micha
--
If Bill Gates had a nickel for every time Windows crashed …
… oh wait, he does.
User avatar
Jolinar
Community Moderator
Posts: 3612
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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:
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
User avatar
24unix
Posts: 1643
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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.
mfg Micha
--
If Bill Gates had a nickel for every time Windows crashed …
… oh wait, he does.
Grissom
Posts: 15
Joined: Thu 18. Mar 2021, 16:26

Re: Roundcube & benutzerdefinierte Plugins

Post 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
User avatar
24unix
Posts: 1643
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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?
mfg Micha
--
If Bill Gates had a nickel for every time Windows crashed …
… oh wait, he does.
Grissom
Posts: 15
Joined: Thu 18. Mar 2021, 16:26

Re: Roundcube & benutzerdefinierte Plugins

Post 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.
User avatar
Jolinar
Community Moderator
Posts: 3612
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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.
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
Grissom
Posts: 15
Joined: Thu 18. Mar 2021, 16:26

Re: Roundcube & benutzerdefinierte Plugins

Post 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 "}")
User avatar
24unix
Posts: 1643
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Roundcube & benutzerdefinierte Plugins

Post 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
mfg Micha
--
If Bill Gates had a nickel for every time Windows crashed …
… oh wait, he does.
Grissom
Posts: 15
Joined: Thu 18. Mar 2021, 16:26

Re: Roundcube & benutzerdefinierte Plugins

Post 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
Post Reply