Archive for the 'PHP' Category

Nagios Extended Notification Mail (für Icinga)

Die Notifications, die Icinga und Nagios von Haus aus mitbringen, habe ich schon seit einiger Zeit nicht mehr im Einsatz. Für einige Zeit, habe ich meine eigenen Notifications in der Konfiguration in Form eines sehr sehr langen CLI-Befehls gepflegt.

Auch von diesem Weg habe ich langsam genug. Deshalb habe ich mich nach einer anderen Lösung umgesehen und habe mit “Nagios Extended Notification Mail” von Otto Berger eine super Alternative gefunden.

Da das Script eigentlich für den Einsatz in einer Nagios-Umgebung vorgesehen ist, muss vor dem Einsatz mit Icinga eine kleine Änderung vorgenommen werden.

Und zwar muss in der Zeile 643 das Wort ‘NAGIOS_’

if (strpos($key, ‘NAGIOS_’) !== false) {

ersetzt werden durch ‘ICINGA_’

if (strpos($key, ‘ICINGA_’) !== false) {

danach sollt das Script einem schöne, sehr detailierte Statusbenachrichtigungen schicken.

Vielen Dank für diese tolle Arbeit!

[WordPress] Amazon Context Links Plugin

Vor einigen Tagen bin ich nach langer Zeit mal wieder auf das Amazon Partnernet gestoßen und habe gesehen, dass es mittlerweile das Context Links System auch für die deutschen Nutzer gibt. Ich wollte das natürlich gleich ausprobieren, bin allerdings kein Freund von Veränderungen am WordPress Core und wollte den JavaScript Code auch nicht in die Templates packen.

Deshalb meine ersten Gehversuche mit dem Pluginsystem von WordPress. Hierbei handelt es sich um mein erstes Plugin für WordPress, deshalb kann ich natürlich nicht ausschließen das es noch einige Fehler enthält. Aus diesem Grunde empfehle ich euch wenn möglich den Quellcode vorher zu überprüfen oder zu mindestens vorher ein Backup durchzuführen.

Wenn es jemand ausprobiert hat würde ich mich natürlich über etwas Feedback freuen :)

Funktionsumfang

Für den ersten Release des Plugins habe ich erstmal nur einige Einstellungsmöglichkeiten der Context Links eingebaut. Der Rest wird dann wenn es mir gelingt zusammen mit einer Vorschaufunktion wie der im Partnernet nachgereicht.

Bislang ist folgendes implementiert:

Amazon Context Links Plugin Options v0.1

Installation

Um das Context Links Plugin zu installieren muss nur die Datei context-links.php in euer Pluginverzeichnis kopiert werden.

wordpress/wp-content/plugins/

Anschließend sollte es im Pluginmanager zu sehen sein. Dort kann es kann de- bzw. aktiviert werden. Sobald das Plugin aktiviert ist lassen sich im Optionsmenü unter “Context Links” die Einstellungen vornehmen.

ToDo

  • Für jede Seite (de-) aktivierbar
  • vollständige Internationalisierung
  • Vorschaufunktion in den Optionen

Download

Active Directory: samaccounttype

Im Active Directory gibt es den Wert ‘samaccounttype’. Diesen hat jedes Account Objekt wie zum Beispiel Benutzer, Gruppen oder Computerobjekte. Anhand dieses Wertes kann man erkennen um was für einen Account es sich handelt. Angegeben ist dieser Wert in Form einer 9-10 stelligen Integerzahl.

Um damit etwas mehr anfangen zu können als mit einer 9-10 stelligen Zahl habe hier mal eine PHP-Funktion die das in halbwegs sinnvolle Namen umwandelt.

/*
* SAM Account Type in ein lesbares Format bringen
*/
function decode_samaccounttype($samaccounttype)
{
switch($samaccounttype) {
case “268435456″:
return “SAM_GROUP_OBJECT”;
break;
case “268435457″:
return “SAM_NON_SECURITY_GROUP_OBJECT”;
break;
case “536870912″:
return “SAM_ALIAS_OBJECT”;
break;
case “536870913″:
return “SAM_NON_SECURITY_ALIAS_OBJECT”;
break;
case “805306368″:
return “SAM_NORMAL_USER_ACCOUNT”;
break;
case “805306369″:
return “SAM_MACHINE_ACCOUNT”;
break;
case “805306370″:
return “SAM_TRUST_ACCOUNT”;
break;
case “1073741824″:
return “SAM_APP_BASIC_GROUP”;
break;
case “1073741825″:
return “SAM_APP_QUERY_GROUP”;
break;
case “2147483647″:
return “SAM_ACCOUNT_TYPE_MAX”;
break;

}
}

Ich hoffe damit sind alle Fälle die auftreten können abgedeckt. Als Vorlage habe ich einen Eintrag vom JSIFaq genommen.

Microsofts Timestamp

Nach langem Hin und Her habe ich endlich herausgefunden warum die Werte lastlogon und accountexpires im Active Directory sich mit der PHP Funktion date() nicht richtig darstellen lassen.

Und zwar hatte ich nicht bedacht das Microsoft eine eigene Art Timestamp verwendet (warum hat mich das nicht überrascht?). Dieser beginnt nicht wie der weit verbreitete Unix Timestamp am 1. Januar 1970 um 00:00 sondern am 1. Januar 1601 um 00:00 und wird nicht in Sekunden sondern in Nanosekunden angegeben.

Hier mal die Funktion mit der ich das Umrechne.

function ADStoUnixTime($adtime) {

/* von Nanosekunden auf Sekunden */
$secsAfterADEpoch = $adtime / (10000000);

/* (((Unix - ADS) * Tage pro Jahr) * Sekunden pro Tag) */
$ADToUnixConvertor=((1970-1601) * 365.242190) * 86400;

/* Unix Timestamp */
$unixtimestamp=intval($secsAfterADEpoch-$ADToUnixConvertor);

return $unixtimestamp;
}

Active Directory Zugriff via PHP

Im Rahmen eines kleinen Projekts habe ich mich mit dem Active Directory Zugriff via PHP beschäftigt. Es gibt zwar eine Menge Anleitungen doch man muss sich trotzdem noch ziemlich viel zusammensuchen. Um dies jetzt etwas zu vereinfachen habe ich eine simple PHP Klasse geschrieben die den Lesezugriff auf ein Windows 2003 Active Directory ermöglich.

Ich weiß nicht in wie weit das ganze auf einem Windows System läuft. Ich habe es auf einem Debian System mit Apache2 und PHP5-ldap im Einsatz.

class LDAP {

public $basedn = "dc=example,dc=local";

/* Verbindungsaufbau */
public function connect($server) {
$this->connectid = @ldap_connect($server);
$this->error($this->connectid);

ldap_set_option($this->connectid, LDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($this->connectid, LDAP_OPT_REFERRALS,0);
}

/* LDAP Binding */
public function bind($user,$password) {
$binding = @ldap_bind($this->connectid,$user,$password);
$this->error($binding);
}

/* Debug */
public function debug($enabled = false) {
if($enabled) {
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
}
}

/* Error Handling */
protected function error($result) {
if(!$result) {
print(“Error: “.ldap_error($this->connectid).” (“.ldap_errno($this->connectid).”)\r\n”);
}
}

/* Suchfunktion uebergeben wird der Filter String */
public function search($filter) {
$sr = @ldap_search($this->connectid,$this->basedn,$filter);
//$this->error($sr);
return $this->result($sr);
}

/* Result */
public function result($result) {
$ads_result = @ldap_get_entries($this->connectid,$result);
return $ads_result;
}

/* Beenden */
public function close() {
ldap_close($this->connectid);
}
}
?>

Um den Einsatz der Klasse zu erläutern hier ein kleines Anwendungsbeispiel. Man übergibt der Klasse einen LDAP Filter String und sie antwortet darauf mit einem Ergebnis in Form eines Arrays.

error_reporting( E_ALL | E_STRICT );

require("ldap.class.php");

$ldap_user = "exampleuser@example.local";
$ldap_pass = "password";

$ldap = new LDAP(); // LDAP Objekt erstellen

$ldap->debug(true); // Debug Modus aktivieren
$ldap->connect($server); // LDAP Verbindung aufbauen
$ldap->bind($ldap_user,$ldap_pass); // LDAP Binding

$filter = “(&(objectCategory=user)(cn=*))”; // LDAP Filterstring
$result = $ldap->search($filter); // LDAP Suche ausfuehren

print “

";
print_r($result);
print "

“;

$ldap->close(); // Verbindung trennen

?>

Ich wünsche viel Spaß damit, über Verbesserungsvorschläge und/oder Kritik würde ich mich sehr freuen.

Bundeswehr Dienstgradquiz

Ich habe mal ein kleines “Browsergame” geschrieben in dem man ein Rangabzeichen der Bundeswehr gezeigt bekommt und dann den dazu passenden Namen aus einer Liste auswählen muss. Ist nicht sonderlich aufwändig aber ist vllt. ganz gut geeignet für angehende GWDL um etwas zu trainieren :)

Zum Dienstgradquiz