SCM-Manager Repositories von Usern finden

Ich brauchte eine Übersicht aller Repositories, bei denen eine Gruppe von Usern direkt oder indirekt (über Gruppen) als Owner eingetragen waren.

Die User holte ich mir mit Powershell aus dem Active Directory:

$users = Get-AdGroup Hauptgruppe | Get-AdGroupMember -Recursive | Get-AdUser -Properties memberof

Die Gruppen, in der die User Mitglieder waren holte ich mir auf ähnliche Weise:

$users.memberof | Sort | Unique | Foreach-Object { $_ -Replace 'CN=(.+?),.+','$1' }

Damit hatte ich eine simple Liste aller User und ihrer Gruppen die ich als Textdatei abspeichern konnte.

Für den SCM-Manager gibt es einen Command Line client. Leider ist er inzwischen nicht so einfach zu finden, auch die Doku dazu ist extrem dürftig. Aktuell war er hier zu finden.

Die Usernames und die Gruppennamen speicherte ich in zwei Textdateien, dann erstellte ich noch ein Template für die Ausgabe von scm-cli-client anzupassen. Als Templates wird hier FreeMarker verwendet.

#!/bin/bash
SERVER=https://scm.example.com/scm/
USERNAME=admin
PASSWORD=GEHEIM
CLI="java -jar /opt/scm-cli-client-1.60-jar-with-dependencies.jar --server $SERVER --user $USERNAME --password $PASSWORD"
# Nutzt FreeMarker Templates https://www.vogella.com/tutorials/FreeMarker/article.html
REPOS=`$CLI list-repositories --template-file ./grouptemplate.tpl`
GROUPNAMES=$(<groupnames.txt)
USERNAMES=$(<usernames.txt)
for GROUPNAME in "$GROUPNAMES"; do
echo "$REPOS" |grep "$GROUPNAME"
done;
for USERNAME in "$USERNAMES"; do
echo "$REPOS" |grep "$USERNAME"
done;

Das Template das ich dafür erstellt habe sieht folgendermaßen aus:

<#list repositories as repository>${repository.name}<#if repository.permissions??> <#list repository.permissions as permission><#if permission.type?starts_with("OWNER")>${permission.name} </#if></#list>
</#if>
</#list>

Damit wird schlicht und einfach der Name des Repositorys ausgegeben, gefolgt von allen Ownern. Das lässt sich einfach mittels grep filtern. Die Ausgabe davon habe ich dann noch gefiltert um jedes Repository nur einmal zu bekommen, für den Fall das jemand sowohl über eine Gruppe als auch über seinen Username Rechte hat

./findrepos.sh | sort | uniq

Voilá, alle Repositories in denen die User direkt oder indirekt Owner-Rechte haben.

PHP Fehlerdiagnose

Bei PHP-Installationen ist meistens die Fehlerausgabe deaktiviert, was bei Produktivumgebungen in der Regel auch sinnvoll ist. Während der Entwicklung oder bei der Fehlerdiagnose ist das jedoch eher hinderlich.

error_reporting(E_ALL ^ E_NOTICE); // Alle Fehler ausser Hinweisen anzeigen
ini_set("display_errors", 1); // Fehler im Script selbst anzeigen

Wenn man die Fehler nicht ausgeben möchte (z.B. in einem Produktivsystem) kann man sie auch im Fehlerprotokoll des Webservers sehen.

Bei manchen Webspace Hostern hat man allerdings keine Möglichkeit auf das Fehlerprotokoll des Webservers zuzugreifen. Möchte man trotzdem PHP Fehlermeldungen sehen kann man das Log auf eine eigene Datei umbiegen:

ini_set("log_errors", 1); // Fehler ins Protokoll schreiben
ini_set("error_log", "/path/to/php_errorlog.log"); // Pfad zu eigenem Fehlerprotokoll setzen

Natürlich funktioniert das nur wenn der Hoster die Benutzung des ini_set Befehls erlaubt, einige Hoster verbieten das.

Verzögerung bei Spielen am Fernseher

Gestern Abend habe ich das erste Mal per PC am Fernseher etwas gespielt das präzise Reaktionen erfordert und dabei festgestellt dass es bei jedem Tastendruck am Gamepad ein leichtes Delay gab bis die Aktion zu sehen war. Auf Dauer etwas frustrierend. Daraufhin habe ich nahezu eine Stunde versucht herauszufinden woran es liegt: Andere Auflösung, weniger Details, VGA- statt Displayport/HDMI-Kabel, Entfernung vom Gamepad zum Funkempfänger, neue Batterien ins Gamepad, hat alles nichts gebracht. Irgendwann habe ich genervt aufgegeben und heute nochmal einen anderen PC probiert, der normalerweise nur als Mediacenter genutzt wird und immer daran angeschlossen ist. Gleiches Problem, wenn auch nicht ganz so stark ausgeprägt.

Verzögerung bei Spielen am Fernseher weiterlesen

Deutsches Datum in MySQL-Format konvertieren

Mit einem SQL-Einzeiler lassen sich Daten im deutschen Format in das MySQL DateTime-Format umschreiben.

UPDATE `table` SET `DateSQL`=STR_TO_DATE(`DateDeutsch`, "%d.%m.%Y");

Der zweite Parameter von STR_TO_DATE gibt dabei an in welchem Format das Datum im Feld DateDeutsch steht. %d steht für den Tag, %m für den Monat und %Y für das (4-stellige) Jahr.

Active Directory LDAP-Zugriffe mit mehreren Domain Controllern

Auch in einer Windows-Domänen Umgebung kommt man früher oder später darauf, dass es eine Anwendung gibt die nicht auf Windows und IIS, sondern auf einem Apache läuft, vielleicht mit PHP oder einer anderen Skriptsprache. Sowohl PHP als auch der Apache direkt bieten über LDAP die Möglichkeit einen Domain Controller abzufragen, Beispielsweise zur Authentifizierung.

Spätestens wenn ausgerechnet der Domain-Controller ausgefallen (oder wegen Wartungsarbeiten nicht erreichbar) ist, den die PHP-Scripte zur Authentifizierung benutzen, stellt sich die Frage wie man es einrichtet dass irgend ein verfügbarer Domain Controller genutzt wird. Glücklicherweise sind sowohl PHP als auch das Apache-Modul für diesen Fall vorbereitet, und nutzen sogar das gleiche Prinzip dafür. Man muss lediglich an der Stelle wo der Servername steht mehrere Adressen durch Leerzeichen getrennt eintragen.

PHP-Aufruf:

$conn = ldap_connect("dc01.domain.local dc02.domain.local");
ldap_bind($conn, $username, $password);

Eintrag in der Apache-Konfiguration:

AuthLDAPUrl "ldap://dc01.domain.local:3268 dc02.domain.local:3268/dc=domain,dc=local?sAMAccountName?sub?(objectClass=*)" STARTTLS

Hier muss man darauf achten dass der LDAP-String in Anführungszeichen steht (solange kein Leerzeichen vorkommt funktioniert es auch ohne).

Auf diese Art werden alle angegebenen Server durchprobiert bis einer gefunden wird der erreichbar ist.

Quellen: mod_auth_ldap Dokumentation, Kommentar in der PHP-Dokumentation zu ldap_connect()

Confluence Seite mit Unterseiten in anderen Space kopieren [Update]

Confluence bietet zwar die Möglichkeit einzelne Seiten in andere Spaces zu kopieren, aber dabei bleiben Anhänge und Unterseiten auf der Strecke. Mit dem Atlassian Command Line Interface lassen sich eine Menge netter Befehle auf der Kommandozeile ausführen, darunter auch dieser:

./confluence.sh -s https://server.local/confluence/ -u username -p secret \
-a copyPage --space currentSpace --title pageTitle --newSpace newSpace \
--parent newParentPage --descendents --copyAttachments --copyComments --copyLabels

Der Befehl verbindet sich mit dem Server und kopiert die Seite pageTitle im Space currentSpace mit all ihren Unterseiten, Dateianhängen und Kommentaren in den Space newSpace als Unterseite von newParentPage.

Die aktuelle Version des Command Line Interface kostet zwar mittlerweile Geld, die letzte freie Version (unter BSD Lizenz) ist jedoch immer noch zum Download verfügbar und kann auch schon eine ganze Menge.

Quelle: (The pain of) managing content in Confluence

Ergänzung 29.10.2012

Mit der hier beschriebenen Methode konnte ich die meisten Seiten migrieren, leider gab es in einem Punkt Probleme: Die Confluence Remote Schnittstelle kommt mit dem Upload von größeren Dateien nicht klar, die Grenze scheint irgendwo bei 5MB oder so zu liegen. Der Fehler ist bereits seit einem Jahr bekannt, hier hat sich jedoch noch nichts getan.

Dafür hat mich die Dokumentation von Confluence zum Löschen von Seiten auf eine Idee gebracht:

  • Seite aus dem alten Space in einen neuen, temporären Space 1 verschieben
  • temporären Space kopieren
  • Seite aus temporärem Space 1 zurück in den alten Space verschieben
  • Seite aus temporärem Space 2 in den Ziel-Space verschieben
  • beide temporäre Spaces löschen

Die Prozedur habe ich noch nicht getestet, ich sehe allerdings keinen Grund wieso es nicht funktionieren sollte.

Facebook-Anwendung blockieren [Update #5]

Vor kurzem ist mir aufgefallen dass ich keine Möglichkeit mehr habe Facebook-Anwendungen zu blockieren. Bisher konnte ich immer auf die Profilseite der Anwendung gehen, dort gab es links in der Spalte unten einen Link “Anwendung blockieren”. Das Blockieren der Anwendung hat den Vorteil dass ich keine Anfragen mehr dazu bekomme und dass ich den Zugriff des Programms auf Daten von mir verhindere, auch wenn Freunde die Anwendung nutzen. Neuerdings kommt man nicht mehr auf die Profilseiten, man wird direkt zur Anwendung weitergeleitet.

Im Dezember 2011 hat Facebook angekündigt dass ab Anfang Februar 2012 die Profilseiten eingestellt werden. Stattdessen kann jede Anwendung eine dazugehörige Seite anlegen, bei der dann zusätzliche Anwendungsspezifische Optionen vorhanden sind, darunter ein Link zur Anwendung und die Option zum Blockieren. Facebook-Anwendung blockieren [Update #5] weiterlesen

Remote Desktop mit mehreren Monitoren

Sucht man im Internet nach “remote desktop multiple monitors” findet man nahezu überall den gleichen Tipp:

mstsc /span

Startet man die Remotedesktopverbindung (wer schon immer mal wissen wollte wofür das steht: Microsoft Terminal Server Client) mit diesem Parameter, dann spannt sich der Remote Desktop über alle angeschlossenen Monitore. Dieser Aufruf hat jedoch den Nachteil, dass die komplette Fläche des Desktops vom Remote Computer als ein Monitor angesehen wird. Maximiert man ein Fenster, dann erstreckt es sich über beide Monitore. Natürlich gibt es Tools mit denen man sich hier behelfen kann, ich habe dafür bisher WinSplit Revolution genutzt, das ich ohnehin ständig benutze um die Fenster besser anordnen zu können.

Es geht aber seit Windows 7/2008 Server noch besser:

mstsc /multimon

So werden die einzelnen Monitore auch als solche an den Remote Computer weitergeleitet. Leider gibt es dieses Feature nur in den Enterprise- und Ultimate-Versionen von Windows 7 (danke an Kai für den Hinweis). Remote Desktop mit mehreren Monitoren weiterlesen

Textausgabe in Powershell unterdrücken

Da ich es immer wieder raussuchen muss: Es gibt in Powershell verschiedene Möglichkeiten die Ausgabe eines Befehls zu unterdrücken:

Befehl > $null
Befehl | Out-Null
$null = Befehl
[void] (Befehl)

Um die Ausgabe von mehreren Zeilen zu unterdrücken gibt es auch diese Möglichkeit:

$(
Befehl 1
...
Befehl n
) | Out-Null

Quelle: Thread in microsoft.public.windows.powershell.