Archiv ‘Linux’

Sonntag, 27. Januar 2008

YouTube-Video mit mplayer in MP3 konvertieren

$ mplayer -dumpaudio -dumpfile song.mp3 song.flv
$ mplayer -vc null -vo null -ao pcm:file=song.wav song.flv

Quelle: Tonspur von Youtube Videos in MP3/OGG Datei wandeln

Wer keine Ahnung hat, wie man die URL eines YouTube-Videos ausfindig macht, wie man die flv-Datei mit wget herunterlädt, noch nie von mplayer gehört hat und nicht weiss ist, was eine Shell ist, dem wird empfohlen, den Song im iTunes Music Store zu kaufen. Oder er ackert die Anleitung durch …

PS: Ich habe mir folgenden Song runtergeladen:

Tags:
Labels: IT, Linux

3 Kommentare | neuen Kommentar verfassen

Mittwoch, 9. Januar 2008

Treppenbildung beim Einfügen von Code in vim

Da auch ich zu den faulen Zeitgenossen gehöre, die dann und wann bestehende Teile von Konfigurations-Dateien durch die Gegend kopieren und auf anderen Systemen in Dateien einfügen möchte, habe ich mich immer wieder über die Auto Indentation von vim aufgeregt.

Sobald nämlich Code eingefügt wird, der bereits eingerückt ist, rückt vim den Code eigenhändig erneut ein, was die Einrücktiefe für jede Zeile erhöht.

Die Lösung des Problems ist ganz simpel – ich frage mich gerade, wieso ich nicht längst danach gegoogelt habe:

:set paste

Damit schaltet man vim in den Einfüge-Modus ein, die Einrückung von bereits eingerücktem Text wird damit unterbunden.

Jetzt also nur noch …

Ctrl+I
Apple+V

… und schon steht der Text wie gewünscht in der Datei.

Quelle: Tip #330: how to stop auto indenting

Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 15. Dezember 2007

Netzwerkdrucker mit Avahi anpreisen


Bonjour Printer Sharing
Originally uploaded by emeidi

Wer Mac OS X in einem Netzwerk einsetzt, in dem sich ein etwas teurerer Netzwerkdrucker befindet, wird es längst wissen: Die Dinger preisen sich im Druckdialog unter „Bonjour Printers“ automatisch an. Die von Apple (mit?)entwickelte Technologie ist unter vielen Namen bekannt: Rendezvous, Bonjour, mDNS, Zeroconf.

Hier zu Hause betreibe ich einen HP Laserjet 1300 (der kann Postscript, was in heterogenen Umgebungen mit Linux und Mac OS X von Vorteil ist), der am LPT-Port eines Debian GNU/Linux Servers hängt. Druckaufträge aus dem Netzwerk nimmt lprng mit dem LPD/LPR-Protokoll entgegen (CUPS wäre in diesem Fall Overkill).

Als meine Freundin vor Kurzem bei mir zu Besuch war und von ihrem Laptop etwas ausdrucken wollte, erinnerte ich mich an die Einfachheit der Drucker-Installation mit Bonjour. Irgendwie sollte es doch möglich sein, die Funktionalität mit Linux nachzubauen?

Tatsächlich habe ich es nach einigem Pröbeln hingekriegt. Als erstes installiert man den avahi-daemon, der im Hintergrund die ganze mDNS-Geschichte abhandelt:

# apt-get install avahi-daemon

Anschliessend erstellen wir eine XML-Datei unter /etc/avahi/services mit folgendem Inhalt:

$ cat /etc/avahi/services/printer.service 
<service-group>
<name replace-wildcards="yes">HP Laserjet 1300 on ALPHA</name>

<service>
<type>_printer._tcp</type>
<host-name>mad4you.homeip.net</host-name>
<port>515</port>
<txt-record>txtvers=1</txt-record>
<txt-record>rp=Laserdrucker</txt-record>
<txt-record>ty=HP Laserjet 1300</txt-record>
<txt-record>product=(HP Laserjet 1300)</txt-record>
</service>
</service-group>

Erläuterung der Anweisungen

  • type: _printer._tcp Es wird das LPD/LPR-Protokoll verwendet
  • hostname: IP-Adresse oder Domain-Name des Druckservers
  • port: 515 Die Portnummer, auf der LPD lauscht
  • txt-record: rp=Laserdrucker Sehr wichtig: Der Queue-Name des Druckers auf dem LPD-Server. Stimmt dieser nicht, wird der Druckauftrag nicht angenommen. Wie die definierten LPD-Queues heissen, erfährt man aus /etc/printcap
  • ty, product Die Angaben hier sind nicht zwingend nötig – Mac OS X erkennt den Drucker dank diesen Angaben vollautomatisch und richtet die entsprechenden Drucker-Treiber ein (sofern bereits installiert).

Einen gründlichen Einblick liefert die offizielle Dokumentation von Apple: Bonjour Printing Specification

Vielfältige Anwendungsarten

Dieses Protokoll beschränkt sich überhaupt nicht nur auf die Bekanntmachung von Druckern im Netzwerk. Genauso kann man SSH-Server oder Web-Site URLs in den Äther hinaus funken.

Tags:
Labels: IT, Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 15. Dezember 2007

Load average: 87.35


Localhost – Processes
Originally uploaded by emeidi

Im Abstand von einigen Wochen ereignet sich auf meinem kleinen Heimserver hier zu Hause ein immer wieder gern gesehenes Schauspiel:

Tasks: 829 total, 54 running
  Mem[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||822/1012MB]     Load average: 66.20 76.20 87.35 
  Swp[||                                                        46/1961MB]     Uptime: 118 days(!), 02:10:10

Als ich vor einigen Wochen zum betreffenden Zeitpunkt endlich einmal zu Hause weilte (sonst bin ich in der Nacht von Samstag auf Sonntag irgendwo am rumfeiern), fand ich endlich heraus, wieso es diesen Spike gibt:

$ cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid0 md10[0] md11[1]
      488390656 blocks 1024k chunks
      
md11 : active raid1 hdg1[0] hdk1[1]
      244195904 blocks [2/2] [UU]
      [===========>.........]  check = 58.2% (142331328/244195904) finish=60.5min speed=28042K/sec
      
md10 : active raid1 hde1[0] hdi1[1]
      244195904 blocks [2/2] [UU]
      [==========>..........]  check = 54.4% (132947904/244195904) finish=70.5min speed=26291K/sec
      
unused devices: 

APC Smart-UPS SUA750I
Originally uploaded by emeidi

Ganz imposant, dass sich der Check der Arrays auch in der Last-Anzeige der USV widerspiegelt.

Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 5. Dezember 2007

monit endlich brauchbar

Monit now sends three icmp echo requests in one cycle by default.
It is possible to customize the echo requests count using the
count parameter of icmp test […]

Quelle: Re: Any Ping Sensitivity Adjust

Wie oft habe ich meine INBOX zugespammt erhalten, weil von mir betreute „Server“ mit Billig-Netzwerkkarten schlicht und einfach ein ICMP Echo „vergessen“ haben? Nun hoffe ich, dass mit

check host myserver with address 192.168.1.1
    if failed icmp type echo count 5 with timeout 3 seconds
    then alert

Ruhe einkehrt …

Tags:
Labels: IT, Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 5. Dezember 2007

Wenn Sista Özel Frühlingsputz am PC macht …


/mnt/hda1
Originally uploaded by emeidi

… zu viele Dateien löscht und das Gerät beim nächsten Neustart nicht mehr hochkommt, muss der Bruder ran.

Die Vorgeschichte

So geschehen vorgestern Abend: Um genügend Speicherplatz für das Brennen einer CD freizuschaufeln, empfahl ich meiner Schwester WinDirStat, das die Plattenbelegung graphisch anzeigt. Kombiniert mit ihren Administratoren-Rechten (wann habe ich ihr eine solche Berechtigungsstufe vergeben?!) war es nur eine Frage von Minuten, um die ersten paar wichtigen Systemdateien zu löschen.

Meine Sünden

(Es muss hierbei aber doch noch angemerkt werden, dass es eindeutig mein Fehler war, für die Systempartition auf einer 80GB-Festplatte nur 8GB freizuhalten. Immer wieder muss ich in letzter Zeit solche „Jugendsünden“ ausbügeln – Windows-Systeme, in diesem Falle Windows 2000, werden mit jedem Monat fetter. Deshalb würde ich heute die Systempartition 80GB gross machen. „Eine System- und eine Datenpartition ist etwas für Sissis!“, höre ich die PC-Welt aus dem Walde rufen …)

Das Problem

Item. Windows 2000 kam also nicht mehr hoch und zeigte nach dem BIOS-Screen folgende Meldung an:

NTLDR fehlt
Neustart mit Strg+Alt+Entf

Schön. Nun hatte ich zwei Möglichkeiten: Entweder ich boote von der Windows 2000-Installations-CD. Oder aber ich bemächtige mich meiner Knoppix 5.1-CD.

Die Wahl war sofort klar: Knoppix Erstens, weil die Windows-CD unheimlich lange zum starten hat, zweitens weil die Recovery-Umgebung … nun gelinde ausgedrückt … für’n Arsch ist. Weder werden USB-Treiber geladen, noch die Netzwerkkarte erkannt. Auch die Bordmittel wie fixmbr sind zwar schön und recht – doch für was braucht man sowas, wenn man eine Linux Live-CD rumliegen hat?

Knoppix

So sehr ich für Knoppix schwärmen mag – ich kann mich nicht erinnern, dieses Live-System jemals im ersten Anlauf hochgebracht zu haben. Entweder wird das CD-Laufwerk, von dem Knoppix gerade bootet, nicht gefunden, irgendetwas stimmt mit ACPI nicht oder aber – wie heute – der Schirm bleibt nach dem erstaunlich flooten Linux-Boot schwarz (evtl. ein VGA/DVI-Problem).

Mit der Boot-Option failsafe drang ich dann schliesslich bis zum Knoppix-GUI vor. Nach dem Wechsel in die Konsole mittels Ctrl+Alt+F2 mountete ich die Windows-Systempartition:

$ sudo su
# mount /mnt/hda1

(klappt übrigens längst auch mit NTFS!) Danach konnte ich eine Inspektion vornehmen:

cd /mnt/hda1
ls -l

Und tatsächlich, neben den einschlägig bekannten Ordner-Namen starrte mich blanke Leere an: Unter C:\ fand sich nur gerade eine Datei, die sich pagefile.sys nannte.

Da hatte meine Schwester also doch tatsächlich alles im Root gelöscht, was nicht niet- und nagelfest war (ich vermute, dass pagefile.sys bei der Löschaktion in Benutzung war, weshalb diese Datei nun wirklich nicht entfernt werden konnte).

On Windows, everything is a file

Nun gut, nicht ganz. Doch ein Versuch war es in diesem Falle wert: Ich ging in den oberen Stock, startete den Windows 2000-Computer meines Vaters und kopierte die Dateien

boot.ini
ntdetect.com
ntldr

auf einen USB-Stick.

USB-Stick nicht gefunden

In der failsafe-Umgebung von Knoppix wurde der USB-Stick leider nicht erkannt (als ich ihn einsteckte, leuchtete er nicht einmal, was auf deaktivierte USB-Ports hindeutet).

Irgendwie musste ich doch in die „normale“ Oberfläche hineinkommen? Reboot.

Ich schaute mir am Knoppix-Boot-Screen mit Druck auf F2 und F3 die Vielzahl der möglichen Optionen an. Dann hatte ich die Lösung gefunden:

boot: knoppix 2

Mit dieser Boot-Option startet Knoppix „nur“ in den Runlevel 2, also ohne graphische Ausgabe. Genau, was ich benötigte.

Runlevel 2

Nachdem vorbeiflimmern unzähliger Linien über den Linux-Bootvorgang landete ich bei tty2 und konnte mich meiner Kommandozeilen-Kenntnisse bedienen.

  1. Mounten der Windows-Systempartition:
    $ sudo su
    # mount /mnt/hda1
  2. Mounten des USB-Sticks:
    # mount /mnt/sda1
  3. Kopieren der Systemdateien vom USB-Stick auf die Systempartition:
    # cp boot.ini ntdetect.com ntldr /mnt/hda1

Fertig! Zu Probezwecken konnte das System nun neu gestartet werden:

# reboot

Und siehe da – nachdem ich die CD aus dem Laufwerk entfernt hatte, starte Windows frisch und munter in den neuen Arbeitstag hinein …

Tags: ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 27. November 2007

Kleine wget-Tricks

Via ein Video über einen Autisten, der herzergreifend die us-amerikanische Nationalhymne singt …

… bin ich zum Liedtext vorgedrungen:

The Star Spangled Banner

Das MP3

Auf derselben Seite werden auch drei Tonspuren der Nationalhymne angeboten; darunter eine von LeAnn Rimes.

Da diese Interpretation saugut tönt, wollte ich mir eine „Sicherheitskopie“ anfertigen.

Dies hat sich als komplizierter erwiesen als gedacht (ja, ich bevorzuge den Download per wget – insbesondere, wenn es sich um mehrere Megabyte grosse Inhalte handelt):

beta:~/Desktop mario$ wget http://www.englisch-hilfen.de/mp3/leann_rime.mp3--01:11:32--  http://www.englisch-hilfen.de/mp3/leann_rime.mp3
           => `leann_rime.mp3.1'
Resolving www.englisch-hilfen.de... done.
Connecting to www.englisch-hilfen.de[87.106.2.52]:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
01:11:32 ERROR 403: Forbidden.

Soso … Aber vorhin konnte ich das Stück im Browser doch ohne Probleme anhören? Zwei Möglichkeiten für die unerwartete Weigerung des Web-Servers kommen mir auf Anhieb in den Sinn:

  • Referer-Blocking: Nur wer von der selben Domain auf das MP3 zugreift, darf es herunterladen
  • User Agent-Blocking: User Agents wie „wget 1.9.2“ etc. wird der Zugriff auf die Datei nicht erlaubt

Als erstes Versuche ich letzteres und gebe der Anfrage einen anderen User Agent-string mit:

beta:~/Desktop mario$ wget --user-agent Mozilla/4.0 http://www.englisch-hilfen.de/mp3/leann_rime.mp3
--01:11:22--  http://www.englisch-hilfen.de/mp3/leann_rime.mp3
           => `leann_rime.mp3'
Resolving www.englisch-hilfen.de... done.
Connecting to www.englisch-hilfen.de[87.106.2.52]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,910,784 

100%[====================================>] 1,910,784    607.03K/s    ETA 00:00

01:11:26 (607.03 KB/s) - `leann_rime.mp3' saved [1910784/1910784]

Na also! Das simple „Mozilla/4.0“ reicht bereits, um Zugriff auf die Datei zu erhalten.

Internet-Geschichte

Ursprünglich wurde Mozilla nur als firmeninterne Bezeichnung für den Webbrowser Netscape Navigator benutzt. Zum genauen Ursprung des Namens, der sich auf den ersten populären Webbrowser Mosaic bezieht, gibt es mehrere Erklärungen. Eine besagt, dass er sich aus Mosaic Killa zusammensetzt, laut der anderen aus Mosaic meets Godzilla. Möglicherweise treffen sogar beide Erklärungen zu.

Quelle: Mozilla

Labels: IT, Linux, Web

1 Kommentar | neuen Kommentar verfassen

Montag, 26. November 2007

Das c’t vom 26. November 2007

Ein kleiner Streifzug durch die aktuelle Ausgabe der Computerzeitschrift c’t:

Offenbar funktioniert Kundenbindung heutzutage nach dem Diodenprinzip und die Kündigung ist dabei die Sperrrichtung. Reinzukommen ist ganz leicht, in der anderen Richtung trifft man auf erheblichen Widerstand.

Quelle: c’t, 26. November 2007, „Das Diodenprinzip“, S. 1.

Die Expo ist auch als Treffpunkt zwischen Kapitalgebern und Unternehmensgründern konzipiert. In eigenen Workshops gaben Gründer und Investoren Tipps zur Entwicklung von Geschäftskonzepten. Dabei wünschen sich die Kapitalgeber aber „mehr Hacker und weniger MBAs“, wie Reshma Sohoni vom Gründer-Netzwerk Seedcamp erklärte.

Quelle: c’t, 26. November 2007, „Katerstimmung in Berlin“, S. 42.

Swiss fliegt auf Zuverlässigkeit von Windows Server – Linux ohne Starterlaubnis

Ein weiterer Vorteil ist, dass das neue System wesentlich mehr Kapazitäten hat als das alte, das auf 250 Nutzer beschränkt war. […] „Eine Verbesserung der Uptime auf 99.95% bei gleichzeitiger Kapazitätssteigerung, um mehr Anfragen gleichzeitig zu bearbeiten, ermöglicht es unserem Team, den Anstieg von 30%, den wir bei unserem Online-Vertrieb erleben, spielend abzuwickeln.“

Immer schön, wenn sich im Kampf zwischen Gut und Böse auch noch die CIOs ins Rampenlicht stellen:

„[…] Mit Linux hatten wir nicht die nötige Zuverlässigkeit oder Flexibilität.“ –– Frank Meyer, CIO, SWISS

Mit dieser Aussage stellt sich der CIO gegen den Linux-Erfinder höchstpersönlich:

Torvalds: I think the real strength of Linux is not in any particular area, but in the flexibility. For example, you mention virtualization, and in some ways that’s a really excellent example, because it’s not only an example of something where Linux is a fairly strong player, but more tellingly, it’s an example where there are actually many different approaches, and there is no one-size-fits-all „One True Virtualization“ model.

Quelle: Torvalds On Where Linux Is Headed In 2008

Tags:
Labels: IT, Linux, Medien

1 Kommentar | neuen Kommentar verfassen

Freitag, 23. November 2007

Apache 2.2 gegen LDAP authentifizieren

Die meisten werden es kennen: Wo man sich auch immer in der IT-Landschaft bewegt benötigt man Zugangsdaten. Vielerorts sind diese noch nicht vereinheitlicht (Stichwort Single-Sign-On, Kerberos etc.) – Administratoren wie Endbenutzer müssen sich eine Vielzahl von Benutzernamen und Passwörtern merken, um der täglichen Arbeit nachzugehen.

Wenn wie bei mir auf der Arbeit hingegen bereits ein von einer anderen Einheit betriebenes LDAP-Verzeichnis besteht, kann man dieses bei der Bewirtschaftung von Web-Applikationen zur Benutzer-Authentifizierung und -Authorisierung hinzuziehen.

In der hier vorliegenden Anleitung erläutere ich, wie Web-Verzeichnis gegen unbefugten Zugriff geschützt werden. Zum Einsatz kommen Debian und Apache 2.2 – ich gehe davon aus, dass beides bereits ordnungsgemäss installiert und konfiguriert wurde.

OpenLDAP & Hilfsprogramme installieren

Als erstes installiert man OpenLDAP sowie die ldap-utils mit einigen nützlichen Hilfsprogrammen:

apt-get install slapd
apt-get install ldap-utils

OpenLDAP lässt man aber unkonfiguriert, denn ein aktiver LDAP-Server befindet sich ja bereits im Netzwerk und versieht seinen Dienst.

Anschliessend passt man die Konfiguration von OpenLDAP an:

$ cat /etc/ldap/ldap.conf
BASE            o=org,c=ch
URI             ldaps://ldap.domain.tld
TLS_CACERTDIR   /etc/ldap/cacerts
TLS_REQCERT     never

SSL-Zertifikate

In unserem Falle reichte es, in /etc/ldap einen Symlink auf /etc/ssl/certs einzurichten. Der LDAP-Server verwendet ein Standard-Zertifikat von CyberTrust, welches bei Debian schon von Beginn weg dabei ist (?).

Bei einer frischen Debian-Installation (4.0r3) existiert dieses Verzeichnis nicht; Zertifikate sind auf dem System standardmässig keine vorhanden. Zuerst gilt es nun also, das Zertifikat des Servers herauszufinden:

openssl s_client -connect ldap.domain.tld:636 -showcerts

Anhand dieser Angaben sucht man über Google nach dem „<anbieter> global root“ des Anbieters (bspw. Cybertrust) und gelangt so normalerweise sofort zu den gesuchten Information. In meinem Fall war es:

ct_root.pem

Dieses Zertifikat laden wir uns herunter und legen es im Verzeichnis /etc/ldap/cacerts ab.

Anstelle in der ldap.conf explizit ein Zertifikat anzugeben, überlassen wir es OpenLDAP, das richtige Ding zu eruiren. Das klappt natürlich nur, wenn der Sysadmin des LDAP-Servers nicht selbst ein Zertifikat gebastelt hat.

Testlauf

Um zu überprüfen, ob OpenLDAP korrekt konfiguriert wurde, lässt man eine erste Abfrage laufen:

$ ldapsearch -x "uid=maeby"
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: uid=maeby
# requesting: ALL
#

# maeby, suborg, org, ch
dn: ...
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
objectClass: ...
objectClass: ...
objectClass: ...
uid: maeby
shadowFlag: 1
description: temporary staff account, imported from domain
homeDirectory: /home/maeby
uidNumber: 0001
gidNumber: 0010
cn: Mario Aeby
loginShell: /bin/bash

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Wenn dies klappt, geht es zum nächsten Schritt:

Apache 2.2 konfigurieren

Als erstes aktiviert man die zwei LDAP-Module:

$ cd /etc/apache2/mods-enabled
ln -s ../mods-available/ldap.load
ln -s ../mods-available/authnz_ldap.load

Es empfiehlt sich, einen LDAP-Cache einzurichten. Im selben Verzeichnis (/etc/apache2/mods-enabled) erstellt man deshalb eine Datei ldap.conf mit folgendem Inhalt:

$ cat /etc/apache2/mods-enabled/ldap.conf
# Enable the LDAP connection pool and shared
# memory cache. Enable the LDAP cache status
# handler. Requires mod_ldap and mod_auth_ldap

LDAPSharedCacheSize 2000000
LDAPCacheEntries 1024
LDAPCacheTTL 28800
LDAPOpCacheEntries 1024
LDAPOpCacheTTL 28800

# specify shared memory file, to activate cache
LDAPSharedCacheFile /var/cache/apache2/ldap.cache

Web-Verzeichnisse schützen

Das Vorgehen ist ähnlich zu einer Authentifikation über eine htpasswd-Datei, abgesehen davon dass man einige andere Befehle einsetzt:

$ cat .htaccess
AuthType Basic
AuthName Test

AuthLDAPURL "ldaps://ldap.domain.tld/o=org,c=ch?uid"
AuthzLDAPAuthoritative on

AuthBasicProvider ldap

Require ldap-user maeby bgates sjobs

Anstelle Benutzer kann man auch Gruppen spezifizieren – oder gar spezielle Filter mitgeben, die erfüllt sein müssen.

Tags: ,
Labels: Linux, Web

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 6. November 2007

PHP wirft mime_magic-Fehler

Wenn beim Aufruf von php-cli folgende Fehlermeldungen ausgespuckt werden …

PHP Warning:  mime_magic: type search/400       \\input         text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\section       text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\setlength     text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\documentstyle text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\chapter       text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\documentclass text/x-tex invalid in Unknown on line 0

Quelle: [php-maint] Bug#361789: PHP Warning: mime_magic: type search [..] text/x-tex invalid in Unknown on line 0

… hilft nur noch das Hash-Zeichen in /usr/share/file/magic.mime. Sucht man nach type search, gelangt man innert Bruchteilen zum fraglichen Block. Beim Kommentieren sollte aber auch

#0      regex           [Cc]onstant[[:space:]]+[Ss]tory text/x-inform

nicht vergessen gehen.

Labels: Linux, Web

Keine Kommentare | neuen Kommentar verfassen