Direkt zum Hauptinhalt

Hauptkonfiguration - bffh.dhall

BFFH verwendet DHALL für die Struktur der Konfigurationsdateien BFFH verwendet RBAC für die Zugriffskontrolle.

Die Konfiguration von BFFH befindet sich in der Datei bffh.dhall. Die Datei kann auch umbenannt werden. Wichtig ist, dass sie dann überall korrekt referenziert wird (z.B. in Service Scripts).

Allgemeine Konfiguration

listens

Enthält die Adressen, auf die BFFH bei der Verbindung für die API hört. Standardport für BFFH ist 59661

Beispiel:

listens = 
[ 
    { address = "127.0.0.1", port = Some 59661 }
]

mqtt_url

Enthält die Adresse des MQTT-Servers, mit dem sich BFFH verbindet.

Die Adresse hat das Format <protocol>://[user]:[password]@<server>:[port]

  • protocol wird benötigt und kann eins der folgenden Werte annehmen: mqtt,tcp,mqtts,ssl
  • user und password sind optional
  • server ist erforderlich und kann eine IP-Adresse oder ein Hostname sein
  • port ist optional. Der Standardport ist 59661

Beispiele:

mqtt_url = "tcp://localhost:1883" 
mqtt_url = "mqtts://user:password@server.tld:port"

db_path

Enthält den Pfad für die interne Datenbank, die BFFH verwendet. BFFH wird zwei Dateien erstellen: <db_path> und <db_path>-lock. Es sollte sichergestellt werden, dass BFFH Schreibzugriff auf das entsprechende Verzeichnis hat.

Beispiel:

db_path = "/tmp/bffh"

Berechtigungen (Permissions)

Standardberechtigungen

BFFH verfügt über einige Standardberechtigungen, die der Verwaltung und den Admin-Rechten zugewiesen werden können.

bffh.users.info - Nutzerliste bekommen und Infos über diese Accounts erhalten
bffh.users.manage - Nutzerliste bekommen und Nutzer verwalten
bffh.users.admin - Globale Administration: Nutzer hinzufügen, löschen, ändern (z.B. Passwort-Reset)

Modellieren von Berechtigungen

Allgemeines Schema: space.type.category.permission.model

Administrator
space.machines.printers.*

Offene Berechtigung
space.machines.printers.read.*

BFFH verwendet eine pfadähnliche Zeichenkette als Erlaubnisformat, getrennt durch einen . Punkt. So besteht zum Beispiel this.is.a.permission aus den Teilen this, is, a und permission. Bei der Anforderung von Berechtigungen, z. B. in Maschinen, muss immer eine genaue Berechtigung angegeben werden, also z. B. test.write. Bei der Erteilung von Berechtigungen, z. B. in Rollen, können entweder eine genaue Berechtigung angegeben oder die beiden Platzhalter * und + verwendet werden. Diese Wildcards verhalten sich ähnlich wie Regex- oder Bash-Wildcards:

  • * gewährt alle Berechtigungen in diesem Teilbaum. So wird perms.read.* für jedes von passen: 
    • perms.read
    • perms.read.machineA
    • perms.read.machineB
    • perms.read.machineC.manage
  • + gewährt alle Berechtigungen unter des Wertes. So wird perms.read.+* für jedes von passen: 
    • perms.read.machineA
    • perms.read.machineB
    • perms.read.machineC.manage
    • aber nicht perms.read

Wildcards sind wahrscheinlich am nützlichsten, um Maschinen zu gruppieren, z.B. 3D-Drucker und eine Bandsäge:

  1. Write (schreiben) Berechtigungen
    • machines.printers.write.prusa.sl1
    • machines.printers.write.prusa.i3
    • machines.printers.write.anycubic
    • machines.bandsaws.write.bandsaw1
  2. Manage (verwalten) Berechtigungen
    • machines.printers.manage.prusa.sl1
    • machines.printers.manage.prusa.i3
    • machines.printers.manage.anycubic
    • machines.bandsaws.manage.bandsaw1
  3. Admin Berechtigungen
    • machines.printers
      • Für alle Drucker
    • machines.bandsaws
      • Für alle Bandsägen

Dann erteilen wir den Rollen die entsprechenden Rechte:

  • Nutze beliebige 3D-Drucker:
    • machines.printers.write.+
  • Erlaube nur die Nutzung "billiger" Drucker:
    • machines.printers.write.anycubic.*
    • machines.printers.write.prusa.i3
  • Erlaube das Verwalten der Drucker:
    • machines.printers.+
  • Erlaubte das Administrieren aller Drucker:
    • machines.printers.*

Auf diese Weise klappt es trotzdem mit der Aufteilung, wenn später ein weitere Anycubic Drucker gekauft wird:

  • machines.printers.write.anycubic.i3
  • machines.printers.write.anycubic.megax

Konfiguration von Maschinen

machines

Enthält eine Liste der definierten Maschinen. Die Maschinen haben verschiedene Wahrnehmungsebenen, mit denen interagiert werden kann:

  • disclose (offenlegen): Benutzer kann die Maschine in der Maschinenliste sehen
  • read (lesen): Der Benutzer kann Informationen über die Maschine und ihren Zustand lesen
  • write (schreiben): Der Benutzer kann die Maschine benutzen
  • manage (verwalten): Der Benutzer kann als Manager mit dem System interagieren (Prüfen, Freigeben, Transferieren)

Jede Maschine muss eine ID haben, um in anderen Teilen dieser Konfiguration oder über die API auf die Maschine verweisen zu können. Und jede Maschine muss einen Namen haben.

Optionale Informationen

Um weitere Informationen über die Maschine bereitzustellen, können diesen Beschreibungen hinzugefügt oder ein externer Wiki-Link bereitstellt werden. Beide Attribute sind nur optional und müssen nicht gesetzt werden.

Beispiel:

machines = 
{ 
    machine123 = 
    { 
        name = "Testmachine",
        description = Some "A test machine",
        wiki = "https://someurl"

        disclose = "lab.test.read",
        read = "lab.test.read",
        write = "lab.test.write",
        manage = "lab.test.admin"
    }
}

“machine123” is in this case the “Machine-ID”

Konfiguration von Rollen (roles)

Die Rollen werden in der Datei bffh.dhall konfiguriert. Wenn die Datei roles.toml im Verzeichnis vorhanden ist, kann sie gelöscht werden und kann nicht zur Verwaltung von Rollen verwendet werden.

roles

Enthält die Liste der definierten Rollen. Rollen haben eine Liste von Berechtigungen und können vererbt werden. Die Berechtigung kann ein Platzhalter in der Berechtigungsliste sein.

Beispiel:

roles =
{
    testrole = 
    {
        permissions = [ "lab.test.*" ]
    },
    somerole =
    { 
        parents = ["testparent"],
        permissions = [ "lab.some.admin" ]
    }, 
    testparent =
    {
        permissions =
        [
            "lab.some.write",
            "lab.some.read",
            "lab.some.disclose"
        ]
    }
}

Konfiguration von Aktoren (actors)

actors

Enthält eine Liste von Aktoren. Aktoren werden durch ein Modul und einen oder mehrere Parameter definiert. Aktuell unterstützte Aktoren sind:

Shelly Actor

Dieser Aktor verbindet BFFH über einen MQTT-Server mit einem Shelly Gerät.

Der topic Parameter des Shelly muss auf das Shelly-spezifische MQTT-Topic gesetzt werden.

Find shelly topic here

Beispiel:

actors = 
{
    Shelly_123 = 
    { 
        module = "Shelly", 
        params = 
        {
            topic = "shellyplug-s-123456"
        }
    }
}

„Shelly_123“ ist in diesem Fall die "Actor-ID".

Process Actor

Dieser Aktor ermöglicht es, eigene Geräte mit dem BFFH Server zu verbinden.

cmd = Pfad der ausführbaren Datei
args = Argumente der ausführbaren Datei

Beispiel:

actors = 
{
    Bash =
    { 
        module = "Process", params =
        { 
            cmd = "./examples/actor.sh",
            args = "your ad could be here"
        }
    }
}

actor_connections

Verbindet den Aktor mit einer Maschine. Eine Maschine kann mehrere Aktoren haben. Verwenden Sie die "Machine-ID" und "Actor-ID".

Beispiel:

actor_connections = 
[
    { machine = "Testmachine", actor = "Shelly_1234" },
    { machine = "Another", actor = "Bash" },
    { machine = "Yetmore", actor = "Bash2" }
]

Konfiguration exportieren

BASE="/opt/fabinfra/bffh/target/release"
CFG="$DATA/config/cfg.dhall"
$BASE/bffhd --verbose --config $CFG --dump-users /tmp/users.toml --force