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

OpenVPN: Connect script failed

Wenn man bei OpenVPN, bzw. genauer gesagt dem OpenVPN-GUI nach dem Verbinden ein script ausführt, das manchmal etwas länger dauert, bekomme man die Fehlermeldung:

openvpn connect script failed. ( exit code =1)

oder auch:

Connect script failed. Timeout after 15 secs

Dieses Timeout kann man in der Registry hoch setzen. Dazu einfach im Schlüssel: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenVPN-GUI den Wert: connectscript_timeout vom Standard 15 entsprechend setzen, z.B.: auf 60.

Quellen

Linux an Active Direcory Domäne anmelden

Um sich bei einem Linux Server über das Actice Directory authentifizieren (anmelden) zu können gibt es mehrere Möglichkeiten.
Die populärsten sind kerbereos und winbind.
Hier wird erklärt, wie man sich mit winbind über ein AD-Login bei einem Linux Server anmelden kann:

Domäne konfigurieren

[stextbox id=“warning“ caption=“Achtung“]Damit das Active Directry login funktioniert, MUSS die Ausgabe von

hostname --fqdn

zwingend genau dem Domänen Namen der Windows Domäne entsprechen!
Das heisst, wenn das Clients im Active Directoy die Domäne: client.example.net haben, das Server Netz aber die Domäne: my-server.linux.example.net, wird das nicht funktionieren. Die Server, müssen dann auch den Hostnamen (fqdn) my-server.example.net haben!

Sollte der Server nicht bereits im DNS so eingetragen sein, muss der Eintrag in /etc/hosts erfolgen:

192.168.1.30 my-server.example.net my-server

[/stextbox]

Erstmal installieren wir die benötigten Komponenten:

yum install krb5-workstation pam_krb5 samba-winbind samba-winbind-clients

Nun müssen in der Datei /etc/resolv.conf die DNS-Server der Domaincontroller- und die Domain eingetragen werden:

nameserver 192.168.1.10
nameserver 192.168.1.20
search ad.example.net

Als nächstes kommt die Kerberos Konfiguration:

/etc/krb5.conf

[libdefaults]
        default_realm = AD.EXAMPLE.NET
        dns_lookup_realm = false
        dns_lookup_kdc = true

Danach noch die samba Konfiguration in /etc/samba/smb.conf anpassen, bzw. mit den folgenden Werten ergänzen:

[global]
workgroup                              = AD
realm                                  = AD.EXAMPLE.NET
security                               = ADS
winbind enum users                     = yes
winbind enum groups                    = yes
winbind use default domain             = no
winbind refresh tickets                = yes
template shell                         = /bin/bash
idmap config * : range                 = 10000 - 19999
idmap config AD : backend              = rid
idmap config AD : range                = 1000000 - 1999999

[stextbox id=“note“ caption=“Hinweis“]Obwohl wir die smb.conf geändert haben, muss sama (smb/nmb) NICHT gestartet werden.
Die smb.conf wird in diesem Falle nur vom winbind daemon gebraucht.[/stextbox]

Nun muss noch die Datei /etc/nsswitch.conf angepasst werden damit auf dem Server die AD Benutzer und Gruppen benutzt werden können.
Bei den zwei Einträgen „passwd“ und „group“ muss einfach noch „winbind“ angefügt werden:

passwd:         files winbind
group:          files winbind

Jetzt noch winbind als Autostart Konfigurieren:

systemctl enable winbind

Domäne Beitreten

Nun können wir der Domäne beitreten:

net ads join -Uadministrator

Und testen:

[root@my-server ~]# net ads testjoin
Join is OK

Danach winbind neu starten:

systemctl restart winbind

Und testen:

wbinfo -u
wbinfo -g
getent passwd 'AD\administrator'

sudo Erlaubnis für AD-Gruppenmitglieder

Nun geben wir den Leuten in der Gruppe Linux-Admin noch eine sudo-Berechtigung:

echo "%linux-admins ALL=(ALL) ALL" >> /etc/sudoers.d/ad

[stextbox id=“tip“ caption=“Gruppen mit Leerzeichen“]Haben hier AD Gruppen Leerzeichen (z.B. "Domain Admins"), so lässt sich dies konfigurieren, indem man die Leerzeichen escaped:

visudo -f /etc/sudoers.d/ad
User_Alias MYADMINS=%AD\\Domain\ Admins
MYADMINS        ALL=(ALL)       NOPASSWD: ALL

[/stextbox]

SSH login

Um SSH login zu ermöglichen muss die Datei: /etc/pam.d/password-auth-ac mit den folgenden Einträgen ergänz werden:

  • auth sufficient pam_winbind.so use_first_pass
  • account [default=bad success=ok user_unknown=ignore] pam_winbind.so
  • (OPTIONAL) account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.group.allowed
  • password sufficient pam_winbind.so use_authtok
  • (OPTIONAL) session optional pam_mkhomedir.so umask=0077

Das ganze sieht dann so aus:

#%PAM-1.0
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_winbind.so use_first_pass
auth        required      pam_deny.so
 
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_winbind.so
account     required      pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.group.allowed
account     required      pam_permit.so
 
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_winbind.so use_authtok
 
 
password    required      pam_deny.so
 
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     optional      pam_mkhomedir.so umask=0077
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

Mehrere Gruppen lassen sich mit den folgenden Änderungen zuweisen:

File erstellen, indem alle erlaubten Gruppen sind

/etc/login.group.allowed

root
AD\linux-admins

[stextbox id=“note“ caption=“Einschränkungen“]Es gibt allerdings die Einschränkung dass AD Gruppen keine Leerzeichen (spaces) haben dürfen.
Hat man nur Gruppen mit Leerzeichen (z.B. "Domain Admins"), dann muss man lokale Gruppen machen und die entsprechenden Leute manuell in diese Aufnehmen.[/stextbox]

Nun wird ein home Verzeichnis fürs ActiveDirectoy erstellt, um die Übersicht über lokale- und AD Logins zu behalten:

mkdir -v /home/AD

Testen

Nun kann das gnaze getestet werden:

tail -f /var/log/secure
$ ssh AD\\hmuster@my-server
AD\hmuster@my-server's password: 
Creating directory '/home/AD/hmuster'.
[AD\hmuster@my-server ~]$

Quellen

bash: Unlimittierte History

Möchte man in der bash eine unlimitierte Shell-History anlegen, reicht es, z.B. in /etc/profile die Variable HISTFILESIZE auf leer zu setzen.

Damit werden eingegebene Befehle in der Shell nie überschrieben und mit der Variable HISTSIZE kann man dann noch die Anzahl Befehle definieren, die jeweils in den Puffer geschrieben werden:

export HISTFILESIZE=""
export HISTSIZE=10000

Quellen

Die Annalen der Bash-Geschichte

apache: Umlaute werden nicht richtig dargestellt

Wenn beim apache Webserver Text oder HTML Dateien mit falschen Umlauten angezeigt werden, liegt dies meist an den Zeichensatz Einstellungen.

Mittels der [http://httpd.apache.org/docs/2.2/mod/core.html#adddefaultcharset|AddDefaultCharset]-Direktive kann ein Zeichensatz angegeben werden, der für alle Dateien gilt; dieser verändert jedoch die Standard-Einstellung des Browsers und führt so manchmal zu verkorksten Umlauten. Deshalb sollte diese Einstellung Standardmässig auf "Off" sein.
Bei RHEL/CentOS ist diese in der Standardeinstellung jedoch auf UTF-8, wahrscheinlich um Kompatibilität mit alten Scripts wo der Zeichensatz nicht definiert ist zu wahren.
Ist dies so, sollte die Einstellung in der httpd.conf erstmal auf "Off" gestellt werden.

Werden die Umlaute immer noch nicht korrekt dargestellt, kann man auf Verzeichnisebene (über .htaccess files) mit der Direktive "AddDefaultCharset" experimentieren.
Ebenfalls kann man mit der [http://httpd.apache.org/docs/2.2/en/mod/mod_mime.html#addcharset|AddCharset]-Direktive dies für einzelne Dateitypen (z.B. .txt) Einstellen.

[stextbox id=“tip“ caption=“Tip: httpd.conf Einstellungen überschreiben“]In der Zentralen httpd.conf des apache Webservers sollte so wenig wie möglich verändert werden um spätere upgrades nicht kompliziert zu machen.

Deshalb legt man am besten eine weitere Datei mit dem Namen: httpd-override.conf an und bindet diese mit der Include-Direktive am Schluss der httpd.conf ein:

Include conf/httpd-override.conf

Darin kann man dann die Standard-Einstellungen jeweils „überschreiben“.[/stextbox]

Quellen:

putty: Zeichensatz auf UTF-8 ändern

Heutzutage sind viele Systeme auf den universellen Zeichensatz UTF-8 eingestellt, so auch Linux.
Wenn man sich nun aber über putty mit SSH verbindet, wird man feststellen, dass die Umlaute, z.B. nei vi/vim oder ls nicht richtig dargestellt werden.

Schuld ist hier eine Einstellung in putty, die noch auf ISO-8859-1 eingestellt ist.

Ändern kann man dies in den putty Einstellungen über change settings -> Translation, wo der Zeichensatz auf UTF-8 umgestellt werden sollte.
Am besten macht man dies gleich auch für den "Default Settings" Eintrag, so dass neue hinzugefügte hosts automatisch diese Einstellung benutzen.

Quellen