Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Statusanzeige einer NAS insbesondere Zyxel | Unterstützung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Neues Plugin: Statusanzeige einer NAS insbesondere Zyxel | Unterstützung

    Hallo,

    ich würde gern ein Plugin erstellen, um den Status meiner NAS (Zyxel NSA325) abzufragen, sie zu steuern und das Ganze zu visualisieren.
    Steuern kann man Reboot, Shutdown und Start (WOL).
    Status anzeigen geht von: Modellname, Online/Offline, Temperatur, Lüfterdrehzahl, CPU Auslastung, laufende Prozesse und Speicherauslastung.
    Abfragen kann man dass via SSH oder Telnet.

    Für die Umsetzung benötige ich Unterstützung bei der Programmierung in Python.Wie gesagt, ich bin Python Laie aber lernbereit.
    Beisteuern kann ich die SSH oder Telnetbefehle zur Abfrage der Rohdaten der NAS sowie die Umsetzung dieser Rohdaten in das finale Format in der Programmiersprache purebasic.

    Wer hat Interesse an solch einem Plugin und kann/würde mich bei der Umsetzung unterstützen?
    DANKE und viele Grüße
    Michael

    #2
    Auf der NAS läuft der smarthome.py? Dann wäre es eine Lösung, die System-Info im Backend anzupassen, bzw das Backend modular erweiterbar und konfigurierbar zu machen? Sowas habe ich neulich bei mir gemacht (für Banana-Pi die Board-Temperatur hinzugefügt, s.u.)
    You do not have permission to view this gallery.
    This gallery has 1 photos.

    Kommentar


      #3
      Nein, das smartnomeNG läuft bei mit auf einem RPi3. Ich möchte über die smartVISU und smarthomeNG die NAS überwachen und ggf. reboot und shutdown auslösen.
      Wer kann hier unterstützen oder mir einen Tipp geben, welches Plugin ich als "Anschauungsmuster" verwenden kann.
      DANKE

      Kommentar


        #4
        Code:
        sudo apt-get install build-essential libssl-dev libffi-dev python-dev
        pip install paramiko
        item.conf:
        Code:
        [server]
         [[smarthome_local]]
          [[[loadavg]]]
            type = list
            ssh_cmd_pull = 'cat /proc/loadavg'
            ssh_host = 'localhost'
            ssh_user = 'smarthome'
            ssh_passwd = 'smarthome'
            [[[[avg1min]]]]
              type = num
              eval = sh...()[0]
              eval_trigger = ..
            [[[[avg5min]]]]
              type = num
              eval = sh...()[1]
              eval_trigger = ..
            [[[[avg15min]]]]
                type = num
                eval = sh...()[2]
                eval_trigger = ..
            [[[[alarm1]]]]
              name = 'Load Avg 5min > 1.0!'
              type = bool
              eval = sh...avg5min() > 1.0
              eval_trigger = ..avg5min
            [[[[alarm2]]]]
              name = 'Load Avg 5min > 2.0!'
              type = bool
              eval = sh...avg5min() > 2.0
              eval_trigger = ..avg5min
            [[[[alarm3]]]]
              name = 'Load Avg 5min > 1.0!'
              type = bool
              eval = sh...avg5min() > 3.0
              eval_trigger = ..avg5min
        
              [[[uptime]]]
                type = list
                ssh_cmd_pull = 'cat /proc/uptime'
                ssh_host = 'smarthome'
                ssh_user = 'smarthome'
                ssh_passwd = 'smarthome'
                [[[[s]]]]
                  type = num
                  eval = sh...()[0]
                  eval_trigger = ..
                [[[[days]]]]
                  type = num
                  eval =  int(sh...s() / 60 / 60 / 24)
                  eval_trigger = ..s
                [[[[hours]]]]
                  type = num
                  eval =  int((sh...s() - sh...days() * 24 * 60 * 60) / 60 / 60)
                  eval_trigger = ..s
                [[[[mins]]]]
                  type = num
                  eval =  int((int(sh...s()) - int(sh...days()) * 24 * 60 * 60 - int(sh...hours()) * 60 * 60 ) / 60)
                  eval_trigger = ..s
        
                [[[[pretty]]]]
                  name = days_hours_min_secs
                  type = str
                  eval = "{0}days {1}hours {2}minutes".format(sh...days(), sh...hours(), sh...mins())
                  eval_trigger = ..s
                [[[[alarm]]]]
                  name = 'Server reboot last 5min!!!'
                  type = bool
                  eval = sh...s() < 300
                  eval_trigger = ..s
        etc/logic.conf

        Code:
        [sshserver]
            filename = sshserver.py
            cycle = 300
        logics/sshserver.conf
        Code:
        #!/usr/bin/env python
        #
        # (c) Dirk Wallmeier
        #
        logger.info("Logik SSH_Server : by :" + trigger['by'] )
        #logger.info("Logik SSH_Server : source :" + trigger['source'] )
        #logger.info("Logik SSH_Server : dest :" + trigger['dest'] )
        #logger.info("Logik SSH_Server : value :" + trigger['value'] )
        
        DEFAULT_KEY_PATH = "~/.ssh/id_rsa"
        
        import paramiko
        
        ssh_hosts = {}
        for item in sh.find_items('ssh_host'):    # findet alle Items die ein Attribut 'ssh_host' besitzen
            host = item.conf['ssh_host']
            user = item.conf['ssh_user']
            passwd = item.conf['ssh_passwd']
            #key = item.conf['ssh_key']
            #key = ''
            #if not passwd or key:
            #        rsakey = paramiko.RSAKey.from_private_key_file(os.path.expanduser(key or DEFAULT_KEY_PATH))
            #else:
            #        rsakey = None
        
            #ssh_hosts[host] = {'user' : user, 'passwd': passwd, 'key': rsakey}
            ssh_hosts[host] = {'user' : user, 'passwd': passwd}
        
        
        ssh = {}
        for host in ssh_hosts.keys():  # connect to all hosts
            ssh[host] = paramiko.SSHClient()
            ssh[host].set_missing_host_key_policy( paramiko.AutoAddPolicy())
            ssh[host].connect(host, username=ssh_hosts[host]['user'], password=ssh_hosts[host]['passwd'],) #key=rsakey)
        
        # cat /proc/uptime
        # 1516600.94 2900685.66
        # cat /proc/loadavg
        # 0.10 0.16 0.17 1/167 8686
        
        if trigger['by'] == 'Scheduler':   # scheduler / cycle ??
        
            for item in sh.find_items('ssh_cmd_pull'):    # findet alle Items die ein Attribut 'ssh_cmd' besitzen und führe cmd auf remote host aus
                cmd = item.conf['ssh_cmd_pull']
                host = item.conf['ssh_host']
                stdin, stdout, stderr = ssh[host].exec_command(cmd)
                res = stdout.readlines()
                logger.info("Logik SSH_Server : {0} : {1}".format(cmd, res[0].split(' ')[0]) )
                item(res[0].split(' '))
        elif trigger['by'] == 'fdhahsdf':  # watchitem ??
            item = sh.return_item(trigger['source'])
            cmd = item.conf['ssh_cmd_push']
            host = item.conf['ssh_host']
            stdin, stdout, stderr = ssh[host].exec_command(cmd)
            stdout.readlines()
            item(0)
        Zitat von Sisamiwe Beitrag anzeigen
        Steuern kann man Reboot, Shutdown und Start (WOL).
        fehlt noch (ssh_cmd_push='???').


        https://github.com/smarthomeNG/smart...nde-alarmieren (Wiki Logig Beispiele)
        Zuletzt geändert von walldi; 06.01.2017, 11:09.

        Kommentar


          #5
          walldi, danke für die Hilfe.
          Leider wird die Logik im Backend nicht angezeigt bzw. scheint sich gar nichts zu tun.
          Könntest Du das Beispiel noch etwas beschreiben.
          DANKE.

          Kommentar


            #6
            Wenn die Logic nicht im Backend aufgelistet erscheint, gab es wohl einen Fehler beim Initialisieren, der im Startup Log zu finden sein wird. Den müsstest Du mal suchen (smarthome -d) und beheben oder posten.

            Die Logic führt alle 300s die konfigurierten ssh Befehle auf dem remote Host aus ( zB:
            Code:
            ssh user@host 'cat /proc/uptime'
            ) und schreibt das Ergebnis in die Items. Ich habe noch zusaätzliche Items angelegt, um Alarme zu triggern oder lesbare Ausgaben zu erhalten. Vorgesehen wäre noch die Erweiterung um ssh Befehle, die von Items getriggert werden (z.B. restart, etc, was ich nicht brauche). Außerdem unterstützt die ssh Lib paramiko auch publich key auth, was evtl. sinnvoller wäre.

            Kommentar


              #7
              ...war noch ein Kodierfehler (UTF8) drin. Nun sehe ich die Logik im Backend. Das Log zeigt aber noch eine Fehlermeldung:
              Traceback (most recent call last):
              File "/usr/local/smarthome/lib/scheduler.py", line 354, in _task
              exec(obj.bytecode)
              File "/usr/local/smarthome/logics/sshserver.py", line 34, in <module>
              ssh[host].connect(host, username=ssh_hosts[host]['user'], password=ssh_hosts[host]['passwd'],) #key=rsakey)
              File "/usr/local/lib/python3.5/site-packages/paramiko/client.py", line 305, in connect
              retry_on_signal(lambda: sock.connect(addr))
              File "/usr/local/lib/python3.5/site-packages/paramiko/util.py", line 269, in retry_on_signal
              return function()
              File "/usr/local/lib/python3.5/site-packages/paramiko/client.py", line 305, in <lambda>
              retry_on_signal(lambda: sock.connect(addr))
              TimeoutError: [Errno 110] Die Wartezeit für die Verbindung ist abgelaufen

              Sagt Dir das was?

              Kommentar


                #8
                Anscheinend hat ssh auf den konfigurierten Server mit dem User und Password nicht geklappt. Funktioniert ein ssh login oder ssh command von der Kommandozeile?

                Kommentar


                  #9
                  Hab das Zugangsproblem gelöst, und gleich auf ein weiteres gestoßen:

                  Aus dem smarthome-Log im debug-Modus (smarthome -d)
                  Code:
                  2017-01-08  16:26:07 INFO     sshserver    Logik SSH_Server : by :Scheduler
                  2017-01-08  16:26:07 DEBUG    Thread-17    starting thread (client mode): 0x6ec5ffd0
                  2017-01-08  16:26:07 DEBUG    Thread-17    Local version/idstring: SSH-2.0-paramiko_2.1.1
                  2017-01-08  16:26:07 DEBUG    Thread-17    Remote version/idstring: SSH-2.0-OpenSSH_6.7
                  2017-01-08  16:26:07 INFO     Thread-17    Connected (version 2.0, client OpenSSH_6.7)
                  2017-01-08  16:26:07 DEBUG    Thread-17    kex algos:['curve25519-sha256@libssh.org', 'ecdh-sha2-nistp256', 'ecdh-sha2-nistp384', 'ecdh-sha2-nistp521', 'diffie-hellman-group-exchange-sha256', 'diffie-hellman-group14-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-gcm@openssh.com', 'aes256-gcm@openssh.com', 'chacha20-poly1305@openssh.com'] server encrypt:['aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-gcm@openssh.com', 'aes256-gcm@openssh.com', 'chacha20-poly1305@openssh.com'] client mac:['umac-64-etm@openssh.com', 'umac-128-etm@openssh.com', 'hmac-sha2-256-etm@openssh.com', 'hmac-sha2-512-etm@openssh.com', 'hmac-sha1-etm@openssh.com', 'umac-64@openssh.com', 'umac-128@openssh.com', 'hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1'] server mac:['umac-64-etm@openssh.com', 'umac-128-etm@openssh.com', 'hmac-sha2-256-etm@openssh.com', 'hmac-sha2-512-etm@openssh.com', 'hmac-sha1-etm@openssh.com', 'umac-64@openssh.com', 'umac-128@openssh.com', 'hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1'] client compress:['none', 'zlib@openssh.com'] server compress:['none', 'zlib@openssh.com'] client lang:[''] server lang:[''] kex follows?False
                  2017-01-08  16:26:07 DEBUG    Thread-17    Kex agreed: diffie-hellman-group14-sha1
                  2017-01-08  16:26:07 DEBUG    Thread-17    Cipher agreed: aes128-ctr
                  2017-01-08  16:26:07 DEBUG    Thread-17    MAC agreed: hmac-sha2-256
                  2017-01-08  16:26:07 DEBUG    Thread-17    Compression agreed: none
                  2017-01-08  16:26:07 DEBUG    Scheduler    sshserver next time: 2017-01-08 16:31:07+01:00
                  2017-01-08  16:26:08 DEBUG    Thread-17    kex engine KexGroup14 specified hash_algo <built-in function openssl_sha1>
                  2017-01-08  16:26:08 DEBUG    Thread-17    Switch to new keys ...
                  2017-01-08  16:26:08 DEBUG    sshserver    Adding ssh-rsa host key for 192.168.2.10: b'a9bd438256caf78268d7caaa0a233885'
                  2017-01-08  16:26:08 DEBUG    sshserver    Trying discovered key b'54d5754c9536912065c05fc6769ba4ae' in /root/.ssh/id_rsa
                  2017-01-08  16:26:08 DEBUG    Thread-17    userauth is OK
                  2017-01-08  16:26:08 INFO     Thread-17    Authentication (publickey) failed.
                  2017-01-08  16:26:08 DEBUG    Thread-17    userauth is OK
                  2017-01-08  16:26:08 INFO     Thread-17    Authentication (password) successful!
                  2017-01-08  16:26:08 DEBUG    sshserver    [chan 0] Max packet in: 32768 bytes
                  2017-01-08  16:26:08 DEBUG    Thread-17    [chan 0] Max packet out: 32768 bytes
                  2017-01-08  16:26:08 DEBUG    Thread-17    Secsh channel 0 opened.
                  2017-01-08  16:26:08 DEBUG    Thread-17    [chan 0] Sesch channel 0 request ok
                  2017-01-08  16:26:08 DEBUG    Thread-17    [chan 0] EOF received (0)
                  2017-01-08  16:26:08 INFO     sshserver    Logik SSH_Server : cat /proc/loadavg : 0.02
                  2017-01-08  16:26:08 DEBUG    sshserver    Item ssh.nas325.loadavg = ['0.02', '0.05', '0.06', '3/138', '26706\n'] via Logic None None
                  2017-01-08  16:26:08 DEBUG    Thread-17    [chan 0] EOF sent (0)
                  2017-01-08  16:26:08 DEBUG    sshserver    [chan 1] Max packet in: 32768 bytes
                  2017-01-08  16:26:08 DEBUG    Thread-17    [chan 1] Max packet out: 32768 bytes
                  2017-01-08  16:26:08 DEBUG    Thread-17    Secsh channel 1 opened.
                  2017-01-08  16:26:08 ERROR    sshserver    Logic: sshserver, File: /usr/local/lib/python3.5/site-packages/paramiko/common.py, Line: 170, Method: asbytes, Exception: Unknown type
                  Traceback (most recent call last):
                    File "/usr/local/lib/python3.5/site-packages/paramiko/common.py", line 168, in asbytes
                      s = s.asbytes()
                  AttributeError: 'list' object has no attribute 'asbytes'
                  
                  During handling of the above exception, another exception occurred:
                  
                  Traceback (most recent call last):
                    File "/usr/local/smarthome/lib/scheduler.py", line 354, in _task
                      exec(obj.bytecode)
                    File "/usr/local/smarthome/logics/sshserver.py", line 47, in <module>
                      stdin, stdout, stderr = ssh[host].exec_command(cmd)
                    File "/usr/local/lib/python3.5/site-packages/paramiko/client.py", line 441, in exec_command
                      chan.exec_command(command)
                    File "/usr/local/lib/python3.5/site-packages/paramiko/channel.py", line 60, in _check
                      return func(self, *args, **kwds)
                    File "/usr/local/lib/python3.5/site-packages/paramiko/channel.py", line 231, in exec_command
                      m.add_string(command)
                    File "/usr/local/lib/python3.5/site-packages/paramiko/message.py", line 285, in add_string
                      s = asbytes(s)
                    File "/usr/local/lib/python3.5/site-packages/paramiko/common.py", line 170, in asbytes
                      raise Exception('Unknown type')
                  Exception: Unknown type
                  2017-01-08  16:26:08 DEBUG    sshserver    [chan 1] EOF sent (1)
                  2017-01-08  16:26:08 DEBUG    Thread-17    Ignoring message for dead channel 1
                  Meine Items:
                  Code:
                  [ssh]
                      [[nas325]]
                          [[[loadavg]]]
                              type = list
                              ssh_cmd_pull = 'cat /proc/loadavg'
                              ssh_host = '192.168.2.10'
                              ssh_user = 'root'
                              ssh_passwd = '****'
                          [[[temp]]]
                              type = list
                              ssh_cmd_pull = 'i2cget -y 0x0 0x0a 0x07 | xargs printf '%d\n''
                              ssh_host = '192.168.2.10'
                              ssh_user = 'root'
                              ssh_passwd = '****'
                          [[[cooler]]]
                              type = list
                              ssh_cmd_pull = 'i2cget -y 0x0 0x0a 0x08 | xargs printf '%d\n''
                              ssh_host = '192.168.2.10'
                              ssh_user = 'root'
                              ssh_passwd = '****'
                          [[[tbd]]]
                              type = num
                              ssh_cmd_pull = 'cat /proc/net/dev | grep egiga0'
                              ssh_host = '192.168.2.10'
                              ssh_user = 'root'
                              ssh_passwd = '****'
                          [[[model]]]
                              type = str
                              ssh_cmd_pull = 'cat /etc/modelname'
                              ssh_host = '192.168.2.10'
                              ssh_user = 'root'
                              ssh_passwd = '****'
                          [[[uptime]]]
                              type = list
                              ssh_cmd_pull = 'cat /proc/uptime'
                              ssh_host = '192.168.2.10'
                              ssh_user = 'root'
                              ssh_passwd = '****'
                  Das erste Item wird bedient (im Backend sichtbar), alle anderen nicht.
                  Hast Du eine Idee?
                  Ich bin am verzweifeln.

                  Danke Dir!
                  Zuletzt geändert von Sisamiwe; 08.01.2017, 16:41.

                  Kommentar


                    #10
                    Diesen Fehler habe ich auch gesehen und gefixed. (Das '|' wird beim parsen der Atrribute als Trenner in Listen interpretiert...)
                    Außerdem habe ich die Struktur der .conf Datei etwas geändert, um die Redundanz bei ssh_host, ssh_user, ssh_passwd zu eliminieren. Und Mem, Swap und Disk ergänzt.

                    Wie sehen die Ausgabe der i2cget Kommandos aus?


                    weiter im Wiki => https://github.com/smarthomeNG/smart...nde-alarmieren (Wiki Logic Beispiele)

                    Dann habe mir noch ein Dashboard für das Backend gemacht:

                    dashboard.png

                    Kommentar


                      #11
                      @ walldi: DANKE.

                      i2cget -y 0x0 0x0a 0x07 | xargs printf '%d\n' gibt die Temperatur des Gerätes in num aus.
                      i2cget -y 0x0 0x0a 0x08 | xargs printf '%d\n' gibt indirekte die Lüfterdrehzahl aus (Lüfterdrehzahl = 60000/Wert).

                      Den Rest teste ich dann gleich.

                      Kommentar


                        #12
                        @walldi: Die Logik funktioniert nun. Zumindest bekomme ich alle abgefragten Werte zurück.
                        Trotzdem habe ich noch ein paar Fragen bzw. Anmerkungen:
                        - Warum müssen in der aktuellen Version ssh_server und ssh_host definiert werden? Oder wie ist das zu handhaben?
                        - hast Du auch schon ein Beispiel für cmd_push? Ich würden meine NAS gern per ssh ausschalten.
                        - im Wiki muss es sicher logics/sshserver.py anstatt logics/sshserver.conf heißen, oder?
                        - kann man die items.conf auch in ssh_items.conf umbenennen bzw. die Logik flexibler gestalten, dass sie alle oder bestimmte .conf mit einbezieht?
                        - ich habe noch mehr items bzw. einfacher Formatierungen eingearbeitet. Interesse?
                        - wo liegen die Daten des Backends, um die Erweiterungen einzuarbeiten?

                        DANKE für die Rückmeldung.

                        Kommentar


                          #13
                          Konntest Du das Wiki nachvollziehen und das "Dashboard" gebrauchen? Implementierst Du noch die STOP/RESTART und WOL Befehle?
                          Wenn Du eine Anzeige in der VISU brauchst oder umsetzt, könntest Du das ja auch an dieser Stelle teilen.

                          Kommentar


                            #14
                            Zitat von Sisamiwe Beitrag anzeigen
                            @walldi: Die Logik funktioniert nun. Zumindest bekomme ich alle abgefragten Werte zurück.
                            Trotzdem habe ich noch ein paar Fragen bzw. Anmerkungen:
                            - Warum müssen in der aktuellen Version ssh_server und ssh_host definiert werden? Oder wie ist das zu handhaben?
                            : ssh_server ist sozusagen ein Marker für die Wurzel eines "Server-Itembaums". Geht vielleicht auch anders...

                            - hast Du auch schon ein Beispiel für cmd_push? Ich würden meine NAS gern per ssh ausschalten.
                            : habe ich keine Verwendung für. Ich monitore meinen vserver und den reboote ich nicht auf diese Weise.

                            - im Wiki muss es sicher logics/sshserver.py anstatt logics/sshserver.conf heißen, oder?
                            : klingt richtiger..

                            - kann man die items.conf auch in ssh_items.conf umbenennen bzw. die Logik flexibler gestalten, dass sie alle oder bestimmte .conf mit einbezieht?
                            : im items Verzeichnisse werden alle Dateien eingelesen, die auf *.conf enden. Wie die heißen ist unwichtig.

                            - ich habe noch mehr items bzw. einfacher Formatierungen eingearbeitet. Interesse?
                            : das ist der Sinn von OS Software -> immer teilen!

                            - wo liegen die Daten des Backends, um die Erweiterungen einzuarbeiten?
                            : im Plugins Verzeichnis plugins/backend Dort sollte es in einer aktuellen Installation eine Datei init.py geben, an die man den Code-Abschnitt aus dem Wiki anhängen soll. (Ob das so funktioniert, kann ich nicht selbst testen, da ich mittlerweile das Backend bei mir stark umstellt habe, um flexibler, modular und konfigurierbar zu sein.)


                            Zuletzt geändert von walldi; 10.01.2017, 19:16.

                            Kommentar


                              #15
                              Zitat von walldi Beitrag anzeigen
                              Konntest Du das Wiki nachvollziehen und das "Dashboard" gebrauchen? Implementierst Du noch die STOP/RESTART und WOL Befehle?
                              Wenn Du eine Anzeige in der VISU brauchst oder umsetzt, könntest Du das ja auch an dieser Stelle teilen.
                              Das Wiki konnte ich nachvollziehen, auch wenn noch etwas Interpretation notwendig ist/war oder ich einfach nicht genügend Wissen habe.
                              bspw. bis den Items
                              Code:
                              eval = sh...()[0]
                              eval_trigger = ..
                              Müssen hier die jeweiligen Items eingetragen werden oder sind die ... bzw. .. Platzhalter für das parent-item?
                              Ansonsten passt es, denke ich. Es ist noch anzumerken, dass bei unterschiedlichen Servern bzw. unterschiedlichen linux-basierenden Betriebssystemen die Antowrt auf einen Systembefehl immer doch etwas anders ist. Man muss somit das zerlegen der Listen (als Abfrageobjekt) immer wieder kontrollieren. Ich fomatieren die Liste gleich bei der Abfrage weitestgehend bspw. mit
                              Code:
                              cat /proc/net/dev | grep egiga0 | cut -d: -f2 | tr -s " " | cut -d" " -f1,9
                              lösche alles bis zum Doppelpunkt, fasse Leerzeichen zu einem zusammen und gib nur die Felder 1 und 9 zurück

                              Die WOL Befehle habe ich bereits mit dem WOL Plugin umgesetzt.

                              POWEROFF und REBOOT fehlt mir nach. Hier sehe ich aber der Proble der Logik darin, dass diese "nur" alle 300s ausgeführt wird und ich die Push-Befehle gleich umgesetzt haben möchte.

                              Zum Thema Visualisierung erstelle ich gerade was und werde es dann hier auch teilen. Selbstverständlich.

                              Kommentar

                              Lädt...
                              X