feed-image -=Kernel-Error=- BlogFeed

Luftqualität/Feinstaub und mehr messen.

Es gibt ein ganz spannendes Projekt, welches sich mit dem Messen und Sammeln von Umweltdaten beschäftigt. So gibt es vom Projekt einige Bauanleitungen inkl. Software zum Messen der Luftqualität, Temperatur, Luftfeuchtigkeit, Lärm usw… Die Webseite findet ihr hier: https://luftdaten.info/

Im einfachsten Fall basiert so ein Sensor am Ende auf folgenden Komponenten:
NodeMCU ESP8266, CPU/WLAN
SDS011 Feinstaubsensor (früher PPD42NS)
DHT22, Temperatur & Luftfeuchtigkeit (optional)

Die Daten werden offen gesammelt und können auf verschiedene Weise eingesehen werden. So gibt es zum Beispiel:
- eine Karte:  https://maps.sensor.community
- Grafana: Temperatur / Feinstaub

Die Bauanleitung ist extrem einfach, die Teile bekommt jeder und kosten kaum Geld. Selbst der Softwareteil ist ohne jeden Aufwand. Man muss nicht mal löten! Fast jeder sollte in der Lage sein so einen Sensor zu bauen und ihn mit seinem WLAN zu verbinden. Vielleicht ein schönes Projekt mit seinen Kindern oder um sich im Unterricht mit so etwas zu beschäftigen?!?

Fragen? Dann fragen!

Bash script zum schnellen erstellen von Abuse e-Mails

Wenn man ein System mit öffentlicher IP Adresse hat, klopfen irgendwelche Bots oder ein Script Kiddie direkt nach dem Einschalten die Dienste auf mögliche Schwachstellen, schwache Zugangsdaten oder default logins ab. Kennt wohl jeder…

Davor schützt gepatchte Software, Dienste möglichst unerreichbar machen oder ein IDS (Intrusion detaction system). Im einfachsten Fall ist dieses Fail2Ban.

Was tun, wenn Fail2Ban Brute Force Angriffe auf SSH oder Postfix (Mailserver) feststellt? Tjo, die Adresse an weiteren Versuchen hindern natürlich. OK, darum kümmert sich Fail2Ban… Am besten noch so, das Fail2Ban dieses seinen anderen Kisten ebenfalls mitteilt, dann wird diese IP es dort schon nicht mehr probieren können. Ebenfalls könnte es eine gute Idee sein, dieses Verhalten der IP Adresse irgendwo zu melden. Dienste wie AbuseIPDB lassen sich gut mit Fail2Ban verbinden. So können andere Admins auf der Welt direkt davon profitieren.

Könnte man nicht zusätzlich noch den ISP oder Hoster hinter der „bösen“ IP Adresse informieren? Meist ist es ja ein Root-Server oder VPS oder, oder… Vielleicht weiß der Admin ja noch nichts von seinem kompromittierten Glück?!? Ja kann man. Dazu sollte es im whois zur IP Adresse immer eine „abuse-mailbox“ also einen „abuse-contact“ geben.

Als kleines Beispiel:

➜  ~ whois 8.8.8.8|grep -i abuse
Comment:        All abuse reports MUST include: 
OrgAbuseHandle: IPADD5-ARIN
OrgAbuseName:   ipaddressing
OrgAbusePhone:  +1-877-453-8353 
OrgAbuseEmail:  ipaddressing@level3.com
OrgAbuseRef:    https://rdap.arin.net/registry/entity/IPADD5-ARIN
Comment:        Please note that the recommended way to file abuse complaints are located in the following links. 
Comment:        To report abuse and illegal activity: https://www.google.com/contact/
OrgAbuseHandle: ABUSE5250-ARIN
OrgAbuseName:   Abuse
OrgAbusePhone:  +1-650-253-0000 
OrgAbuseEmail:  network-abuse@google.com
OrgAbuseRef:    https://rdap.arin.net/registry/entity/ABUSE5250-ARIN

An diese Adresse kann man sich nun mit seinem Anliegen wenden. Damit der angeschriebene ~Admin~ etwas mit der Meldung anfangen kann sollte sie die folgenden Informationen enthalten:

- die IP Adresse des eigenen Systems.
- die IP Adresse von welcher die Störungen kommen/gekommen sind.
- Ein paar Zeilen aus dem Logfile um das Problem verständlich zu machen.
- Die Zeitzone des eigenen Systems, damit die Datums und Zeitangaben im Logfile sinnvoll nutzbar sind.
- Eine kurze Beschreibung, warum man dieses als Problem empfindet.

Da ein Hoster diesen Abuse natürlich an seinen Kunden weitergeben wird und dieser möglicherweise noch Fragen dazu haben könnte, hilft es, wenn man direkt erlaubt die Kontaktdaten weiter zu geben.

Leider findet sich die AbuseMailbox im whois nicht immer und vor allem nicht einheitlich. Gibt man sich nun die Mühe und sammelt alle nötigen Informationen zusammen, wird man nach dem Absender der eigentlichen AbuseMail oft enttäuscht. Denn der überwiegende Teil dieser E-Mails landet einfach beim Empfänger in /dev/null. Rückmeldungen bekommt man fast nie und oft hat es einfach überhaupt keinen Effekt. Klar hin und wieder hilft es jemandem… Hier und da schiebe ich selbst so einen Abuse an. Dabei möchte ich selbstredend so wenig wie möglich Arbeit in das Thema stecken.

Da mich Systeme wie Fail2Ban direkt mit dem jeweiligen whois zur IP Adresse informieren, brauche ich nur noch etwas, was mir die anderen Informationen einsammelt und am besten direkt abschickt. Dafür habe ich folgendes bash script geschrieben.

An dieses kann ich direkt beim Aufruf durch andere scripte oder durch mich die „böse“ IP Adresse und die E-Mail-Adresse der AbuseMailbox übergeben. Das script prüft dann ob es sich um eine brauchbare E-Mail-Adresse und IP handelt, sammel zum Beispiel für SSH Brute Force die nötigen Informationen aus dem auth.log, generiert mir dann meine AbuseMail und sendet diese nach einer Sichtkontrolle ab. Ich selbst bekomme diese E-Mail dann noch als BCC. Das script ist alt, stumpf und sehr einfach. Weil die Frage nach dem script kam, hier das script:

#!/usr/local/bin/bash

if [ "$1" == "-h" ] ; then
    printf "You can add abuse ip and mail on start or interactive by request."
    printf "Usage 1: abusemail.sh 1.2.3.4 example@example.org"
    printf "Usage 2: abusemail.sh"
    exit 0
fi

myip="1.2.3.4"
bcc="my@mail.com"


function validateMail()
 {
         local mail=$1
         local stat=1
         if [[ "$mail" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
                stat=0
        fi
        return $stat
}

function validateIP()
 {
         local ip=$1
         local stat=1
         if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
                OIFS=$IFS
                IFS='.'
                ip=($ip)
                IFS=$OIFS
                [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
                && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
                stat=$?
        fi
        return $stat
}
clear
printf "\x1b[31;1;4mCreate und send abuse e-mail!\x1b[0m\n\n"
printf "Enter IP Address"

if [ "$1" == "" ] ; then
    read ip
else
    ip=$1
fi

validateIP $ip

if [[ $? -ne 0 ]];then
  printf "Invalid IP Address ($ip)"
  exit 1
else
  printf "$ip ==> \x1b[32;1;4mOK\x1b[0m\n\n"
fi
printf "\n"
printf "Enter Abuse E-Mail Address"

if [ "$1" == "" ] ; then
    read mail
else
    mail=$2
fi

validateMail $mail

if [[ $? -ne 0 ]];then
  printf "Invalid Abuse E-Mail Address ($mail)"
  exit 1
else
  printf "$mail  ==> \x1b[32;1;4mOK\x1b[0m"
fi

printf "Dear abuse team,\n\nI got some SSH connections from one of your IPv4 addresses. It seems to\nbe a bot or something....\n\nYes, you can forward this E-Mail with contact informations to your \ncustomer to solve this case, if necessary.\n\nMy timezone: Europe/Berlin\nMy IPv4: $myip\nYour IPv4: $ip\n\nSome log snippets:\n" > /tmp/abusemail
grep $ip /var/log/auth.log >> /tmp/abusemail
printf "\nBest regards\nSebastian van de Meer\n" >> /tmp/abusemail


printf "\n\n\n\x1b[31;1;4mCheck e-mail before sending!\x1b[0m\n\n"
printf "\x1b[32;1;4mRecipient:\x1b[0m $mail\n\n"
printf "\x1b[32;1;4mSubject:\x1b[0m Abuse against: $ip - Brute Force\n\n"
cat /tmp/abusemail
printf "\n\n"

while true
do
 printf "\x1b[33;1;4mSend Abuse Mail? [Y/n]\x1b[0m\n"
 read -r input
 
 case $input in
     [yY][eE][sS]|[yY])
 cat /tmp/abusemail | /usr/local/bin/mailx -s "Abuse against: $ip - Brute Force" -r "My Name <myfrom@address.com>" -b $bcc $mail
 printf "Abuse Mail is on it´s way..."
 break
 ;;
     [nN][oO]|[nN])
 printf "Abuse Mail aborted"
 break
        ;;
     *)
 printf "Invalid input..."
 ;;
 esac
done

Noch Fragen? Dann fragen!

AliExpress Labornetzteil - RIDEN RD6006 DC POWER SUPPLY

Vor knapp 20 Jahren habe ich mir ein Labornetzteil gebaut. Elektronik lernen und verstehen war dabei das Ziel. Das Netzteil liefert mir 30V und 3A ist Kurzschlusssicher und hält Strom und Spannung auch unter Last sauber. Es ist komplett analog mit zwei dreistelligen Segmentanzeigen für Strom und Spannung.
Insg. ein sehr schönes Gerät welches mich schon viele Jahre begleitet. Dennoch stößt es immer wieder an seine Grenzen. Ich möchte mehr als 30V oder benötige mehr als 3A. Zum einfachen Messen muss ich weitere Geräte einschleifen, ebenfalls wenn ich Strom/Spannung sehr fein einstellen möchte geht es nicht ohne weiteres Messgerät und etwas Fingerspitzengefühl.
VerlaufskurvRIDEN RD6006 DC POWER SUPPLY Labornetzteilen digital speichern, vorgespeicherte Werte schnell abrufen und ausgeben oder einfach zwischen verschiedenen Werten schnell wechseln…. Alles Dinge an welche man bei dem Gerät nicht denken muss. Ebenfalls ist es kein modernes Schaltnetzteil, sondern basiert noch „ganz Oldschool“ auf einem großen Trafo. Erst dahinter mache ich Strom und Spannung „sauber“ zu den damit verbundenen Nachteilen kommt die hohe Verlustleistung in Wärme.
Ein neues Labornetzteil was mir diese Möglichkeiten eröffnet muss her. Dabei benötige ich kein Highendgerät. Dafür sind meine Anwendungen zu simpel. Preis/Leistung muss halt passen. Ich bin daher auf das RIDEN RD6006 gestoßen. Ein Gerät von AliExpress aus China… Puhhh… Naja, im Grunde kommt ja inzwischen fast alles aus China. Nur kommt ebenfalls viel Schrott von dort. Die Eckdaten des Netzteils sind so gut, dass ich es probieren wollte.

Nach knapp 3 Wochen waren alle Teile bei mir und ich konnte beginnen es zusammen zu bauen. Das Handbuch gibt es als PDF in Chinesisch und Englisch, in diesem ist das nötigste beschrieben. Ich kann Akkus damit Laden, bekomme bei 60V noch 6A heraus, es lässt sich per USB mit dem PC verbinden, es gibt Software dafür, Firmwareupdates ebenfalls und und und…

Gut, das WLAN Modul funktioniert irgendwie nicht oder öhm nicht so wie ich es erwarten würde. Der Temperatursensor zur Überwachung der Akkutemperatur beim Laden muss „irgendwie“ aus dem Gehäuse gelegt werden und ich habe mich dann die Schutzerde doch zusätzlich noch ans Gehäuse geklemmt.

Davon abgesehen ist das Ding echt gut. Ja es tut was es soll und steigert meine Möglichkeiten.

Hier der Link zum "Nachkaufen":  https://de.aliexpress.com/item/4000282551930.html

  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-001
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-002
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-003
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-004
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-005
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-006
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-007
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-008
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-009
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-010
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-011
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-012
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-013
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-014
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-015
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-016
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-017
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-018
  • RD6006-RIDEN-DC-PowerSupply-Labornetzteil-019

Simple Image Gallery Extended

RSPAMD automatisch SPAM / HAM lernen mit Dovecot und IMAPSieve

Bei jedem Spamfilter rutscht schon mal spam durch oder eine echte Nachricht wird falsch als spam eingestuft. Rspamd bietet über das Webinterface die Möglichkeit trainiert zu werden. Hier kann man einfach den Quellcode jeder E-Mail kopieren und rspamd die Information mitgeben ob es sich dabei um SPAM oder HAM handelt. Dieses Vorgehen ist vollständig unbrauchbar um den Spamfilter ordentlich zu trainieren.

Viel schöner wäre doch Folgendes: Immer wenn ein Benutzer eine E-Mail in den Ordner "Junk" schiebt soll diese E-Mail automatisch von rspamd als Spammail gelernt werden. Zusätzlich soll jede E-Mail welche vom Benutzer aus dem "Junk" Ordner herausgeholt wird als Ham gelernt werden.

Genau dieses Beispiel möchte ich hier kurz beschreiben. Hostsystem ist dabei ein FreeBSD, Linuxuser müssen daher bei den Ordnern /usr/local etwas aufpassen! Ebenfalls lauscht mein rspamd-worker nicht auf einen unix-socket sondern auf der IP 127.0.0.3, da er in einer jail steckt.

 

 Beginnen wir mit der Konfiguration für dovecot.

20-imap.conf:

protocol imap {
  mail_plugins = $mail_plugins imap_sieve
}

90-plugin.conf:

plugin {
  sieve_plugins = sieve_imapsieve sieve_extprograms

  # From elsewhere to Spam folder or flag changed in Spam folder
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox1_causes = COPY FLAG
  imapsieve_mailbox1_before = file:/usr/local/etc/dovecot/sieve/report-spam.sieve

  # From Spam folder to elsewhere
  imapsieve_mailbox2_name = *
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_before = file:/usr/local/etc/dovecot/sieve/report-ham.sieve

  sieve_pipe_bin_dir = /usr/local/libexec/dovecot

  sieve_global_extensions = +vnd.dovecot.pipe
}

/usr/local/etc/dovecot/sieve/report-spam.sieve:

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "imap4flags"];

if environment :is "imap.cause" "COPY" {
    pipe :copy "sa-learn-spam.sh";
}

# Catch replied or forwarded spam
elsif anyof (allof (hasflag "\\Answered",
                    environment :contains "imap.changedflags" "\\Answered"),
             allof (hasflag "$Forwarded",
                    environment :contains "imap.changedflags" "$Forwarded")) {
    pipe :copy "sa-learn-spam.sh";
}

/usr/local/etc/dovecot/sieve/report-ham.sieve:

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" [ "Trash", "train_ham", "train_prob", "train_spam" ] {
  stop;
}

pipe :copy "sa-learn-ham.sh";

Natürlich nicht vergessen die beiden neuen Sieve scripte für sieve zu compilieren:

# sievec /usr/local/etc/dovecot/sieve/report-spam.sieve
# sievec /usr/local/etc/dovecot/sieve/report-ham.sieve

Fehlen nur noch die beiden shell scripte um die Mails an rspamd weiterleiten zu können.

/usr/local/libexec/dovecot/sa-learn-spam.sh:

#!/bin/sh
exec /usr/local/bin/rspamc -h 127.0.0.3:11334 learn_spam

/usr/local/libexec/dovecot/sa-learn-ham.sh:

#!/bin/sh
exec /usr/local/bin/rspamc -h 127.0.0.3:11334 learn_ham

Beide müssen ausführbar sein:

# chmod +x /usr/local/libexec/dovecot/sa-learn-spam.sh /usr/local/libexec/dovecot/sa-learn-ham.sh

So wenn ich nun eine E-Mail in den Ordner "Junk" verschiebe lernt rspamd diese automatisch als Spam:

2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_controller_check_password: allow unauthorized connection from a trusted IP 127.0.0.3
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_message_parse: loaded message; id: <FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net>; queue-id: <undef>; size: 49053; checksum: <f5e2fc59515e1da33d532c6f03f6f6f0>
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_controller_learn_fin_task: <127.0.0.3> learned message as spam: FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net

Verschiebe ich eine E-Mail aus dem Ordner "Junk" heraus wird sie, wie gewünscht, als Ham gelernt:

2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_controller_check_password: allow unauthorized connection from a trusted IP 127.0.0.3
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_message_parse: loaded message; id: <FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net>; queue-id: <undef>; size: 49053; checksum: <f5e2fc59515e1da33d532c6f03f6f6f0>
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_controller_learn_fin_task: <127.0.0.3> learned message as ham: FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net

Tjo... Fragen? Dann fragen..

Oh was man nicht mehr verwenden sollte ich etwas wie das antispam plugin das ist "tot".

Was habe ich da wieder gekauft?!? OBI LED

Vor knapp zwei Jahren habe ich für meine Werkstatt ein paar neue Deckenleuchten benötigt. Bisher waren zwei Neonröhren meine Lichtquelle. Lichtfarbe und Stärke passten einfach nicht mehr. Im OBI habe ich zu diesem Zeitpunkt zufällig LED Leuchten gesehen, welche in Form und Länge an klassische Neonröhren erinnern. Der Preis lag irgendwo zwischen 10 bis 20 €, also kein Preis bei dem man viel falsch machen kann, oder?

Naja, vielleicht ja doch!??! Jetzt nach zwei Jahren beginnen ein paar der LED Leuchten zu flackern. Also schnell eine der Leuchten von der Decke geschraubt um sie zu zerlegen. Vielleicht findet sich ja das Problem?!?
OBI LED SCHROTT Typ LY-5024-2 von Ritter Leuchten GmbH
Die Schaltung ist sehr überschaubar. Zuerst eine kleine Sicherung, dann ein Brückengleichrichter, ein kleiner Kondensator zur Spannungsglättung (ich habe wohl zwei Versionen der Leuchten, mit und ohne diesen Kondensator), ein kleiner hochohmiger Widerstand (zur schnellen Entladung vom Kondensator beim „Licht aus“) und noch zwei „Einchip“ LED Treiber mit seinen Steuerwiderständen. Oh und natürlich die einzelnen LEDs!

Der Brückengleichrichter ist ein MB6s, welcher laut den Specs „passen“ sollte. Der 400v 10uF Kondensator zur Spannungsglättung passt ebenfalls für mich, auch der 1M Ω Endladewiderstand passt schon. AAAABBBEERRR die beiden LED Treiber SM2082D sehen schon etwas spannend aus, so als wenn die „warm“ werden. Laut specs geben sie bei 10V bis zu 60mA raus. Der Rest wird also in „Wärme“ verwandelt. Was man an den Operating temperature von -40 ~ 125°C bewundern kann.

Bei den Leuchten mit Kondensator pendelt sich die Temperatur bei etwas zwischen 70 und 75°C ein. Bei den Leuchten ohne Kondensator werden es auch mal 90°C. Da hat der kleine LED Treiber wohl ganz schön was zu regeln, wohl der Grund warum in Version 2 ein Kondensator vorgesehen ist ;-)

Gut der Hersteller hat versucht mit etwas Wärmeleitpaste auf der Rückseite des LED Streifens die Temperatur ans Alugehäuse abzugeben. Die Menge und Verteilung der Wärmeleitpaste ist aber sehr sehr dürftig. Nach etwas Einsatzzeit nimmt die Leistung der Paste natürlich ab und irgendwann ist es halt zu schlecht oder besser gesagt, die LED Treiber werden zu heiß und verbrennen ihre eigenen Lötkontakte bis zum Haarriss. Dann flackert es... Ich habe daher die Kontakte nachgelötet (kein Flackern mehr) und mit Wärmeleitkleber einen kleinen Kühlkörper auf die Treiber geklebt. Damit hält sich die Temperatur bei knapp 50°C. Das sollte die Lebenszeit deutlich erweitern. Passende Kondensatoren liegen hier ebenfalls noch und sind verbaut. Mal sehen wie lange sie nun nicht flackern!

Zusätzlich habe ich das Alugehäuse noch mit der Schutzerde verbunden. Die simple Lackisolierung vom LED Streifen bei den Temperaturen hat mich nicht ganz überzeugt ;-)

Ich würde sagen, dass hat jemand auf Verschleiß gebaut. Die Leuchten sollen wohl kurz nach der Garantie ausfallen. So zumindest mein Eindruck.... Bei dem Preis, naja...

  • Ritter-Leuchten-LY-5024-2-Obi-LED-Leuchte-01
  • Ritter-Leuchten-LY-5024-2-Obi-LED-Leuchte-02
  • Ritter-Leuchten-LY-5024-2-Obi-LED-Leuchte-03
  • Ritter-Leuchten-LY-5024-2-Obi-LED-Leuchte-04
  • Ritter-Leuchten-LY-5024-2-Obi-LED-Leuchte-05
  • Ritter-Leuchten-LY-5024-2-Obi-LED-Leuchte-06
  • Ritter-Leuchten-LY-5024-2-Obi-LED-Leuchte-07

Simple Image Gallery Extended

 

Natürlich hätte ich damit rechnen können. Ich meine Leuchten kaufen, im OBI und dann für etwas bis 20€. Was können die schon in der Herstellung gekostet haben?

Typ LY-5024-2 von Ritter Leuchten GmbH www.ritos.de