Archiv der Kategorie: Software

Alles was mit Software zu tun hat

Windows RDP: „Die angeforderte Funktion wird nicht unterstützt“ (CredSSP)

Zugegeben, ich bin etwas spät dran, aber heute bin ich bei einer Stelle mit CredSSP und RDP dann auch mal auf die Schnauze gefallen. Da mir das – dank sonst gepflegter Infrastruktur – bisher nicht begegnet ist hier nochmal zum Nachlesen. Und mich als Gedächtnisstütze.

Vorgeschichte

Verursacher der ganzen Misere ist CredSSP, der Credential Security Support Provider. Dieses Windows-Modul ist unter Anderem für die Authentifizierung von Nutzern bei Verbindungen über RDP (Remote Desktop Protocol) und WinRM (Windows Remote Management) zuständig. Durch einen Fehler im Umgang mit den Sitzungen (CVE-2018-0886) können Angreifer einen Man-in-the-Middle-Angriff ausführen und so die bestehende Sitzung übernehmen. Da RDP und WinRM häufig für administrative Zwecke genutzt wird, können sich so Unbefugte ggf. weitrechende Zugriffe auf die verwalteten Systeme beschaffen. Betroffen ist so ziemlich alles – vom einfachen Windows 7 über die Server-Produkte bis hin zum aktuellen 10 sowie Server 2016.

Fixing

Microsoft hat den Fix in mehreren Stufen ausgerollt. Erstmals erschienen passende Updates im März, welche das Problem prinzipiell beheben. Sofern sie überall installiert werden. Zwei Monate später, im Mai, zog der Hersteller dann die Sicherheitsschrauben an: Ab diesem Patch ist die Nutzung der Mitigation zwingend erforderlich.

Wer nicht plant guckt in die Röhre

Wer seine Systeme im Griff hat wird nicht viel merken – ist alles auf einem aktuellen Patchstand wird man von den Umstellungen nichts merken. Anders sieht es aus, wenn man bei den Updates nachlässig handelt. Hat der eigene Rechner bereits aktuelle Patches installiert, das Zielsystem jedoch seit März keine Wartung erfahren, hat man Pech: Der RDP-Client bzw. WinRM verweigern die Verbindung mit dem Zielsystem. „Die angeforderte Funktion wird nicht unterstützt“. Selbes dürfte auch für die andere Richtung gelten.

Und nu?

Was folgt sind zwei Dinge: Erst mal sollte man dem Verantwortlichen Admin des Zielsystems eine Schulung zu IT-Sicherheit verpassen, denn inzwischen mehr als ein halbes Jahr lang keine Updates installieren ist – zumindest meiner Meinung nach – grob fahrlässig. Danach sollte das Zielsystem natürlich auf einen aktuellen Stand gebracht werden – für den Zugriff mindestens notwendig ist der entsprechende CredSSP-Patch, welcher sich auch einzel im dazugehörigen Artikel finden lässt. Da für den nur ein Dopelklick notwendig ist kann das ggf. auch ein Poweruser mit passenden Zugriffen vor Ort erledigen. Hat man keine Möglichkeit das System selbst zu verändern muss man am Client ran: Hier kann man über die Registry oder per GPO auch unsichere Verbindungen zulassen und somit eine Verbindung zu den betroffenen Zielen wieder ermöglich. Dies sollte immer nur temporär geschehen – umstellen, verbinden, Fix installieren und wieder zurück. Keinesfalls sollte man während die Lockerung aktiv ist Verbindungen zu anderen Systemen aufbauen.

Registry

Hierzu liegt man unter HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters ein neues REG_DWORD mit dem Namen „AllowEncryptionOracle“ an und gibt diesem den Wert „2„.

GPO

Das Pendant in GPO-Form findet sich unter Computerkonfiguration\Administrative Vorlagen\System\Delegierung von Anmeldeinformationen\Encryption Oracle Remediation. Diese muss aktiviert und die Schutzebene auf „Vulnerable“ eingestellt werden.

EOF

Patchmanagement etablieren. Systeme zeitnah Patchen. Spart Arbeit. Und Axteinsätze bein den zuständigen Systembetreuern.

Docker: Start mit aktivem IPv6 nicht möglich

Docker kann bei mir nach wie vor zwei Lager bedienen: Die Idee von Containern klingt gut, die mangelnde Stabilität und viele Konzepte der Implementierung lassen mich aber nur den Kopf schütteln. Heutiges Thema: IPv6. Prinzipiell nicht wirklich nutzbar, da die meisten Orchestration-Systeme wie Kubernetes oder Swarm bisher laut Doku und Bugtrackern bestenfalls rudimentäre Unterstützung bieten. Docker selbst soll – laut Anleitung – jedoch mit wenigen Handgriffen IPv6-fähig gemacht werden können.

Klingt einfach? Tja, nach einem Neustart ließ sich der Docker-Daemon nicht mehr starten. Im Log fand sich folgendes:

dockerd: Error starting daemon: Error initializing network controller: Error creating default "bridge" network: could not find an available, non-overlapping IPv6 address pool among the defaults to assign to the network

Die Abhilfe ist recht einfach: Ein festes Netz vergeben. Hierzu in der daemon.json einen passenden fixed-cidr-v6-Eintrag machen:

{
"ipv6": true,
"fixed-cidr-v6": "2a01:1234:5678:9abc:def0::/112"
}

VMWare vCenter Server Appliance mit Proxy aktualisieren

Die Aktualisierung einer VCSA ist eigentlich ja recht einfach: Man geht über den Port 5480 auf das Appliance-Management (aka MUI, VAMI), klickt auf Update und das drunterliegende Linux wird samt aller Programme auf den aktuellen Release aktualisiert. Die Programme kommen dabei direkt von den Updateservern – zumindest wenn man eine direkte Internetverbindung hat. Steht das System in einem Netz, welches keinen direkten Zugang bietet und nicht über einen transparenten Proxy verfügt, lässt die UI die nötige Konfiguration einfach erscheinen: Unter Netzwerk -> Verwalten findet sich ein Menüpunkt „Proxy-Einstellungen“, welcher die direkte Eingabe ermöglicht. Theoretisch.

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2018/01/vcsa.png

Die Praxis sieht leider anders aus: Dieses GUI-Element setzt lediglich die Umgebungsvariable http_proxy, welche ausschließlich für unverschlüsselte Verbindungen gültig ist. Da der Update-Download inzwischen per HTTPS läuft wird der Proxy praktisch ignoriert und der Download-Versuch läuft ins Leere. Dieses Problem tritt mindestens zwischen der Version 6.0 und der aktuellen 6.5U1 auf.

Zur Abhilfe muss man selbst Hand anlegen: In der Datei /etc/sysconfig/proxy findet sich neben der, von der GUI bereits gesetzten, Variable HTTP_PROXY auch ein passendes HTTPS_PROXY. Füllt man dies manuell aus ist der Update-Download fehlerfrei möglich. Wer vSAN einsetzt, sollte hier auch gleich noch die lokalen Server als Ausnahme definieren um den VMWare-Bug #2150523 zu umgehen.

Es zeigt sich wie so oft: Der Texteditor ist mächter als die Maus.

Danke an Andrew Richardson/VirtualSlices für das Aufklären des ursprünglichen Fehlers.

Keepass: Crash durch kaputte Mountpoints

Keepass ist ein quelloffener Passwortmanager, welcher Zugangsdaten verschlüsselt in einer Datei sammelt. Heute musste ich auf einem Gerät feststellen, dass sich die Software nicht mehr starten ließ: Der Passwortdialog erschien kurz, dann verschwand das ganze Programm vom Desktop. Über die Konsole ist ein absturz mit folgendem Trace zu erkennen:

Stacktrace:

  at <unknown> &lt;0xffffffff>
  at (wrapper managed-to-native) System.IO.MonoIO.FindFirstFile (string,string&,int&,int&) [0x00000]
  at System.IO.FileSystemEnumerableIterator`1<tsource_ref>.CommonInit () [0x0001d]
  at System.IO.FileSystemEnumerableIterator`1</tsource_ref><tsource_ref>..ctor (string,string,string,System.IO.SearchOption,System.IO.SearchResultHandler`1</tsource_ref><tsource_ref>,bool) [0x000d6]
  at System.IO.FileSystemEnumerableFactory.CreateFileNameIterator (string,string,string,bool,bool,System.IO.SearchOption,bool) [0x00009]
  at System.IO.Directory.InternalGetFileDirectoryNames (string,string,string,bool,bool,System.IO.SearchOption,bool) [0x00000]
  at System.IO.Directory.InternalGetFiles (string,string,System.IO.SearchOption) [0x00000]
  at System.IO.Directory.GetFiles (string,string) [0x0001c]
  at System.IO.DirectoryInfo.GetFiles (string) [0x0000e]
  at System.IO.DirectoryInfo.GetFiles (string,System.IO.SearchOption) [0x00009]
  at (wrapper remoting-invoke-with-check) System.IO.DirectoryInfo.GetFiles (string,System.IO.SearchOption) [0x00033]
  at KeePassLib.Utility.UrlUtil.GetFileInfos (System.IO.DirectoryInfo,string,System.IO.SearchOption) [0x00010]
  at KeePass.Forms.KeyPromptForm.AddKeyDriveSuggAsync (object) [0x0001c]
  at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (object) [0x00007]
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) [0x00071]
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) [0x00000]
  at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x00021]
  at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00074]
  at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000]
  at (wrapper runtime-invoke) <module>.runtime_invoke_bool (object,intptr,intptr,intptr) [0x0001e]
</module></tsource_ref></unknown>

Die Ursache ist etwas schwer zu finden, da nicht direkt ersichtlich: Netzwerkstörungen und Dateisysteme. Keepass durchsucht offenbar beim Start alle eingehangenen Partitionen, tritt hierbei ein Fehler auf kommt es zum Absturz. Dies betrifft nicht nur jene Speicherorte, auf denen Datenbank und ggf. Keyfile hinterlegt sind. In meinem Fall war durch einen Server-Neustart ein NFS-Mount abhanden gekommen (stale file handle), ähnliches war jedoch auch mit sshfs & co zu sehen. Eine Liste der aktuell genutzten Partitionen findet sich unter /etc/mtab, kaputte Dateisysteme lassen sich auch ohne Verbindung mit „umount -l“ oder „fusermount -u“ aushängen, hierbei kann jedoch möglicherweise Datenverlust entstehen, wenn noch Dinge im Schreibcache liegen. Nach Beseitigung des Fehlers lässt sich Keepass wieder regulär starten.

Firefox statt IE im Unternehmen – Deployment, Konfiguration und Co

In vielen Firmen gilt noch immer Microsoft Edge bzw. der Internet Explorer als Standardbrowser für Inter- und Intranet. Einer der wichtigsten Gründe ist die Verwaltbarkeit: Updates werden über die Systemfunktionen automatisch installiert, Eintellungen lassen sich komfortabel über Gruppenrichtlinien zuweisen. Was viele IT-Abteilungen nicht auf dem Schirm haben ist, dass es auch mit alternativen Browsern nicht vollkommen unmöglich ist eine solch zentrale Konfiguration einzurichten. Hier möchte ich ein paar Kniffe für den Einsatz von Firefox in größeren Installationen geben.

Deployment und Updates

Fangen wir kurz mit Deployment und Updates an: In vielen Firmen laufen Updates des IE über WSUS. Dieser ermöglicht es Aktualisierungen erst in einem Laborumfeld auf unerwünschte Nebenwirkungen zu testen und im Anschluss an die Clients zu verteilen. Prinzipitell gut, jedoch ist WSUS hauptsächlich für Microsoft-Produkte ausgelegt, wird vom Hersteller etwas stiefmütterlich behandelt und ist – zumindest nach meiner Erfahrung – nur mäßig zuverlässig. Nicht zuletzt weil nahezu kein Unternehmen ohne Drittanbietersoftware auskommt, wird in vielen Firmen ein weiteres Deployment-System wie z.B. SCCM oder das kostenfreie OPSI zum Einsatz. Über diese kann man auch Firefox recht schnell ausrollen. Hierzu benötigt man statt dem kleinen Stub-Installer, welcher für Windows üblicherweise ausgeliefert wird, den Offline-Installer, welcher z.B. auf der Sprachübersicht zu finden ist. Wer neue Funktionen gegen seltenere Wartung tauschen möchte kann alternativ auf den Extended Service Release“ (ESR) zurückgreifen. Hierbei handelt es sich um eine spezielle Version von Firefox, welche über einen längeren Zeitraum mit Sicherheitsaktualisierungen versorgt wird. Im Gegensatz zur Desktop-Version werden bei diesen Updates – soweit mögich – keine Funktionen verändert. Der Befehl für eine Silent-Installation lautet

Firefox Setup 55.0.3.exe /S

Achtung: Beim Download haben 32- und 64-Bit-Varianten aktuell, trotz unterschiedlichem Inhalt, den selben Dateinamen. Über den selben Weg kann man neuere Versionen zur Aktualisierung installieren. Möchte man die Software später wieder löschen findet sich im Installationsverzeichnis eine passende Datei

"%PROGRAMFILES%\Mozilla Firefox\uninstall\helper.exe" /S

Konfiguration

Bleibt die Konfiguration. Hier lässt sich ein Überbleibsel aus der Netscape-Zeit nutzen, welche die Ausführung von Scripten beim Start des Browsers erlaubt. Im ersten Schitt legt man eine neue Datei im Ordner „%PROGRAMFILES%\Mozilla Firefox\defaults\pref\“ an. Der Name kann frei gewählt werden, jedoch erfolgt die Ausführung alphabetisch. Als inoffizielle Konvention hat sich „autoconfig.js“ durchgesetzt. Erste Falle: Die erste Zeile. Diese wird automatisch übersprungen, dort hinterlegte Befehle also ignoriert. Als Workarround sollte man in dieser folglich besser einen Kommentar unterbringen. Zweite Falle: Zwar können in dieser Datei bereits Konfigurationen gesetzt werden, jedoch wird sie während des Browserstarts zu einem Zeitpunkt geladen, an dem noch nicht alle Subsysteme verfügbar sind. Um dies zu umgehen wird stattdessen ein Verweis auf eine weitere Konfiguration hinterlegt, welche am Ende des Starts geladen wird. In diesem Beispiel nenne ich diese „mycompany.js„. Standardmäßig sind diese nachgeladenen Dateien mir ROT13 (sic!) codiert um neugierige Blicke und Änderungen von Nutzerseite zu erschweren. Da Ersteres ohnehin auch über die Browserfunktionen möglich ist und sich Schreibzugriffe über die Berechtigungen des Dateisystems effektiver verhindern lassen, schalte ich diese Funktion aus, so sind Änderungen einfacher.

// File must start with a comment
pref("general.config.filename", "mycompany.js");
pref("general.config.obscure_value", 0);

Nun geht es daran die eigentliche Konfiguration zu erstellen. Die zuvor referenzierte „mycompany.js“ wird im Programmverzeichnis, also „%PROGRAMFILES%\Mozilla Firefox\„, erwartet. Für das Setzen von Konfigurationen stehen uns verschiedene Befehle zur Verfügung – hier die wichtigsten:

Befehle

pref()

So gesetzte Einstellungen sind identisch zu jenen, die der Nutzer in der GUI oder about:config vornimmt. Die Änderungen werden als „vom Benutzer eingestellt“ angezeigt. Benutzer können diese weiterhin ändern, da das Konfigurationsscript jedoch bei jedem Browserstart läuft werden die Änderungen nach dem Neustart des Browsers wider auf den vorgegebenen Wert zurückgesetzt.

defaultPref()

Hiermit wird die Standardeinstellung geändert. Der Nutzer hat auch hier die Möglichkeit diese selbstständig zu ändern, jedoch sind Benutzeranpassungen bei dieser Variante persistent und werden bei einem Neustart nicht automatisch zurückgesetzt.

lockPref()

Hiermit wird eine Einstellung gesetzt und gleichzeitig gesperrt. Sie kann im Anschluss nicht mehr vom Nutzer geändert werden, entsprechende Konfigurationsfelder werden ausgegraut.

unlockPref()

Hebt die Sperre wieder auf. Interessant wenn man z.B. mit einer globalen Konfiguration arbeitet, bestimmten Benutzergruppen jedoch Funktionen über eine weitere Konfigurationsdatei wieder freigeben möchte.

getPref()

Liest die Konfiguration – z.B. um ein „identisch zu X“ umzusetzen.

clearPref()

Löscht die Konfiguration

getenv()

Liest eine Umgebungsvariable

Wie am Namen zu erkennen handelt es sich um Javascript, man kann also auch eigene Logik einbringen. Auch hier nutze ich die erste Zeile zur Sicherheit als Kommentar. Die Bezeichnungen der Konfigurationsfelder kann man im Browser zu großen Teilen in about:config finden.

Beispiele

Automatische Updates ausschalten

Da Updates, wie oben erwähnt, über das zentrale Deployment laufen sollen, wird der Auto-Updater des Browsers ausgeschaltet. So wird der Nutzer nicht mit entsprechenden Aufforderungen konfrontiert und Änderungen können vor einem breiten Rollout in einer überwachten Umgebung auf Kompatibilität mit den Unternehmensanforderungen geprüft werden. Achtung: Einige der Updater-Einstellungen lassen sich nur mit lockPref() setzen.

	// Deaktiviert den Updater
	lockPref("app.update.enabled", false);

	// Stellt sicher dass er tatsächlich abgestellt ist
	lockPref("app.update.auto", false);
	lockPref("app.update.mode", 0);
	lockPref("app.update.service.enabled", false);

	// Deaktiviert die Kompatbilitätsprüfung der Add-ons
	clearPref("extensions.lastAppVersion");
	
	//Deaktiviert das 'plugin checking'
	lockPref("plugins.hide_infobar_for_outdated_plugin", true);
	clearPref("plugins.update.url");
	
	// Verhindert die Frage nach der Installation des Flash Plugins
	pref("plugins.notifyMissingFlash", false);

Branding und Telemetrie

Je nach Firmen-Policy kann ein Branding oder der Upload von Telemetrieinformationen an Mozilla unerwünscht sein.

	// Deaktiviert 'Kenne deine Rechte' beim ersten Start
	pref("browser.rights.3.shown", true);

	// Versteckt 'Was ist neu?' beim ersten Start nach jedem Update
	pref("browser.startup.homepage_override.mstone", "ignore");
	
	// Deaktiviert den 'health reporter'
	lockPref("datareporting.healthreport.service.enabled", false);

	// Disable all data upload (Telemetry and FHR)
	lockPref("datareporting.policy.dataSubmissionEnabled", false);

	// Deaktiviert den 'crash reporter'
	lockPref("toolkit.crashreporter.enabled", false);
	Components.classes["@mozilla.org/toolkit/crash-reporter;1"].getService(Components.interfaces.nsICrashReporter).submitReports = false;

Startseite

Wenn ein Intranet-Portal o.Ä. automatisch geladen werden soll kann dies als Startseite hinterlegt werden

	// Stellt eine Standart-Homepage ein
	pref("browser.startup.homepage", "https://portal.mycompany.local/");

Zertifikate

SSL-Zertifikate sind bei Drittbrowsern immer eine Qual. Statt den Systemzertifikatspeicher zu verwenden bringen die meisten Browser einen eigenen Zertifikatspeicher mit. Firmen, welche interne CAs verwenden müssen hier eine separate Konfiguration erzeugen und können sich nicht auf die Verteilung per GPO o.Ä. verlassen. Bei Firefox gibt es hier die Möglichkeit über certutil Zertifikate per Script zu importieren.
Bei neueren Installationen kann man Firefox jedoch instruieren auch Zertifikate zu akzeptieren, welche im Windows-Zertifikatspeicher hinterlegt sind.

	//Accept system certificates
	pref("security.enterprise_roots.enabled", true);

Proxy-Server

Verwendet die Firma einen Proxyserver, welcher nicht über den Router als „transparenter Proxy“ betrieben wird, kann dieser ebenfalls hier hinterlegt werden.

	//proxy
	defaultPref("network.proxy.type", 1);
	defaultPref("netword.proxy.ssl", "proxy.mycompany.local");
	defaultPref("netword.proxy.http", "proxy.mycompany.local");
	defaultPref("netword.proxy.ftp", "proxy.mycompany.local");
	defaultPref("netword.proxy.ssl_port", "3128");
	defaultPref("netword.proxy.http_port", "3128");
	defaultPref("netword.proxy.ftp_port", "3128");
	defaultPref("network.proxy.no_proxies_on", "localhost, 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, .mycompany.local");
	defaultPref("network.proxy.share_proxy_settings", true);

Lesezeichen

Das Erstellen von Lesezeichen ist etwas komplizierter, da man hier mit Datenbank und GUI interagieren muss, welche erst am Ende des Browserstarts zur Verfügung stehen. Um sicherzugehen, dass hier alle Module verfügbar sind, wird das Erstellen in eine eigene Funktion ausgelagert und mit einem Hook des Browsers verknüpft. Das Erstellen erfolgt über den nsINavBookmarksService. Dieser ermöglicht auch das Verwalten von Ordnern oder das Löschen von Elementen.

	var observer = {
		observe: function observe(subject, topic, data) {
			// DO BOOKMARKS WORK HERE
			var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
			var uri1 = ios.newURI("https://helpdesk.mycompany.local/", null, null);
			var uri2 = ios.newURI("https://nextcloud.mycompany.local/", null, null);
			var navBookmarksService = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Components.interfaces.nsINavBookmarksService);
			if (!navBookmarksService.isBookmarked(uri1)) {
				navBookmarksService.insertBookmark(navBookmarksService.toolbarFolder, uri1, navBookmarksService.DEFAULT_INDEX, "Helpdesk");
			}
			if (!navBookmarksService.isBookmarked(uri2)) {
				navBookmarksService.insertBookmark(navBookmarksService.toolbarFolder, uri2, navBookmarksService.DEFAULT_INDEX, "Nextcloud");
			}
		}
	}

	Components.utils.import("resource://gre/modules/Services.jsm");
	Services.obs.addObserver(observer, "distribution-customization-complete", false);

Alternativen

Wer weniger administriert und lieber herumklickt eine GUI der Textkonfiguration vorzieht kann einen Blick auf CCK2 werfen, welches die Konfiguration grafisch aufbereitet.

Linux: Gerät wacht nach Suspend sofort wieder auf

Narf. Akku leer. Nur warum?
Tja, mein Laptop hatte sich entschieden nach meinem Klick auf „Suspend“ sofort wieder aus dem Standby-Modus aufzuwachen. Reproduzierbar. Erste Vermutung: Die GUI ist Schuld. Wie immer. Aber auch ein systemctl suspend zeigt nicht wirklich eine Besserung. Auch die Logs zeigen nichts verwertbares. Na dann graben wir etwas tiefer:

Erst mal zur Klarstellung: Standby funktioniert – der Laptop schaltet die Geräte aus, die Power-LED blinkt wie erwartet, doch nach knapp einer Sekunde wacht wer direkt wieder auf. Entsprechend des Fehlers dürfte also die Aufwachquelle am ehesten Verantwortlich sein. Eine Liste aller Quellen findet sich in /proc/acpi/wakeup:

# cat /proc/acpi/wakeup
LID	  S4	*enabled  platform:PNP0C0D:00
SLPB	  S3	*enabled   platform:PNP0C0E:00
IGBE	  S4	*enabled   pci:0000:00:19.0
EXP2	  S4	*disabled  pci:0000:00:1c.1
XHCI	  S3	*enabled   pci:0000:00:14.0
EHC1	  S3	*enabled   pci:0000:00:1d.0

Die Liste sieht natürlich je nach Verbauter Hardware anders aus, hier die Zuordnung meines Gerätes:

LID -> Laptop-Deckel
SLPB/SBTN -> Standby-Button
IGBE -> Integrated Gigabit Ethernet
EXP2 -> ??
XHCI -> USB3
EHC1 -> USB(1/2)

Wie wir sehen können diverse Geräte ein Aufwachen verursachen, lediglich EXP2 ist nicht aktiv. Um das Ganze einzugrenzen heißt es also nun: Aufwachquelle abschalten, Suspend testen und hoffen, dass es was bringt. Über ein gezieltes echo kann der Zustand zwischen enabled und disabled gewechselt werden:

echo LID > /proc/acpi/wakeup

In meinem Fall stellte sich USB als Fehlerteufel heraus. Offenbar störte sich das System an einem USB-Stick – egal ob gemountet oder nicht. Wie auch immer, USB brauche ich ohnehin nicht zum aufwachen, Deckel und/oder Power-Button sollten ausreichen. Den „bösen“ USB schalte ich beim Boot per Script nun ab.

[Gentoo] Apache 2.4.26 + WordPress: Invalid post type

Hmk? After the latest system updates on Gentoo I noticed WordPress was no longer able to open any kind of post list („invalid post type“), edit posts (you do not have access to this kind of post) or create posts (form shown, but right sidebar missing). Not quite uncommon, but this time it was no broken plugin – I could reproduce the same behavior with several other WordPress instances with different versions – even a fresh install. That’s a new one.

After some probing around I’m fairly certain Apache 2.4.26 is the culprit, after downgrading to 2.4.25 the problem disappeared. All other downgrades like PHP 7.0.15 instead of PHP 7.0.19 didn’t show any effect. I yet have to confirm which combination ultimately triggers the error (FPM? Event-MPM?), but if you have similar errors: Here is your starting point…

Windows: Wo ist Java?

Ich bin von Linux ja irgendwie verwöhnt: Alle Binärdateien sind üblicherweise unter /usr/bin und lassen sich direkt über den Namen des Programms aufrufen. Unter Windows gibt es mit $PATH zwar eine ähnliche Funktion, jedoch ist dort meist nur der Systempfad eingetragen. Da es für fast jedes Programm ein eigenes Verzeichnis gibt hat man so keine direkte Möglichkeit ein Programm zu starten ohne an den Systemvariabeln herumzueditieren.

In vielen Fällen nicht wirklich ein Problem – einmal gefunden kann man den Pfad in seinen Scripten hinterlegen und so die Software ansprechen. Leider ist das bei Programmen wie Java nicht so einfach: Diese legen ein Verzeichnis mit der Versionsnummer an, z.B. C:\Program Files\Java\jre_8.0.121\bin\java.exe. Ergebnis: Nach jedem Update versteckt sich die gesuchte EXE an einer anderen Stelle.

Hier ein Quick&Dirty CMD, welches die Java-Binary aufspüren sollte. Nicht Ideal, da z.B. nur das Systemlaufwerk unterstützt wird und diverses Errorhandling fehlt, aber immerhin zuverlässiger als hardcoded…

REM Find Java :/
pushd "%ProgramFiles%\java\jre*\bin\"
echo %JAVADIR%cd > %TEMP%\findjava.txt
set /p JAVADIR=<%TEMP%\findjava.txt
del %TEMP%\findjava.txt
popd
%JAVADIR%\java -jar meinesoftware.jar

 

Thunderbird: Couldn’t load XPCOM

Diese Meldung weist erst mal darauf hin, dass die Installation beschädigt ist. Dies kommt häufig vor, wenn der Updater unterbrochen wird oder ein übereifriger Virenscanner genutzt wird. Eine Reparaturinstallation ist meist keine schlechte Idee – hierzu einfach die aktuelle Installation von der Webseite ohne vorherige Deinstallation ausführen. E-Mails und Einstellungen bleiben hierbei zu großen Teilen erhalten. Zeigt dies keine Wirkung kann auch ein Blick auf die Dateirechte nicht schaden – in meinem Fall war für den Ordner bzw. dessen Dateien das Execute-Recht verweigert.

Linux/Sane: Segfault mit Panasonic/Matsushita KVS-50xx-Scanner

Business as usual: Pünktlich zum Jahresanfang wird man von sämtlichen Vertragspartnern mit totem Baum zugeworfen. Glücklicherweise habe ich passende Scanner, die das Material in etwas besser verwaltbare Formen überführen können. Zuletzt verwendete ich dazu einen Panasonic/Matsushita KVS-5026, welchen ich aus dem Schrott retten konnte. Zwar habe ich noch einige schnellere Modelle, dieser hatte jedoch bisher die wenigsten Probleme mit Double-Feeding und ist durch die Bauform bei mir einfacher zu nutzen.

Leider war der Start dieses Jahr nicht ganz so erfolgreich – der Scanner wird korrekt erkannt, versuchte ich jedoch einen Scan zu starten gab es den allseits beliebten „Segmentation fault“. Boo.

Der Trick des letzten Problems half dieses mal leider nicht – auch die aktuelle GIT-Version zeigen den selben Fehler. Da es für das passende Backend kvs20xx keinen Maintainer gibt ist wohl auch keine Besserung zu erwarten.

OK, ich bin kein C-Programmierer, habe keine Ahnung von Debuggern unter X86 und produziere auch sonst eher nicht qualitätsorientieren Code – was kann schon schief gehen.

Ein paar Debug-Textausgaben später konnte ich den Fehler auf die Funktion sane_open, genauer die erste „echte“ Codezeile dort „for (i = 0; devlist[i]; i++)“ eingrenzen. Offenbar wurde früher durch sane automatisch ein Scan iniziiert und die devlist daher gefüllt. In der aktuellen Version scheint es beim Aufruf leer zu sein und mit NULL hantieren mag C wohl nicht. Als workaround konnte ich ein paar Zeilen des Fujitsu-Treibers ruberkopieren, welche die Inizialisierung ggf. nachholen. Auch diese musste etwas angepasst werden um mit dem direkten Aufruf umgehen zu können. Immerhin: Der Scanner läuft und ich kann weitermachen. Fein.

diff --git a/backend/kvs20xx.c b/backend/kvs20xx.c
index 955252a3..56095cb5 100644
--- a/backend/kvs20xx.c
+++ b/backend/kvs20xx.c
@@ -1,6 +1,8 @@
 /*
    Copyright (C) 2008, Panasonic Russia Ltd.
    Copyright (C) 2010, m. allan noah
+
+   Attn: Local workaround 2017-02-11 Florian Knodt, sane-kvs@adlerweb.info
 */
 /*
    Panasonic KV-S20xx USB-SCSI scanners.
@@ -141,6 +143,8 @@ sane_get_devices (const SANE_Device *** device_list,
       devlist = NULL;
     }
 
+  sanei_usb_init();
+
   for (curr_scan_dev = 0;
        curr_scan_dev < sizeof (known_devices) / sizeof (known_devices[0]);
        curr_scan_dev++)
@@ -156,7 +160,10 @@ sane_get_devices (const SANE_Device *** device_list,
 			       known_devices[curr_scan_dev].scanner.model,
 			       NULL, -1, -1, -1, -1, attach);
     }
-  *device_list = (const SANE_Device **) devlist;
+
+  if(device_list && devlist){
+      *device_list = (const SANE_Device **) devlist;
+  }
   return SANE_STATUS_GOOD;
 }
 
@@ -168,10 +175,22 @@ sane_open (SANE_String_Const devname, SANE_Handle * handle)
   struct scanner *s;
   SANE_Int h, bus;
   SANE_Status st;
+
+  if (devlist) {
+    DBG (DBG_INFO, "Using prepopulated device list\n");
+  }else{
+    DBG (DBG_INFO, "Device list empty - scanning...\n");
+    st = sane_get_devices(NULL,0);
+    if(st != SANE_STATUS_GOOD){
+      DBG (DBG_WARN, "Scan failed\n");
+      return st;
+    }
+  }
+
   for (i = 0; devlist[i]; i++)
     {
       if (!strcmp (devlist[i]->name, devname))
-	break;
+       break;
     }
   if (!devlist[i])
     return SANE_STATUS_INVAL;

 

Upstream: #315625