DNS-Konfiguration eines Intranets mit Subdomains

Im Zuge des (fiktiven) Projekts “Unser Intranet soll schöner werden”, habe ich mir mal Gedanken über die Konfiguration unseres DNS gemacht. Ich würde ganz gerne Subdomains verwenden, um die einzelnen Websites anzusprechen. Meine Lösung dazu sieht wie folgt aus:

  • Das Intranet und alle anderen Webseiten (Blogs, Galerie etc.) liegen auf einem Server, der beispielhaft WS1 (für Webserver) genannt wird und einen normalen A-Eintrag sowie den zugehörigen PTR-Eintrag im DNS hat. Seine IP-Adresse sei 10.0.0.1, die Domäne domain.
  • Nun möchte ich das Intranet in der URL-Leiste der Browser (u.a. um es für die Benutzer einfacher zu machen) nicht über http://ws1 erreichen, sondern über http://intranet. Dazu kann einfach ein CNAME-Eintrag intranet im DNS erzeugt werden, der auf WS1.domain zeigt.
  • Nun möchte ich wie gesagt, die einzelnen Webseiten über Subdomains der Form http://blogs.intranet erreichen. Lege ich einen CNAME-Eintrag blogs.intranet im DNS an (es handelt sich um einen Windows 2003-Server), wird automatisch eine Unterzone intranet angelegt, da der Punkt im Namen dies impliziert. Zunächst dachte ich auch, dass das so in Ordnung sei, stellte aber fest, dass Anfragen an blogs.intranet (z.B. via ping) recht lange dauerten. Das lag daran, dass der DNS-Server die Anfrage an externe DNS-Server weiterleitete. Warum? Nun, da ein Punkt im abgefragten Host enthalten war, interpretierte der Server den Teil nach dem Punkt als Domäne (intranet), die er logischerweise nicht auflösen konnte, da er für die Domäne domain zuständig ist. Somit leitete er die Anfrage weiter. Nachdem er jedoch auch von den externen DNS-Servern keine Auflösung erhielt, versuchte er, die eigene Domäne an den Hostnamen anzuhängen und löste ihn schließlich als blogs.intranet.domain auf. Das konnte dauern… und witzigerweise war das Intranet nicht erreichbar, als wir unsere Firewall umkonfigurierten, weil die externen DNS-Abfragen zu der Zeit nicht möglich waren.
  • Meine Lösung sieht nun wie folgt aus: Ich habe eine zusätzliche Domäne intranet neben domain im DNS konfiguriert und die einzelnen Subdomains als A-Einträge (z.B. blogs) in dieser angelegt, die logischerweise alle auf dieselbe IP-Adresse zeigen (die des Webservers). Dadurch löst der DNS-Server nun Anfragen an *.intranet selbst aus der neuen Domäne intranet auf. Die Anfragen an intranet selbst lasse ich dann mittels eines CNAME-Eintrags in der Domäne domain auflösen. Somit sind sowohl die URLs http://intranet (vom Server interpretiert als Host in domain) als auch http://blogs.intranet (interpretiert als Hosts in der Domäne intranet) erreichbar.

Hat jemand Vorschläge, wie es auch einfacher bzw. sauberer geht? Ich habe dazu wenig gefunden…

Insgesamt bin ich aber mit der Lösung sehr zufrieden, da die DNS-Auflösung nun nur noch intern vonstatten geht und die Antwortzeiten dementsprechend gut sind 🙂

Verteilen des Internet Explorer 7 im Netzwerk

Jaja, der IE7 ist schon ein tolles Produkt (Achtung: Ironie). Er hat sooo viele neue Funktionen (die viele Anwender überfordern) und lässt sich problemlos installieren (auf Standard-PCs ohne jede Fremdsoftware ;)).

Bei uns im Netz hat die Installation des IE7 per WSUS eigentlich ganz gut geklappt, wenn man von zwei Problemen absieht:

  1. Stockendes Scrollen: Beim Scrollen mit dem Mausrad hängt der IE7 irgendwie hinterher. Er scrollt munter in kleinen Schritten weiter, nachdem man das Rad schon längst wieder losgelassen hat. Und das kann man auch nicht anhalten.
  2. Beim Aufruf von Seiten, die Flash-Filme enthalten, stürzt der IE7 sofort ohne Fehlermeldung ab.

Die Lösung des ersten Problems war in unserem Fall die Neuinstallation der Maustreiber (Logitech). Danach scrollt der IE7 wieder normal.

Das zweite Problem bescherte uns eine Uralt-Version des Flash-Players, die wohl noch auf vielen PCs installiert war. Mit Hilfe der Uninstaller für Flash 6-8 konnten wir die Altlasten aber loswerden und direkt die Version 9 als ActiveX-Komponente installieren. Jetzt läuft auch alles…

Per Script prüfen, ob der Internet Explorer 7 installiert ist

Lange nichts mehr geschrieben, aber durch den Internet Explorer 7 habe ich doch tatsächlich Stress 🙂

Wir haben den nun per WSUS verteilt und es gibt (natürlich) Probleme. Wie sollte es auch anders sein? Nun denn, ich musste irgendwie rausbekommen, ob der IE7 auf bestimmten PCs korrekt installiert wurde, oder nicht. Dazu habe ich mir ein einfaches Script zusammengebastelt, angelehnt an ein Script aus dem Microsoft Script Center: List Internet Explorer File Version Information.

' some used variables dim arrPCs() dim SinglePC dim PClist dim counter, i, j ' text file containing computer names to be checked PCList = "PCList.txt" ' read computer names from text file set objFSO = CreateObject("Scripting.FileSystemObject") Set objListFile = objFSO.GetFile(PCList) counter = 0 if objListFile.Size <> 0 Then Set objListFile = nothing Set objListFile = objFSO.OpenTextFile(PCList, 1) counter = 0 Do While objListFile.AtEndOfStream <> True counter = counter + 1 redim preserve arrPCs(counter) line = trim(objListFile.Readline) arrPCs(counter) = line Loop objListFile.Close ' list file is empty else Set objListFile = nothing redim preserve arrPCs(0) end if for i = 1 to counter strComputer = ucase(arrPCs(i)) ' ping PCs Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._ ExecQuery("select * from Win32_PingStatus where address = '"_ & strComputer & "'") For Each objStatus in objPing ' PC doesn't respond If IsNull(objStatus.StatusCode) or objStatus.StatusCode <> 0 Then wscript.echo strComputer & ": PC doesn't respond to ping" ' PC responds Else Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & _ "\root\cimv2\Applications\MicrosoftIE") Set colIESettings = objWMIService.ExecQuery _ ("Select Version from MicrosoftIE_FileVersion Where File='iexplore.exe'") For Each strIESetting in colIESettings Wscript.Echo strComputer & ": IE Version on PC: " & strIESetting.Version Next End If Next Next

Das Script gibt lediglich für alle PCs/IP-Adressen in der Datei PCList.txt die Version des Internet Explorers an. Die Datei muss die PC-Namen oder IP-Adressen einfach mit einem Zeilenumbruch getrennt enthalten. Natürlich benötigt man Administratorrechte auf den abzufragenden Rechnern. Ausführen kann man es auf der Kommandozeile mittels cscript ie7.vbs (falls man die Datei so nennt ;))

Zum Download gibt’s das Script natürlich auch: ie7.txt

Entsorgung von alten CDs

Den ersten meiner aktuellen 5 Urlaubstage habe ich gestern dazu verwendet, mein Zimmer auszuräumen und mal wieder Platz zu schaffen. Den Berg mit alten CDs, den ich dabei entsorgt habe, konnte ich nicht ohne “Erinnerung” zur Mülldeponie fahren. Daher habe ich das Bild einmal festgehalten 🙂

Karton mit alten CDs Karton mit leeren CD-Hüllen Kartons mit leeren CD-Hüllen und CDs im Vergleich

Das dürften so an die 1000 CDs sein. Fast ausschließlich selbst gebrannt. Die haben sich im Laufe der Jahre so angesammelt. Ich glaube, die ältesten haben wir anno 1998 oder so mit einem geliehenen (!) SCSI-Brenner erstellt, als die Rohlinge noch über 10 DM kosteten (wohl gemerkt: pro Stück!). Jaja, das waren noch Zeiten, als das Brennen knapp eine Stunde gedauert hat, und fast jeder zweite der verdammt teuren Rohlinge fehlerhaft war… Wie gut, dass die Festplatten heutzutage so groß und komplette DVDs in 10 Minuten fertig sind 😉

Zur Entsorgung an sich: Die CDs können kostenlos abgegeben werden. Witzig war der Behälter bei der Deponie, der für CDs vorgesehen ist. Da passten ungefähr 20 CDs rein. Ich durfte meinen Karton dann einfach davor abstellen 😀 Aber die CD-Hüllen gelten (obwohl sie doch aus Plastik sind!?) als Restmüll, der bezahlt werden muss (8 Euro pro Kubikmeter). Mhh… naja, wenigstens habe ich jetzt wieder Platz.

Installation von swish-e unter SuSE 10.1

Heute habe ich mal die nette Suchmaschine swish-e für unser Intranet installiert, das auf einem OpenSuSE 10.1 64Bit Server läuft. Dazu habe ich zunächst einmal die Sourcen von der Website geladen und entpackt, sowie die Installation wie beschrieben durchgeführt:
./configure make make check make install

Als ich dann die Funktion von swish-e testen wollte (swish-e -V) kam folgende Meldung: swish-e: error while loading shared libraries: libswish-e.so.2: cannot open shared object file: No such file or directory. Nach einigem Suchen bin ich darauf gestoßen, dass das benötigte Modul nicht im library-include-Pfad liegen könnte und die Vermutung wurde mir duch ein Ausführen von strace swish-e bestätigt: Die Module wurden unter /usr/lib64/ und anderen Pfaden gesucht, aber nicht unter /usr/local/lib, wo sie lagen. Daher musste ich den Pfad mit den Modulen in die /etc/ld.so.conf eintragen und einmal ldconfig laufen lassen (via eyrie.org). Danach konnte ich swish-e ohne Probleme aufrufen.

Als erstes habe ich dann mal (wie in der Dokumentation beschrieben) das Apache Manual indexiert. Leider ging das nicht sofort, da folgende Meldung kam: Can't locate LWP/RobotUA.pm in @INC. Demnach fehlte also das Perl Modul LWP. Daher habe ich einmal cpan durchkonfiguriert (dafür musste ich zunächst ncftpget installieren) und konnte danach endlich loslegen 🙂

Ich habe mir dann mal die Suchseite als CGI eingerichtet, wie in der Anleitung beschrieben und ein wenig rumprobiert. Da wir mehrere verschiedene Teilbereiche im Intranet haben, habe ich zunächst überlegt, wie ich diese einzelnen Bereiche in einer Suche mit getrennten Index-Dateien integrieren kann. Das ist auch recht einfach über folgende Einstellung in der Konfigurationsdatei .swishcgi.conf machbar: swish_index => ['/srv/www/swish-e/seite1.index', '/srv/www/swish-e/seite2.index'],

Als ich dann voller Elan die erste Websuche gestartet hatte, fiel mir voller Erstaunen auf, dass die Suchergebnisse Umlaute nicht korrekt darstellten. Nach einer ausgiebigen Google-Suche wurde mein Verdacht bestätigt: swish-e kann nicht mit UTF-8-kodierten Webseiten umgehen. Nur leider sind in unserem Intranet alle Seiten in UTF-8 kodiert 🙁 Tja, da muss ich dann wohl mal die nächste Suchmaschine ausprobieren…

WordPress-Login via IP-address

Last week I took a closer look at WordPress to find out, whether I could use it as a multi-user blogging platform in my company. I had already tried LifeType, Drupal and WordPress Mu, but they all had their disadvantages (which I don’t want to explain at this point, but you may look here (German) if you are interested).

The only thing I needed, to make it as easy as possible for our employees to use the platform, was an automatic login via their IP-adresses. I use this way of authentication on some other sites on our intranet, too. I know, it is not a very secure way of authenticating your users, but as long as it is only a “free” blogging platform for all employees of the company, all I needed was the users to be logged in automatically, when they visit the site.

After searching the internet for some time, I found no plugin that fit my needs, so I decided to create one myself. However, WordPress’ API is very well documented and so after a short time, my plugin was finished.

Description

The plugin makes use of WordPress’ wp_usermeta-table, where you can store all kinds of information about your users. All you need to do is create a field named ipaddress, that contains the corresponding user’s IP-address.

I did this via PHP in our Windows-logon script, but you are free to come up with any other way of inserting the IP-address into the table 🙂 The only problem is, that you have to find out the user’s ID in wordpress. In my case this is easy because WordPress and Windows usernames are the same, so I can search the wp_users-table for the current Windows username and return the ID.

I think by using the plugin Userextra you could even be able to enter the IP address manually into the user’s profile…

An example SQL-statement (2 is the ID of the user that will be logged in, if IP 172.16.123.124 visits the site):
INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (50, 2, 'ipaddress', '172.16.123.124');

Of course you should not insert new rows into the table everytime an IP-address changes (use UPDATE instead).

Download / Source code

Konvertieren einer TYPO3-Installation zu UTF-8

Kürzlich bin ich mit unserem Intranet, das unter TYPO3 läuft, von einem Windows- auf einen Linux-Server umgezogen. Nun gab es einige Probleme mit dem Zeichensatz (Umlaute wurden nicht korrekt dargestellt etc.) und ich wollte die vorhandene Installation auf UTF-8 umstellen. Dazu habe ich bei typo3-media.com auch einen sehr guten Artikel gefunden.

Ich habe also u.a. zunächst einmal ein Dump der Datenbank gemacht, diese auf UTF-8 umgestellt und das Dump zurückgespielt. Aber leider standen die Umlaute etc. immer noch in “Reinform” (ä, ö usw.) in der Datenbank, also nicht als seltsame Zeichenkombinationen. Nunja, dann habe ich einfach mal TYPO3 auf UTF-8 umgestellt: im Template metaCharset = UTF-8 und renderCharset = UTF-8 eingestellt und im Install-Tool [BE][forceCharset] = utf-8. Aber wie zu erwarten war, wurden die Umlaute als Fragezeichen ausgegeben…

Abhilfe schuf ein kleines Script, das sämtliche Datenbankinhalte in UTF-8 konvertiert, indem es diese ausliest und mit PHPs utf8_encode() konvertiert. Das Script habe ich auf dopefreshtight.de entdeckt: Von ISO-8859-1 zu UTF8.

Ich musste das Script aber ein klein wenig anpassen, da die recht umfangreichen Tabellen von TYPO3 zu Speicherproblemen führten. Zum einen bei sehr vielen Datensätzen in einzelnen Tabellen und zum anderen bei umfangreichen Inhalten in einzelnen Datenfeldern. Es gibt nun auch die Namen der Tabellen und die Anzahl der Datensätze aus. Wenn man es auf der Kommandozeile ausführt, kann man somit recht gut verfolgen, wie weit der Fortschritt ist…

Alle Schritte, die nötig waren um die Installation auf UTF-8 umzustellen, habe ich auch noch einmal in mein Wiki eingetragen.

Download des überarbeiteten Scripts

Überarbeitetes DB Convert für TYPO3

Blog-Plattform zum Einsatz in Unternehmen gesucht

Du bist eine Multi-User-Blog-Plattform, die nicht wie WordPress Mu für jeden Benutzer eigene Tabellen anlegt? Du bist leicht erweiterbar und bietest eine gute Dokumentation deiner API? Du bietest einen größeren Leistungsumfang als LifeType und bist auch besser in ein Intranet integrierbar, da du zur Benutzerauthentifizierung nicht ausschließlich Sessions verwendest? Du bist einfach zu administrieren und bietest dennoch ein schickes Backend-Design?

Dann melde dich sofort bei mir! 😀

Ich bin nämlich auf der Suche nach einem (OpenSource-)Tool, mit dem ich die oben genannten Anforderungen umsetzen kann. Will heißen: Ich möchte eine Blog-Plattform im Unternehmen aufbauen, die für die Benutzer einfach (!) zu bedienen ist (kein extra Login, WYSIWYG-Editor etc.), aber dennoch einen gewissen Leistungsumfang aufweist. TYPO3 kann zwar alles (Achtung: eigene Meinung des Autors ;)), der Umgang damit ist aber für Normalsterbliche recht schwierig zu erlernen. Ich will TYPO3 sicherlich nicht als Hauptplattform unseres Intranets ablösen, dafür steckt zuviel Arbeit und Struktur darin, aber für die einzelnen Benutzer brauche ich was Einfacheres…

Auch ein Wiki ist schon fast zu kompliziert (siehe MediaWiki, das wir ja in der EDV einsetzen: Wiki-Markup muss erlernt werden und Struktur gibt es per sé erstmal keine). Außerdem “passen” die Inhalte, die ich mir vorstelle nicht so ganz in ein Wiki: Berichte/Protokolle über Besprechungen/Veranstaltungen etc.; Informationen/Neuigkeiten für die Mitarbeiter; Sonstige Informationen, die keiner definierten Struktur folgen.

In den letzten Tagen habe ich mir Drupal ein wenig angeschaut. Das scheint einiges an Potential zu bergen… Zumindest umfasst Drupal schonmal ein Forum (unser chc_forum soll nämlich so bald wie möglich abgelöst werden) und bietet einfache (!) Blogging-Funktionen. Der Benutzer kann mit 2 Klicks einen neuen Eintrag verfassen, nachdem er sich eingelogt hat. Und das kann ich mittels eines Moduls per IP-Adresse automatisch machen, sodass eine Passworteingabe komplett entfallen kann. Der Umfang an Erweiterungen und die sehr gut dokumentierte API haben es mir auch gleich angetan. Somit werde ich mich wohl bald noch etwas eingehender mit Drupal beschäftigen und meine Erkenntnisse hier niederlegen.

Ich kenne sogar jemanden, der Drupal für sein Blog einsetzt. Wieso habe ich das Teil nicht früher mal ausprobiert? Naja, habe ich! Aber als ich damals eine Ablösung für b2evolution gesucht habe gefiel mir WordPress einfach besser.

Entwicklung mit Design Patterns

Das aktuelle Buch, das auf meinem Nachttisch (oder besser gesagt darunter) liegt, ist Head First Design Patterns. Habe es schon zur Hälfte durch und das ging aufgrund der innovativen Schreibweise des Buches recht schnell. Die Autoren verfolgen nämlich mit der Head First-Serie den Ansatz, dass der Leser den Inhalt besser aufnehmen und vor allem behalten kann, wenn er interssant und abwechslungsreich beschrieben ist. Und diesen Ansatz setzen die Schreiber z.B. mit einem “Fireside Chat” zweier Entwurfsmuster um, die sich über ihre jeweiligen Vorzüge unterhalten, oder beschreiben die Vorgehensweise beim Zusammenschluss zweier Restaurants in “Objectville”. Dabei gilt es dann zunächst die unterschiedlichen Speisekarten zu kombinieren, natürlich mit Hilfe eines Entwurfsmusters (in diesem Fall des Iterators).

Da dieses Buch mein erstes zum Thema Entwurfsmuster ist, habe ich bewusst das Head First-Buch gewählt, weil ich wenig Lust auf trockene Definitionen habe. Damit muss ich mich nicht unbedingt in meiner Freizeit rumschlagen 😉 Und in dieser Hinsicht hält das Buch auch, was es verspricht: Langweilig wird es nicht. Und die Entwurfsmuster werden immer direkt an einem nachvollziehbaren Beispiel erklärt und sofort in (Java-)Code formuliert. Außerdem konzentrieren sich die Autoren auf die praktisch sinnvollsten Muster, sodass ich zwar nicht alle GoF-Muster kennenlernen werde, aber dafür diejenigen, die mir (nach Meinung der Autoren) am meisten für die “tägliche Programmierarbeit” bringen, umso intensiver. Ich habe jedenfalls schon beim Lesen einige Punkte in meinem C#-Projekt entdeckt, die ich überarbeiten werde, da ziemlich genau die im Buch beschriebenen Probleme auch bei mir eingetreten sind.

Mal was Witziges zwischendurch

Habe gerade rein zufällig auf YouTube zwei nette Videos gefunden. Beide sind aus der Late-Show mit David Letterman und zeigen jeweils eine Top-Ten-Liste. Das erste Video ist Top Ten Favorite George W. Bush Moments und zeigt die “besten” Momente von George W. Bush (passt ja gut zur aktuellen Situation in den USA :)). Das zweite zeigt die 10 besten Gründe, an denen man erkennen kann, dass man besessen von LOST ist (übrigens vorgetragen von “Hurley”): Top Ten Signs You’re Obsessed with ‘Lost’. Dabei fällt mir ein, dass ich mir heute dringend S03E06 anschauen muss 😀