Posts by llutz

    Moin Reygh ,

    für einen so simplen Job würde sich eher ein Arduino oder anderer Microcontroller anbieten. Die reagieren auch weniger empfindlich auf plötzliche Trennung von der Betriebsspannung. Akku/Batterie ist für den RPi schwierig, der braucht vergleichsweise viel Strom.

    Zumindest nicht ohne wildes escapen. Die folgenden beiden Varianten scheinen zu funktionieren:

    Die 1. (hier) nicht auch (wenn man die Var richtig schreibt), sry


    Der für mich tägliche Fall ist sowas wie awk '/suchwas/ { print $xy} file' und das geht mit Shell-Vars nicht bzw. wie du schriebst, nur mit wildem, fehlerträchtigen Escapen. Deswegen habe ich mir das mit der Hilfsvariablen angewöhnt.

    LinuxUser=$(/usr/bin/awk -v user="$VirtUser" '$1 == user {print $NF;exit}' /etc/dovecot/alias_maps)

    awk kann leider keine Shell-Variablen als Suchbegriff in normaler Form nutzen, sonst sähe es so aus:

    Code
    1. /usr/bin/awk '$1 == $VirtUser {print $NF;exit}' /etc/dovecot/alias_maps

    Also einfach "Wenn Feld 1 ($1) gleich der Var $VirtUser ist, dann gib das letzte Feld der Zeile ($NF) aus und beende dich (exit)"


    Deswegen der Umweg awk eine eigene Variable "-v user=" mit dem Inhalt von $VirtUser zu übergeben und die für den Vergleich her zu nehmen.

    BTW, sind die virtuellen Userkennungen wirklich case insensitive (Option "-i")?

    Dovecot unterscheidet Gross-/Kleinschreibung (beliebtes Problem beim Einsatz eines Webmailers, dem es egal ist), deswegen setzt man meist in der config auth_username_format = %Lu um alle lowercase zu haben.

    $USER ist eine shell-Variable, die mit Dovecot nichts zu tun hat. Das eventhandler-Script ist ein banales Shell-Script (bash) in dessen Kontext auch $USER nicht von Dovecot beeinflusst wird ($(echo "$USER"....ist eine reine Shell-Funktion). Dovecots interne Variablen werden durch Prozent eingeleitet, %n ~name.

    Wäre grep -w nicht sinnvoller als das angehängte (schnell bei Änderungen mal wegoptimierte) Leerzeichen, um nicht auf Namensteile zu matchen?


    btw

    $USER enthält keine [[:space:]] (nur den Usernamen), ergo Zeile 1 imho überflüssig

    ThomasL ich hätte noch eine kleine "Verschlankung" deines eventhandler-Scripts anzubieten, vielleicht kannst du sie gebrauchen.

    Code
    1. $ diff getmail_eventhandler getmail_eventhandler_llutz
    2. 74,77c74,75
    3. < LinuxUser=$(grep "$VirtUser " -i /etc/dovecot/alias_maps | awk -F ' ' '{ print $2 }')
    4. < LinuxUser_UID=$(grep $LinuxUser /etc/passwd | awk -F':' '{ printf "%6s", $3}')
    5. < LinuxUser_UID=${LinuxUser_UID%% }
    6. < LinuxUser_UID=${LinuxUser_UID## }
    7. ---
    8. > LinuxUser=$(/usr/bin/awk -v user="$VirtUser" '$0 ~ user {print $NF;exit}' /etc/dovecot/alias_maps)
    9. > LinuxUser_UID=$(/usr/bin/id -r -u $LinuxUser)

    Kannst Du mir kurz erklären, wie Du das geschafft hast, einen solchen Usernamen anzulegen?

    Username != loginname

    man 5 passwd -> Field 5: user name or comment field

    Das Feld enthält optional den Klartext Benutzername oder einen Kommentar oder nix. Die von Dir oben genannten Regeln beziehen sich aber auf das Feld 1, den Loginname. Der "Username" wird von adduser als "full Name" abgefragt.

    Ich frage mal bei meinen Beitreiber nach. Was wäre denn die Alternative? Eine fixe IP?

    Fragen kostet nix - ich fürchte aber, es wird fruchtlos bleiben.

    Fest muss die IP nicht sein, öffentlich reicht. Vielleicht findest du irgendeinen Geschäftskundentarif, der das hergibt.