Archiv ‘Linux’

Mittwoch, 23. Mai 2018

Init7 TV7: Beste inoffizielle IPTV-Applikation für Apple TV

(Folgeartikel zum Artikel Init7 TV7: Installation mit einem Turris Omnia-Router)

Init7 bietet zwar eine dedizierte Apple TV-App für TV7 an, doch bereits bei der Ankündigung befürchtete ich, dass die in unserem Haushalt nicht erhältlich sein wird: Wir haben einen Apple TV 4 mit 32GB-Speicher, das Gerät läuft aber auf die us-amerikanische Apple ID meiner Frau. Dementsprechend werden uns im App Store auch nur die weltweit verfügbaren und die für den us-amerikanischen Markt verfügbaren Apps angezeigt.

Keine Spur von der TV7 App:

Nach einigem Pröbeln entschied ich mich für den Kauf resp. die Installation folgender drei vier Apps:

  1. iPlayTV
  2. rIPTV
  3. GSE SMART IPTV
  4. TV Streams

Wichtiger Tipp

Es empfiehlt sich, den Direktlink auf die TV7-Kanalliste (tvchannels.m3u) mit dem iPhone als „Eingabetastatur“ in die Apple TV-Oberfläche einzugeben einzufügen (Copy & Paste) — sonst wird man wahnsinnig, bevor man das mit der Apple TV Remote bewerkstelligt hat.

iPlayTV

Apple App Store Link, Letztes Update: 4. Mai 2017 (!), Kaufpreis: $2.99

Meiner Meinung nach das beste GUI, aber die App funktioniert nicht: Die M3U-URL konnte ich zwar schnurstracks hinterlegen, die Sender werden aus der M3U-Datei ausgelesen und die bekannten darunter mit Logo der Sendestation versehen. Doch wenn ich irgendeinen Kanal auswähle, erscheint folgende Fehlermeldung:

Some problem happened while playing SRF1 HD

Ich habe darauf jede verfügbare Einstellung angepasst, doch schlussendlich gab ich auf: Mit iPlayTV kann man aus irgendeinem Grund keine TV7-Streams empfangen.

rIPTV

Apple App Store Link, Letztes Update: 3. Februar 2018, Kaufpreis: $2.99

Die Applikation meiner Wahl (weil ich es mit iPlayTV nicht hingekriegt habe). Das GUI schaut ebenfalls sehr benutzerfreundlich aus, und ist es auch — iPlayTV wäre aber ein Mü hübscher.

Mit dieser App hatte ich anfänglich das Problem, die M3U-Kanalliste mittels Direktlink einzulesen — das funktioniert irgendwie einfach nicht:

Schlussendlich musste ich mir auch noch die iPhone-App kaufen, die Senderliste mittels der URL importieren (auf dem Smartphone funktioniert es!) und diese dann mittels Fast Load (YouTube-Anleitung) auf den Apple TV pushen.

Seither funktioniert alles Bestens und ich kann mit der App jeden Sender schauen.

Vorteile: Sender-Logos der bekannten (und von TV7 „richtig“ benannten TV-Sendern) werden erkannt, heruntergeladen und angezeigt. Auch holt sich die App von irgendwo aus dem Internet den EPG und zeigt diesen — falls für den Sender verfügbar — automatisch an.

Nachteil: Ändert TV7 dereinst die IPs oder Ports seiner Sender, muss ich das ganze Import und Fast Load-Prozedere erneut durchkauen — und alle Favoriten neu setzen.

GSE SMART IPTV

Apple App Store Link, Letztes Update: 21. Mai 2018, Kaufpreis: Gratis (limitierte Version; mit In-App-Käufen aufrüstbar — oder direkt für $4.99 als Pro-Version kaufen)

Die App sieht schlicht zum Kotzen aus — als hätte sie ein junger, pickliger Bill Gates im Hinterhof zusammengeschustert. Ein solches GUI würde man am ehesten in einer H4x0r/Cracker-Schattenwelt erwarten.

So hässlich die Applikation daherkommt — es war die einzige, die mit dem M3U-Direktlink auf Anhieb funktionierte. Und: Sie erlaubt es sogar, Streams direkt auf den Apple TV aufzunehmen, falls der freien Festplattenplatz aufweist.

TV Streams

Apple App Store Link, Letztes Update: 17. Mai 2018, Kaufpreis: $2.99, Offizielle Homepage

NOCH NICHT AUSPROBIERT

Video-Tutorial, um M3U-Listen hinzuzufügen

Links

Tags: , , , , , ,
Labels: Apple, IT, Linux, Medien, Schweiz

2 Kommentare | neuen Kommentar verfassen

Mittwoch, 23. Mai 2018

Init7 TV7: Installation mit einem Turris Omnia-Router

Gestern liessen Fredy Künzler und seine Init7 die Überraschungsbombe platzen: Ab sofort gibt es TV7, das IPTV-Angebot des ISPs, für alle Fiber7-Kunden kostenlos zum spotgünstigen, symmetrischen 1 Gbit/s Internetabo hinzu:

Medienmitteilung vom 22. Mai 2018

Das bedeutet, dass ich nun über eine 1 GBit/s-Leitung feinste, unkomprimierte HD-Streams aller hierzulande gängigen und einiger eher exotischer Sender empfangen kann — derzeit 215 an der Zahl.

Wieso gerade jetzt? Aus meiner Sicht aus zwei Gründen: Erstens steht die Fussball-WM 2018 vor der Tür, wo man mit einem unkomprimierten Multicast-Stream die Überlegenheit über die Konkurrenz demonstrieren kann (fünf Sekunden vor dem Nachbarn das entscheidende Goal im Final sehen? Check.). Andererseits, weil Salt kürzlich mit seinem (geschwindigkeitstechnisch fragwürdigen) Fiber-Angebot Furore in den Medien gemacht hat, und dort auch IPTV draufpackt (inkl. schicker Integration in iOS).

Installation

Am Abend zog ich zu Hause die Bastelhandschuhe an und machte mich daran, die von TV7 ausgesendeten UDP Multicast-Streams über meinen Router ins interne Netzwerk zu transportieren.

Dank der vom ISP netterweise verfassten Anleitung für den Fiber7-Router meiner Wahl, den Turris Omnia, war das ein Klacks:

Anleitung Fiber7 TV7

Kurz zusammengefasst:

  1. In LuCI einloggen und unter System > Software das Softwarepaket igmpproxy installieren. Hierzu musste ich zuerst einmalig Update lists anklicken, und danach in das Suchfeld Filter den Namen des Pakets eingeben. Noch Find Package klicken und dann in der linken Spalte den Link Install anwählen.
  2. Per SSH auf die Kommandozeile des Routers einloggen und die Konfigurationsdatei unter /etc/config/igmpproxy anpassen (s. unten). Daraus wird dann /var/etc/igmpproxy.conf generiert
  3. In LuCI unter System > Startup igmpproxy auf enabled schalten und einmal start (resp. bei mehrmaligen Versuchen restart) drücken
  4. Per SSH auf der Kommandozeile des Routers mittels ps | grep -i igmp überprüfen, dass der Prozess läuft:
     6728 root       804 S    /usr/sbin/igmpproxy /var/etc/igmpproxy.conf

/etc/config/igmpproxy

config igmpproxy
	option quickleave 1

config phyint wan
	option network wan
	option direction upstream
	list altnet 0.0.0.0/0

config phyint lan
	option network lan
	option direction downstream

Init7 empfiehlt einen Reboot, welchen ich schlussendlich doch noch durchgeführt habe, aber nur, weil etwas mit dem Test-Stream (s. unten) nicht funktioniert hat. Ich kann mir vorstellen, dass der Router Multicast auch ohne Reboot hinkriegt, lasse mir aber gerne das Gegenteil bestätigen.

Test

Um möglichst viele potentiell störenden Parameter auszuschliessen, schloss ich mein MacBook 12″ mittels eines USB-C-auf-Ethernet-Adapters direkt an einen Ethernet-Port des Routers an. So schliesse ich aus, dass Switches zwischen dem Endgerät und dem Router Multicast vermüeseln (mein 8-Port UniFi- und mein 16-Port TP-LINK Gigabit-Switch funktionieren tadellos, ohne irgendwelche Konfiguration).

Anschliessend wollte ich den Empfang mit dem im FAQ-Artikel „Kann ich vorab testen, ob mein Router TV7 (Multicast) unterstützt?“ verlinkten Stream auf den Big Buck Bunny (Bedeutung) testen. Doch leider kriege ich diesen Stream bis heute nicht zu laufen — weshalb ich gestern zuerst auf ein Konfigurationsproblem tippte und deshalb den Router doch noch einem Kaltstart unterzog (ich bin mir fast sicher, dass das nicht nötig gewesen wäre).

Nachdem ich mir sicher war, dass igmpproxy sauber läuft, entschloss ich mich schlussendlich, einfach die im FAQ-Artikel „Kann ich TV7 auch auf anderen Geräten als Apple TV anschauen?“ erwähnte M3U-Datei herunterzuladen und in VLC 3.0.2 zu öffnen. Und siehe da: Wenige Sekunden später, nach nicht einmal 30 Minuten Installationsdauer, sah ich die Tagesschau gestochen scharf in höchster Auflösung auf dem Retina-Display meines MacBooks entgegenflimmern:

Tags: , , , , , , , , , , , ,
Labels: IT, Linux, Medien

2 Kommentare | neuen Kommentar verfassen

Samstag, 14. April 2018

Testen, ob ein Linux-System (auch) über IPv6 ans Internet angebunden ist

Dies ist ganz simpel:

$ ping6 ipv6.google.com

Quelle: How to test IPv6 connectivity

Da ich mit IPv6 völlig überfordert bin, habe ich es auf all meinen Linux-Systemen deaktiviert, indem ich in die Datei /etc/sysctl.conf folgende Zeilen eingefügt habe:

...
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1

Quelle: How to turn off IPv6

Das Kommando meldet dann folgende Antwort zurück:

$ ping6 ipv6.google.com
connect: Cannot assign requested address

Das bedeutet:

[…] suggests that the inet6 protocol family isn’t loaded

Quelle: IPv6 with miredo: „connect: Cannot assign requested address“

Auf einigen Systemen hiess es aber auch:

$ ping6 ipv6.google.com
ping: socket: Operation not permitted

und auf anderen hiess es:

$ ping6 ipv6.google.com
connect: Network is unreachable

Damit wusste ich, dass ich auf diesen Systemen sysctl.conf noch nicht angepasst hatte. Das ist nun nachgeholt.

Tags: , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Freitag, 30. März 2018

Zwei Tipps zu dd unter macOS

dd verwendet man unter macOS wahrscheinlich normalerweise dann, wenn man Images (1:1 Abbilder) von portablen Datenträgern machen möchte oder diese auf portable Datenträger zurückspielen möchte.

Folgende zwei Dinge sind dabei wichtig:

Geschwindigkeit

Unter macOS sollte man Datenträger immer in der Schreibweise /dev/rdisk1s1 ansprechen und nie als /dev/disk1s1. Damit können Images messbar schneller geschrieben werden, in der Regel mit Faktor 3.

Auch die Blocksize (definiert mit dem Parameter bs) sollte hoch angesetzt werden — nachfolgend auf 2 Megabytes:

# dd if=/tmp/image.img of=/dev/rdisk1 bs=2m

Zwischenstand

Leider gibt dd im normalen Gebrauch keinen Fortschritt aus. Erst sobald der Kopiervorgang abgeschlossen ist, erhält man eine Statistik über die Anzahl der kopierten Blöcke sowie über den Datendurchsatz.

Betätigt man aber bei einem in der Shell laufenden dd-Kopierprozess die Tastenkombination Ctrl-T gibt dd den Zwischenstand des Lese- oder Schreibvorgangs aus, ohne den Kopiervorgang zu unterbrechen.

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 22. März 2018

Mit ImageMagick eine Collage aus vier verschiedenen Bildern machen

Kürzlich musste ich vier Screenshots zu einem Bild zusammenfassen, da eine Ricardo-Auktion nur noch ein zusätzliches Bild zur Verfügung hatte. Mit ImageMagick und seinem Tool montage ist auch das kein Problem:

$ montage About_01.png About_02.png About_03.png About_04.png -tile 2x -geometry +0+0 -border 100 -bordercolor white montage.png

Damit resultiert eine 2×2 Matrix der Screenshots.

Nachtrag

Hat man nur zwei Bilder und möchte man diese übereinander stellen, wählt man folgende Syntax:

$ montage Oben.jpg Unten.jpg -tile 1x -geometry +0+0 -border 100 -bordercolor white montage.jpg

Tags: ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 22. März 2018

cacti benötigt die MySQL Zeitzonen-Datenbank

Vor kurzem habe ich meine cacti-Installation „gelüpft“. Leider kam es vorübergehend zu einem Showstopper, weil die Software nach einer MySQL Timezone database verlangt, welche ich nicht installiert hatte:

ERROR: Your MySQL TimeZone database is not populated. Please populate this database before proceeding.

Wieso das sonst sehr benutzerfreundliche cacti-Installationsscript diese Datenbank in so einem Fall nicht einfach nachinstalliert, wissen nur die Geier.

Es war also Handarbeit angesagt — nach etwas googlen kein Problem:

$ mysql -u root -p mysql < /usr/share/mysql/mysql_test_data_timezone.sql

Quelle: Upgrade problem MySQL Timezone

Die Empfehlung, dem cacti-Benutzer zudem noch die Leseberechtigung auf die Tabelle mysql.time_zone_name zu geben, war bei mir nicht nötig.

Offenbar gibt es bei MySQL auch einen eigenständigen Befehl, der die Sache installiert – getestet habe ich das aber nicht:

$ mysql_tzinfo_to_sql tz_dir

Quelle: 4.4.6 mysql_tzinfo_to_sql — Load the Time Zone Tables

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 22. März 2018

mysqldump: MySQL-Benutzer hat keine Rechte, eine Tabelle zu sperren

Als ich kürzlich ein selten gebrauchtes Backup-Script ausführen wollte, kam ich folgende Fehlermeldung zu Gesicht:

mysqldump: Got error: 1044: "Access denied for user 'username'@'10.1.2.3' to database 'app_app'" when using LOCK TABLES

Die Lösung für das Problem ist eigentlich ganz simpel. Entweder über die mysql-Kommandozeile:

GRANT LOCK TABLES ON app_app.* TO 'username'@'10.1.2.3';
FLUSH PRIVILEGES;

… oder über phpMyAdmin, wo man dem zutreffenden Benutzer unter mysql > Tables > db ein Häkchen bei Lock_tables_priv setzt …

… den Datensatz speichert und danach die Benutzerprivilegien neu lädt, indem man im Menupunkt „SQL“ den Befehl „FLUSH PRIVILEGES“ eingibt und das Kommando ausführt.

Tags: , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 22. März 2018

Wenn der UniFi Controller die MongoDB Log-Datei gigabyteweise füllt

Ich betreibe an drei physischen Standorten auf zu Linux-Servern umfunktionierten Lenovo-Laptops je einen UniFi-Controller, um die UniFi-Access Points an diesen drei Standorten zu provisionieren und zu überwachen.

Wer diese Software ebenfalls im Einsatz hat, sollte insbesondere nach Updates gelegentlich mal in das Verzeichnis /var/log/unifi reinschauen und überprüfen, dass sich die Log-Datei mongod.log nicht im Sekundentakt mit nachfolgend aufgeführten Fehlermeldungen füllt und so locker mehrer Gigabyte gross werden kann:

2018-03-12T20:49:21.010+0100 I CONTROL  [main] ***** SERVER RESTARTED *****
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] MongoDB starting : pid=26817 port=27117 dbpath=/usr/lib/unifi/data/db 64-bit host=HOSTNAME
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] db version v3.2.11
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] git version: 009580ad490190ba33d1c6253ebd8d91808923e4
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2l  25 May 2017
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] allocator: tcmalloc
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] modules: none
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] build environment:
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten]     distarch: x86_64
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten]     target_arch: x86_64
2018-03-12T20:49:21.018+0100 I CONTROL  [initandlisten] options: { net: { bindIp: "127.0.0.1", http: { enabled: false }, port: 27117, unixDomainSocket: { pathPrefix: "/usr/lib/unifi/run" } }, storage: { dbPath: "/usr/lib/unifi/data/db" }, systemLog: { destination: "file", logAppend: true, path: "/usr/lib/unifi/logs/mongod.log" } }
2018-03-12T20:49:21.068+0100 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 127.0.0.1:27117
2018-03-12T20:49:21.069+0100 E NETWORK  [initandlisten]   addr already in use
2018-03-12T20:49:21.069+0100 E STORAGE  [initandlisten] Failed to set up sockets during startup.
2018-03-12T20:49:21.069+0100 I CONTROL  [initandlisten] dbexit:  rc: 48

Relevant ist die eine Zeile, die da lautet:

2018-03-12T20:49:21.068+0100 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 127.0.0.1:27117

Sie besagt, dass bereits ein Prozess auf Port 27117 lauscht. Und was macht das blöde Stück Software in einem solchen Fall? Es startet neu, immer wieder, ohne Ende. Und bei jedem Neustart (gefühlt alle Sekunde, wenn man sich mit tail -f dranhänkt) füllt sich das Log mit weiteren 1600+ Bytes und somit mit 5.6 Megabytes pro Stunde, 134.4 MB pro Tag und 940.8 MB pro Woche.

Als Anschauungsbeispiel das Log-Verzeichnis auf einem meiner Server:

/var/log/unifi]# ls -lh
total 1.2G
-rw------- 1 unifi root     0 Mar 18 00:08 mongod.log
-rw------- 1 unifi root   153 Jan 12 14:32 mongod.log.10.gz
-rw------- 1 unifi root   900 Jan  5 23:38 mongod.log.11.gz
-rw------- 1 unifi root   882 Dec 30 22:15 mongod.log.12.gz
-rw------- 1 unifi root   687 Dec 23 02:27 mongod.log.13.gz
-rw------- 1 unifi root   691 Dec 16 10:58 mongod.log.14.gz
-rw------- 1 unifi root  1.1G Dec  2 12:07 mongod.log.15.gz
-rw------- 1 unifi root  3.4M Mar 13 21:30 mongod.log.1.gz
-rw------- 1 unifi root   30M Mar 12 00:09 mongod.log.2.gz
-rw------- 1 unifi root   23M Mar  4 00:09 mongod.log.3.gz
-rw------- 1 unifi root   30M Feb 26 00:07 mongod.log.4.gz
-rw------- 1 unifi root   23M Feb 18 00:09 mongod.log.5.gz
-rw------- 1 unifi root   30M Feb 12 00:08 mongod.log.6.gz
-rw------- 1 unifi root  1.7M Feb  4 00:10 mongod.log.7.gz
-rw------- 1 unifi root   675 Jan 26 09:19 mongod.log.8.gz
-rw------- 1 unifi root   236 Jan 21 14:25 mongod.log.9.gz

Wie man auf einen Blick sieht, hat sich das Log in der Woche vom 25. November bis zum 2. Dezember auf diese Weise gefüllt und war selbst mit gzip gezippt noch satte 1.1GB gross. Im Vergleich zu anderen Wochen, wo ein paar wenige Bytes zusammenkommen.

Wer den UniFi-Controller auf einer SSD-Platte laufen hat, dem werden ob diesen Schreiboperationen die Tränen kommen.

Was ist die Lösung?

# killall mongod

Startet der UniFi-Controller die MongoDB das nächste Mal neu, kann sie sich an den Port binden.

In den Foren des Herstellers finden sich auf Anhieb eine einzige Meldungen zum Symptom, aber mit einem anderen Lösungsvorschlag, der mit meiner Situation nichts zu tun hatte:

Auf Ask Ubuntu findet sich eine generelle Problemmeldung zum Thema MongoDB: Mongod server not woking due to the following error. Von hier stammt schlussendlich der essentielle Hinweis, einfach den bereits laufenden mongodb-Prozess zu „killen“.

Tags: , , ,
Labels: Linux

2 Kommentare | neuen Kommentar verfassen

Sonntag, 25. Februar 2018

Eine RRD-Datei mit einer weiteren Data Source DS ergänzen

Heute musste ich in Cacti eine zusätzliche Data Source zu einer bestehenden Round Robin Database hinzufügen, welche bereits Daten enthielt, welche ich nicht verlieren wollte.

Cacti scheint ein solches Update des RRDs nicht selbständig machen zu können, weshalb etwas Handarbeit angesagt ist.

Glücklicherweise unterstützt rrdtool (mittlerweile) eine solche Aktualisierung von RRDs:

in the 1.5 series there is a much better solution for the whole ‚modify rrd‘ problem … create has the ability to pre-populate a new rrd file based on an existing one …

Quelle: since when rrdtool tune can add another DS?

Tatsächlich, schaut man sich die man-Page von rrdcreate an, findet man den Parameter --source, mit welchem man auf eine bestehende Datei zeigen kann, deren Messdaten dann nach allen Regeln der Kunst in die neue Datei importiert werden.

Da Cacti im Data Source Debug Mode einem auch den rrdcreate-Befehl anzeigt, konnte ich diesen kopieren und mit diesem Parameter ergänzen. Um keine Daten zu verlieren, kopierte ich vorher die ursprüngliche RRD-Datei nach /tmp/legacy.rrd und arbeitete nur mit dieser Datai als Quelle. Schlussendlich sah der Befehl dann so aus:

/usr/bin/rrdtool create \
/var/www/cacti/rra/fr24.rrd \
--step 60  \
--source /tmp/legacy.rrd \
DS:AIRCRAFTS:GAUGE:120:0:U \
DS:MESSAGES:COUNTER:120:0:U \
RRA:AVERAGE:0.5:1:500 \
RRA:AVERAGE:0.5:1:600 \
RRA:AVERAGE:0.5:6:700 \
RRA:AVERAGE:0.5:24:775 \
RRA:AVERAGE:0.5:288:797 \
RRA:MIN:0.5:1:500 \
RRA:MIN:0.5:1:600 \
RRA:MIN:0.5:6:700 \
RRA:MIN:0.5:24:775 \
RRA:MIN:0.5:288:797 \
RRA:MAX:0.5:1:500 \
RRA:MAX:0.5:1:600 \
RRA:MAX:0.5:6:700 \
RRA:MAX:0.5:24:775 \
RRA:MAX:0.5:288:797 \
RRA:LAST:0.5:1:500 \
RRA:LAST:0.5:1:600 \
RRA:LAST:0.5:6:700 \
RRA:LAST:0.5:24:775 \
RRA:LAST:0.5:288:797 \

In der Legacy-Datei existierte bereits eine Zeitreihe für AIRCRAFTS, MESSAGES kamen heute dazu.

Fertig!

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 21. Februar 2018

SSH mit Benutzernamen und Passwort forcieren

Es gibt Momente, da möchte man nicht, dass der lokale ssh-agent alle vorhandenen Private Keys durchprobiert, um auf einen SSH-Server einzuloggen, sondern einem das Eingabefenster für das Passwort präsentiert.

Dies gelingt folgendermassen:

$ ssh -o PreferredAuthentications=keyboard-interactive,password -o PubkeyAuthentication=no 10.11.12.13

Via: SSH use only my password, Ignore my ssh key, don’t prompt me for a passphrase

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen