console log level

Falls man auf der (physischen) Linux Konsole von kernel log messages zugemüllt wird, kann man den Wert von /proc/sys/kernel/printk niedriger setzen:

$ cat /proc/sys/kernel/printk
4 4 1 7

Die erste Zahl gibt dabei den log Level an; 4 ist Standard.

Setzten kann man das temporär mittels:

echo "3" > /proc/sys/kernel/printk

oder in der Datei; /etc/sysctl.conf

kernel.printk = 3 4 1 3

Quelle: printk and console log level

Netzwerktyp für nicht erkannte Netzwerke ändern

Bei Netzwerken, die Windows nicht identifizieren kann (z.B: OpenVPN Netzwerken) werden diese dem Netzwerktyp "Öffentlich" zugeordnet und die Windows-Firewall macht alles dicht.

Über die Gruppenrichtlinien lässt sich dies aber ändern:

In der Computerverwaltung die „Lokale Sicherheitsrichtlinie“ (secpol.msc) öffnen. Im Bereich „Netzwerklisten-Manager-Richtlinien“ klickt man doppelt auf „Nicht identifizierte Netzwerke“. Im folgenden Dialog wählt man als „Standorttyp“ „Privat“ aus. Von nun an stuft Windows die nicht erkannten Netzwerke als privat ein und verwendet die passenden Sicherheitseinstellungen.

[stextbox id=“warning“ caption=“Achtung“]Bevor man mit dem Rechner auf Reisen geht und eventuell wirklich in fremde Netze kommt, sollte man die Einstellung in der „Lokalen Sicherheitsrichtlinie“ wieder auf „Nicht konfiguriert“ stellen.[/stextbox]

Quelle: ct [http://heise.de/-890519|Freigaben im „nicht identifizierten Netzwerk“]

icinga: Eigene Variablem im Web-interface anzeigen

Mittels sog.: "Custom Object Variables" kann man in nagios eigene Variablen erzeugen in der Form:

define host{
  host_name	linuxserver
  <b>_mac_address	00:06:5B:A6:AD:AA</b>	; <-- Custom MAC_ADDRESS variable
  <b>_rack_number	R32</b>		        ; <-- Custom RACK_NUMBER variable
  ...
}

Aber wie zeigt man diese dann auch im Web-Interface an?

Dies geht ganz einfach, indem man sie der notes-Option weiter gibt, z.B.:

define host {
  host_name web01
  display_name web01
  address 8.8.4.4
  _mac_address  00:21:9B:00:21:9B
  _sw_port_1    sw01_g3
  <b>notes $_HOSTMAC_ADDRESS$ $_HOSTSW_PORT_1$</b>
  hostgroups +webservers
  use web_servers
}

Quelle: serverfault: [http://serverfault.com/questions/233022/how-do-i-display-nagios-host-custom-variables-or-macros-in-the-web-interface|How do I Display Nagios Host Custom Variables or Macros in the Web Interface?]

apache: Authentifizierung wahlweise über IP oder HTTP-Auth

Bei sensiblen Web-Applikation wie die für das Verwalten des Mailservers (z.B. postfixadmin) oder welche die Zugriff auf die Datenbanken haben (z.B. phpmyadmin) sollte man sich nicht nur auf die Sicherheit der Applikation verlassen und stattdessen zusätzlich eine Authentifizierung über den Webserver (.htaccess) vornehmen.

Hierzu gibt es grundsätzlich zwei Möglichkeiten: Authentifizierung über die IP-Adresse und über eine HTTP-Passwortabfrage.

Doch während die erstere den Nachteil hat unflexibel zu sein (z.B. kein Zugriff mehr wenn man mal von einem Internet-Cafe dringend darauf zugreifen muss), müsste man bei zweitem immer zweimal einloggen: Einmal über die HTTP-Authentifizierung und einmal über die Web-Applikation selbst.

Doch zum Glück lassen sich diese zwei Mechanismen kombinieren, so dass man bei bekannten IPs ohne vorgängige Passwort-Abfrage direkt zum Web-Login kommt und bei „fremden“ IPs die Möglichkeit hat nach einer zusätzlichen HTTP-Authentifizierung die Web-Applikation zu erreichen.

Continue reading apache: Authentifizierung wahlweise über IP oder HTTP-Auth

roundcube: Login schlägt mit „Invalid server name“ fehl

Wenn man sich bei roundcube (0.8.4) anmelden will kommt die Meldung:

Invalid server name.

Dies scheint ein Bug in roundcube zu sein und passiert lustigerweise nur beim Zugriff mit Internet Explorer, wenn man in config/main.inc.php in der Variable $rcmail_config[‚default_host‘] mehrere Hosts konfiguriert-, aber einen oder mehrere davon auskommentiert hat.

Beispiel:
Dies würde zum o.g. Fehler führen:

$rcmail_config['default_host'] = array(
  'ssl://mail.example.org' => 'Default Server',
  /*'ssl://mail.example.org' => 'TEST Server'*/
);

Dies hingegen nicht:

$rcmail_config['default_host'] = array(
  'ssl://mail.example.org' => 'Default Server',
  'ssl://mail2.example.org' => 'TEST Server'
);

Die derzeitige Lösung ist deshalb, dass man keine "auskommentierten" hosts in der Konfiguration stehen hat.

Und falls man nur einen Server verwendet kann man diese Direktive nehmen:

$rcmail_config['default_host'] = 'ssl://mail.example.org';

Und falls man, wie ich die multi-host Variante zu Referenzzwecken im configfile haben möchte, schreibt man diese einfach unten separat hin:

$rcmail_config['default_host'] = 'ssl://mail.example.org';
// Enable this for multi-server configuration
#$rcmail_config['default_host'] = array(
#  'ssl://mail.example.org' => 'Default Server',
#  /*'ssl://mail2.example.org' => 'TEST Server'*/
#);

Edit: Das Problem wurde gerade mal wenige Minuten, nachdem ich den Bug eröffnet hatte bereits behoben!“ – So wünscht man sich Softwareentwicklung! (:wink:)

Perl-FTP bricht mit der Meldung: „Can’t use an undefined value as a symbol reference“ ab

Wenn man über das Perl-Modul Net::FTP ein file über FTP hochladen will bricht die Verbindung mit der message:

Can't use an undefined value as a symbol reference at /usr/share/perl5/Net/FTP/dataconn.pm line 54

ab.

So geschehen beispielsweise beim REOBack backup-script.
Das liegt daran, weil das Perl-Modul standardmässig Passive-FTP verwendet, mit dem manche Server Probleme haben können.

Um das Problem zu beheben, sucht man nach der Zeile:

Net::FTP->new($server, <i>[...]</i>

und fügt den Paramater "Passive => 0" an:

Net::FTP->new($server, Passive => 0, <i>[...]</i>

Quellen

Thunderbird zeigt mit sieve gefilterte Mails nicht an

Solange man den internen (lokalen) Filter von Thunderbird benutzt wird jedes neu eintreffende Mail nach der Sortierung im jeweiligen Verzeichnis angezeigt.

Filtert man nun jedoch auf dem Server mit sieve, bleibt dies aus und man sieht die neuen Mails erst, wenn man das Unterverzeichnis öffnet.

Dies lässt sich mit dem Parameter:

mail.server.default.check_all_folders_for_new

einstellen, welcher man auf true setzten muss. Ab dann werden die Verzeichnisse auch bei der sieve-Filterung sofort fett markiert und die Zahl der ungelesenen Mails darin angepasst.

Quellen:

mysql: Datenbank-Replikation einrichten

Mittels der mysql Datenbank-Replizierung kann man eine automatisch aktualisierende Kopie einer oder mehreren Datenbanken auf einem anderen Server haben.

Dies hat zwei grosse Vorteile:

  • Man hat eine failover-Datenbank, falls die Haupt-DB down ist
  • Man kann die SELECT Abfragen auf mehren Hosts verteilen und hat so einen Lastausgleich.

Grundsätzliches

mysql sieht vor, dass es einen sog. "Master" Server gibt auf dem die Datenbanken verwaltet werden und ein- oder mehrere "Slave"-Server die immer eine aktuelle Kopie tragen. Allerdings ist es normalerweise nicht möglich updates auch auf dem slave-server zu machen, d.H. die slave server sind eigentlich nur für LESE-, nicht aber für Schreibzugriffe da.

Die Funktionsweise geht so, dass der MASTER-Server sämtliche Anweisungen in ein sog. binlog (mysql-bin) schreibt und an die SLAVES sendet. Der SLAVE schliesslich entscheidet mittels des Parameters "replicate-do-db", welche Datenbanken er repliziert.

Konfiguration

Master

Zuerst setzen wir in der my.cnf des Master-Hosts die folgenden Optionen:

[mysqld]
max_allowed_packet              = 16M
server-id                       = 1
log-bin                         = mysql-bin
expire_logs_days                = 7
max_binlog_size                 = 100M
innodb_flush_log_at_trx_commit  = 1
sync_binlog                     = 1
auto_increment_increment        = 1
auto_increment_offset           = 1

Und startet diesen (neu).

[stextbox id=“note“ caption=“Hinweis: server-id“]Die server-id kann eine beliebige Zahl sein, sie muss aber bei jedem Server unterschiedlich sein.
Damit man also nicht ausversehen zwei hosts die gleiche server-id zuweist, nimmt man am besten dessen IP-Adresse, entfernt die Punkte und nimmt das als server-id.

Wenn also z.B. ein Server die IP-Adresse: 192.168.1.100 hat, dann wäre dessen server-id: 1921681100[/stextbox]

Nun wird ein Benutzer für den slave angelegt:

[root@MASTER ~]# mysql -uroot -p
mysql> GRANT REPLICATION SLAVE ON . TO 'slave'@'%' IDENTIFIED BY 'topsecret';

Slave

Auf dem slave müssen die folgenden Optionen gesetzt werden:

[mysqld]
server-id                       = 2
relay-log                       = mysqld-relay-bin
report-host                     = slave-server01
auto_increment_increment        = 2
auto_increment_offset           = 2
replicate-do-db                 = DB1
replicate-do-db                 = DB2
slave_max_allowed_packet        = 16M
read_only                       = 1

[stextbox id=“note“ caption=“Hinweise“]
auto_increment_increment und auto_increment_offset
Diese Parameter sollten idealerweise einen anderen Wert haben als alle anderen Server, da es sonst Probleme bei den AUTO-INCREMENT Werten geben könnte.

replicate-do-db
Hier wird angeben welche Datenbanken repliziert werden.
ACHTUNG: Für jede Datenbank muss zwingend eine neue Zeile verwendet werden! So etwas wie: „replicate-do-db = DB1, DB2“ würde nicht funktionieren!

slave_max_allowed_packet
Dieser Wert darf beim slave nicht kleiner sein als die Einstellung: read_buffer_size auf dem Server, sonst kann es zu Problemen kommen[/stextbox]

Nun kann man auch den slave starten.

Allerdings müssen nun zuerst die Initial-Daten auf den SLAVE geladen werden.
Dazu erstellen wir auf dem master ein mysqldump:

[root@MASTER ~] mysqldump -uroot -p --master-data --databases DB1 DB2 > slave.sql

Dieses slave.sql wird nun auf den SLAVE Server kopiert und eingespielt, nachdem zuvor die SLAVE-Replikation gestoppt wurde:

[root@SLAVE ~] mysql -uroot -p
mysql> SLAVE STOP;
mysql> quit
 
[root@SLAVE ~] mysql -uroot -p < slave.sql
[root@SLAVE ~] mysql -uroot -p
mysql> CHANGE MASTER TO MASTER_HOST='master-server', MASTER_USER='slave', MASTER_PASSWORD='topsecret';
mysql> SLAVE START;
mysql> SHOW SLAVE STATUS \G;
mysql> quit

Im SLAVE STAUS kann man nun sehen ob die Replikation läuft:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

[stextbox id=“note“ caption=“Slave-Replikation kaputt?“]Es kann ab und zu vorkommen, dass die Replikation auf den slave nicht mehr funktioniert.

Dann reicht es aber, den letzten Schritt (mysqldump auf master laden und auf slave einspielen) zu wiederholen und alles sollte wieder laufen.

Falls das nicht funktioniert muss man auf dem master vor dem dump die Tabellen locken:

[root@SLAVE ~] mysql -e 'slave stop;'
 
[root@MASTER ~] mysql -uroot -p
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS \G
mysql> SYSTEM mysqldump -uroot -p --master-data --databases DB1 DB2 > slave.sql
mysql> UNLOCK TABLES;
mysql> quit

Danach auf dem slave einfügen und MASTER_LOG_FILE / MASTER_LOG_POS mit den Werten aus der Ausgabe vom master füllen:

[root@SLAVE ~] mysql -uroot -p < slave.sql
[root@SLAVE ~] mysql -uroot -p
mysql> CHANGE MASTER TO MASTER_HOST='master-server', MASTER_USER='slave', MASTER_PASSWORD='topsecret', MASTER_LOG_FILE='mysql-bin.000000', MASTER_LOG_POS='00000000';
mysql> SLAVE START;
mysql> SHOW SLAVE STATUS \G
mysql> quit
[root@SLAVE ~] mysql -e 'show slave status\G'

[/stextbox]

Troubleshooting

Slaves klonen

Hat man mehrere slaves und einer fällt aus der Synchronisation (etwa weil ausersehenen auf den slave geschrieben wurde), kann man diesen von einem anderen klonen:

[root@SLAVE1 ~] systemctl stop mysql
[root@SLAVE1 ~] cp -pvR /var/lib/mysql /var/lib/mysql.bak
[root@SLAVE1 ~] rsync -ahv --delere slave2:/var/lib/mysql/ /var/lib/mysql/
[root@SLAVE1 ~] cp -v /var/lib/mysql.bak/data/auto.cnf /var/lib/mysql.bak/data/auto.cnf
[root@SLAVE1 ~] systemctl start mysql

[stextbox id=“warning“ caption=“Achtung gleiche UUID“]
Nebst der server_id, welche einen slave eindeutig kennzeichnet, generiert mysql noch eine UUID für jeden slave, welche in der Datei: auto.cnf im mysql Datenverzeichnis abgelegt wird.
Diese darf beim synchronisieren nicht mit kopiert-, bzw. muss danach entweder gelöscht (danngeneriert mysql eine neue) oder vom Backup rüber kopiert werden.
Ansonsten bekommt man die Meldung: „Slave I/O thread: Failed reading log event“.
[/stextbox]

Quellen

Drupal: Nach wechsel des File System Path werden Benutzerbilder nicht mehr angezeigt

Nachdem man bei Drupal den "File system path" unter admin/settings/file-system geändert hat und die Methode auf "private" hat, werden alle Benutzerbilder (avatare) nicht mehr angezeigt, obwohl der neue Pfad noch stimmt.

Stattdessen wird nach dem /system/files/ noch der Webroot angehängt, z.B.: /system/files/var/www/my_site/public_html/files/pictures/picture-123.jpg.

Dies passiert daher, weil in der Datenbank in der Tabelle "users" im Feld "picture" immer der volle Webroot Pfad steht, z.B. eben: "/system/files/var/www/my_site/public_html/files/pictures/picture-123.jpg". Und dieser wird dann zur Laufzeit mit dem, der unter "File system path" angegeben ist ersetzt. Unterscheidet sich dieser Pfad jedoch, funktioniert das ersetzen nicht mehr und Drupal passt den Pfad in der users Tabelle nicht automatisch an, wenn man den File System Pfad ändert.

Deshalb muss man dies noch manuell machen.
Wenn man also nun den File System Pfad von: /var/www/my_site/public_html/ nach: /srv/web/my_site/public_html/ wechselt, kann man in der users Tabelle das folgende SQL statement ausführen:

UPDATE users SET picture = REPLACE(picture,"/var/www/","/srv/web/")

Somit müssten dann die Benutzerbilder wieder korrekt angezeigt werden.

X-Applikationen ohne display aufrufen

Möchte man unter Linux eine grafische Applikation ohne grafische Benutzeroberfläche aufrufen (z.B. wenn man nur den Output in einem Script auswerten muss) geht dies mit: [http://en.wikipedia.org/wiki/Xvfb|Xvfb]. Xvfb ist ein x-server mit dem man "Virtuelle X-Konsolen erstellen- und mittels der DISPLAY variable grafische Programme darin ausführen kann.

Möchte man z.B: firefox so "verdeckt" aufrufen genügt das:

Xvfb :1 -screen 0 1024x768x24 &
export DISPLAY=:1
./firefox

Dies erstellt einen "virtuellen Bildschirm" mit einer Auflösung von 1024×768 und 24bit Farbtiefe und öffnet dann firefox darin.

Mittels zusätzlicher Optionen lassen sich übrigens auch Screenshots dieses "Bildschirms" anfertigen und so kann man das gut gebrauchen, um z.B. eine Webseite in mehreren Auflösungen zu testen. 🙂

Related Links