Weave Sync und Reg Server Setup unter Debian Lenny

Update vom 16.4.: Der Artikel ist schon einigermaßen veraltet. Daher würd ich den nicht mehr so genau nehmen. Einige Anmerkungen und für einige Probleme haben engagierte Nutzer Kommentare geschrieben.

Wer wie ich mal einen Weave Sync Server unter Debian aufsetzen will, um einen eigenen Server zu haben mit dem das neue Firefox Sync Addon synchronisiert, dem wird die folgende Anleitung helfen.

Voraussetzung für die Anleitung ist ein installierter Apache2 mit mindestens php 5.1, php-json, php-mysql und eine MySQL Installation.

Zunächst hab ich in /var/www ein neues Verzeichnis erstellt und die Server (Sync und Reg Server heruntergeladen, beides entpackt und die Ordner umbenannt:

mkdir weave && cd weave
wget http://hg.mozilla.org/services/sync-server/archive/tip.tar.gz
wget http://hg.mozilla.org/services/reg-server/archive/tip.tar.gz
tar xfz tip.tar.gz
tar xfz tip.tar.gz.1
mv reg-server-828798f908a0/ reg-server
mv sync-server-55d5049f6eeb/ sync-server

Als nächstes hab ich erstmal einen neuen Vhost für den Apache angelegt und entsprechend der beiden Anleitungen (Sync und Reg) konfiguriert. Die sieht nun so aus:

<VirtualHost myserver.de:80>
        ServerName myserver.de
        Redirect / https://myserver.de
</VirtualHost>
<VirtualHost myserver.de:443>&lt;br />
        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/server-cert.pem
        SSLCertificateKeyFile /etc/apache2/ssl/server-key.pem
        ServerAdmin webmaster@myserver.de
        ServerName myserver.de
        DocumentRoot /var/www/weave
        Alias /1.0      /var/www/weave/sync-server/1.0/index.php
        Alias /user/1.0 /var/www/weave/reg-server/1.0/index.php
        Alias /user/1   /var/www/weave/reg-server/1.0/index.php
        Alias /misc/1.0/captcha_html    /var/www/weave/reg-server/1.0/captcha.php
        Alias /misc/1/captcha_html      /var/www/weave/reg-server/1.0/captcha.php
        Alias /weave-registration-static        /var/www/weave/reg-server/1.0/static
        Alias /weave-password-reset             /var/www/weave/reg-server/1.0/forgot_password.php
        CustomLog /var/log/apache2/weave/access.log combined
        ErrorLog /var/log/apache2/weave/error.log
        DirectoryIndex index.php index.html index.htm
        ServerSignature Off
        <Directory "/var/www/weave/">
                Options Indexes FollowSymLinks
                AllowOverride none
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

Anschließend muss eine neue Datenbank erstellt werden. Auf dieser muss dann der folgende SQL-Code ausgeführt werden, der die Tabellen erstellt:

CREATE TABLE `collections` (
  `userid` int(11) NOT NULL,
  `collectionid` smallint(6) NOT NULL,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY  (`userid`,`collectionid`),
  KEY `nameindex` (`userid`,`name`)
) ENGINE=InnoDB;
CREATE TABLE `wbo` (
  `username` int(11) NOT NULL,
  `collection` smallint(6) NOT NULL default '0',
  `id` varbinary(64) NOT NULL default '',
  `parentid` varbinary(64) default NULL,
  `predecessorid` varbinary(64) default NULL,
  `sortindex` int(11) default NULL,
  `modified` bigint(20) default NULL,
  `payload` longtext,
  `payload_size` int(11) default NULL,
  PRIMARY KEY  (`username`,`collection`,`id`),
  KEY `parentindex` (`username`,`collection`,`parentid`),
  KEY `modified` (`username`,`collection`,`modified`),
  KEY `weightindex` (`username`,`collection`,`sortindex`),
  KEY `predecessorindex` (`username`,`collection`,`predecessorid`),
  KEY `size_index` (`username`,`payload_size`)
) ENGINE=InnoDB;
create table users (
 id int(11) NOT NULL PRIMARY KEY auto_increment,
 username varchar(32),
 password_hash varbinary(128),
 email varbinary(64),
 status tinyint(4) default '1',
 alert text,
 reset varbinary(32) default null
) engine=InnoDB;

Schließlich müssen die beiden Server nur noch eingerichtet werden. Zunächst den Sync Server:

cd /var/www/weave/sync-server/1.0/
cp default_constants.php.dist default_constants.php

Anschließend wird die weave_constants.php bearbeitet. Direkt in der Zeile nach <?php werden die folgenden Zeilen eingefügt, die auf die eigenen Bedürfnisse angepasst werden müssen:

define('WEAVE_AUTH_ENGINE', 'mysql');
define('WEAVE_MYSQL_AUTH_HOST', '<db host>');
define('WEAVE_MYSQL_AUTH_DB', '<db name>');
define('WEAVE_MYSQL_AUTH_USER', '<db username>');
define('WEAVE_MYSQL_AUTH_PASS', '<db password>');
define('WEAVE_STORAGE_ENGINE', 'mysql');
define('WEAVE_MYSQL_STORE_READ_HOST', '<db host>');
define('WEAVE_MYSQL_STORE_READ_DB', '<db name>');
define('WEAVE_MYSQL_STORE_READ_USER', '<db username>');
define('WEAVE_MYSQL_STORE_READ_PASS', '<db password>');
define('WEAVE_MYSQL_STORE_WRITE_HOST', WEAVE_MYSQL_STORE_READ_HOST);
define('WEAVE_MYSQL_STORE_WRITE_DB', WEAVE_MYSQL_STORE_READ_DB);
define('WEAVE_MYSQL_STORE_WRITE_USER', WEAVE_MYSQL_STORE_READ_USER);
define('WEAVE_MYSQL_STORE_WRITE_PASS', WEAVE_MYSQL_STORE_READ_PASS);

Nachdem nun der Sync Server konfiguriert ist, muss der Reg Server noch konfiguriert werden.

cd /var/www/weave/reg-server/1.0/
cp weave_user_constants.php.dist weave_user_constants.php

Die kopierte weave_user_constants.php muss nun noch mit folgenden anzupassenden Zeilen nach dem Lizenzblock ergänzt werden:

# ***** END LICENSE BLOCK *****
define('WEAVE_AUTH_ENGINE', 'mysql');
define('WEAVE_MYSQL_AUTH_HOST', '<db host>');
define('WEAVE_MYSQL_AUTH_DB', '<db name>');
define('WEAVE_MYSQL_AUTH_USER', '<db username>');
define('WEAVE_MYSQL_AUTH_PASS', '<db password>');
define('WEAVE_SHA_SALT', '<hier einen langen, zufälligen salt eingeben; wichtig für sha256>');

Das war es eigentlich schon. Wenn ihr beim Einrichten des Plugins nun eure eigene URL https://myserver.de eingebt, solltet ihr euch einen Account erstellen können und mit dem Server synchronisieren können. Ich hatte leider noch ein Problem mit dem Sync Server.

Ich habe auf meinem Server nur die deutsche Locale installiert:

strubbl:~$ locale -a
C
de_DE.utf8
POSIX

Dadurch gab es einen Fehler. Dieser wurde in der Datei /var/www/sync-server/1.0/weave_user/mysql.php in Zeile 84 geworfen. Die Zeile 83 lautet:

if (setlocale(LC_CTYPE, "UTF8", "en_US.UTF-8") == false)

Wenn man die Locale en_US nicht installiert hat, einfach durch die ersetzen, die man hat. Bei mir ist das dann de_DE und die Zeile sieht wie folgt aus:

if (setlocale(LC_CTYPE, "UTF8", "de_DE.UTF-8") == false)

Wenn es endlich alles läuft, wird man auf die Webseite geleitet: First Run.

Richtet man einen zweiten PC mit dem Sync Account ein, wird man dann auf die Webseite geleitet: Second Run.

UPDATE

Der Bjoern hat das Tutorial vor kurzem gecheckt und einige kleine Anmerkungen gemacht. Ich hab z.Z. keinen eigenen Weave Server mehr am Laufen.

Juli 1, 2010 · 4 Minuten

Gource und Dokuwiki – Bearbeitungen visualisieren

In Anlehnung an den französischen Blogeintrag von Wolverine will ich hier einmal auf deutsch erklären, wie man die Änderungen aus einem Dokuwiki mit Gource unter Ubuntu visualisiert.

Zunächst installiert man, sofern noch nicht vorhanden, Gource:

sudo aptitude install gource

Anschließend muss das folgende Python-Script in eine Datei verfrachtet werden und ausführbar gemacht werden. Es dient dazu die *.changes$-Dateien vom Dokuwiki in ein für Gource lesbares Format zu bringen.

#!/usr/bin/python
"""
This program parse logs of a dokuwiki
and tranform them for gource (a log viewer)
http://code.google.com/p/gource/
developped by WolverineX02
site : http://wolverinex02.blogspot.com
"""
import os.path
import getopt
import sys
import re
def listdirectory2(path):
        """list all the files like *.changes, read them and output them in gource's log syntax
        """
        for root, dirs, files in os.walk(path):
                for i in files:
                        if (re.search('\.changes$', i)):
                                fichier = os.path.join(root, i)
                                myfile = open(fichier, 'r')
                                for line in myfile.readlines():
                                        mots = line.split()
                                        if len(mots)>=5:
                                                resultat = mots[0] + "|"
                                                resultat += mots[4] + "|"
                                                resultat += translate(mots[2]) + "|"
                                                resultat += fichier
                                                print resultat
                                        elif len(mots)==4:
                                                resultat = mots[0] + "|Anonymous|"
                                                resultat += translate(mots[2]) + "|"
                                                resultat += fichier
                                                print resultat
                                myfile.close()
def translate(mot):
        """translate the dokuwiki vocabulary to the gource one
        C -> A
        E -> M
        other -> M
        """
        if mot == "C":
                return "A"
        elif mot == "E":
                return "M"
        else:
                return "M"
def main(argv):
        """principal function
        """
        try:
                opts, args = getopt.getopt(argv, "hd:", ["help", "dokuwiki="])
        except getopt.GetoptError:
                usage()
                sys.exit(2)
        for opt, arg in opts:
                if opt in ("-h","--help"):
                        usage()
                        sys.exit()
                elif opt in ("-d","--dokuwiki"):
                        print listdirectory2(arg)
def usage():
        """this function will display how to use this script
        """
        print "This script will output change logs of a dokuwiki"
        print "in a friendly way for gource"
        print "how to use it :"
        print "python gourcedoku.py -d ~/Sites/MyDokuwiki/ | sort > dokusort.log"
        print "and then :"
        print "gource --log-format custom dokusort.log --stop-position 1.0 \ "
        print "--stop-on-idle --file-idle-time 10000000"
        print "---"
        print "-h : help "
        print "-d : meta directory of your dokuwiki"
#print listdirectory2(sys.argv[1])
if __name__ == "__main__":
        main(sys.argv[1:])

Nachdem man nun die Pythondatei (Bsp.name hier: doku2gource.py) hat, führt man folgenden Befehl aus:

python doku2gource.py -d ~/public_html/dokuwiki/ | sort > dokusort.log

Es ensteht die erwähnte für Gource brauchbare Logdatei. Diese wird nun wiederum an Gource weitergegeben und mit ffmpeg eine Videodatei erstellt:

gource --log-format custom dokusort.log --stop-position 1.0 --stop-on-idle --file-idle-time 10000000 --output-ppm-stream - | ffmpeg -y -b 3000K -r 60 -f image2pipe -vcodec ppm -i - -vcodec mpeg4 gource.mp4

Das wars schon. Hier noch mal die mir nützlichen Links:

http://wolverinex02.blogspot.com/2010/05/gource-et-dokuwiki.html

http://code.google.com/p/gource/wiki/Videos

Mai 15, 2010 · 2 Minuten

Clojure mit Netbeans unter Ubuntu installieren

Zunächst muss die Netbeans Java SE runtergeladen werden.

Nun wird die runtergeladene Datei ausgeführt:

strubbl:~$ sh netbeans-6.8-ml-javase-linux.sh Configuring the installer… Searching for JVM on the system… Extracting installation data… Running the installer wizard…

Der anschließend geöffnete Assistent führt einen dann bequem durch die Installation. Nach dem Beenden der Installation kann man dann Netbeans einfach starten:

strubbl:$ cd netbeans-6.8 strubbl:/netbeans-6.8$ ./bin/netbeans

Bei der Frage nach der Übernahme der Daten, die von einer Netbeans 6.7 Installation stammen, verneine ich, da ich mehrere Netbeans Installationen auf dem Rechner habe.

In Netbeans muss nun im Menü unter Tools > Plugins > Settings die Quelle für das Enclojure-Plugin hinzugefügt (Button Add) werden.

Als Name gebe ich einfach Enclojure ein und die URL lautet: http://www.enclojure.org/file/view/Autoupdate_Site.xml.gz

Nach dem Hinzufügen findet man in dem Tab Available Plugins nun Enclojure Clojure Plugin. Dies muss angehakt werden und anschließend wird auf Install geklickt, sodass das Plugin installiert wird (siehe folgendes Bild).

Damit das neu installierte Plugin aktiv wird, muss die IDE Netbeans neugestartet werden. Schließlich stellen wir nun noch unter Tools > Options > Clojure > Clojure Platforms die Clojure Version 1.1.0 als Standard ein:

Damit ist Clojure in Netbeans installiert und man kann nun neue Clojure-Projekte erstellen.

April 20, 2010 · 1 Minute

Authentifizierung für Dokuwiki am Woltlab Burning Board 3.1

Da ich die aktuelle Version “Lemming” eines Dokuwikis an meinem WBB-Forum authentifizieren lassen möchte, damit sich alle User, die bereits im Forum registriert sind, nicht noch einmal im Wiki registrieren müssen, habe ich meine Änderungen am Dokuwiki dokumentiert. Ich werde die Informationen, die dazu notwendig sind jedoch nicht hier pflegen, sondern im Dokuwiki an der entsprechenden Stelle, die hier wäre:

http://www.dokuwiki.org/auth:mysql_wbb

Ob diese Lösung auch für WBB-3.0 klappt, weiß ich nicht. Vielleicht kann das mal jemand testen und berichten.

Ich hoffe ich konnte noch jemanden damit helfen.

Update:

Umsetzung nun ohne Gefusche im Core. :) Thanks to Splitbrain.

April 2, 2010 · 1 Minute

Bash: Ändern von Strg+w…

… , sodass Teile eines Pfades gelöscht werden anstatt ganzer Wörter.

Wer gerne in der bash arbeitet und mit dem Tastenkürzel Strg+w komplette Wörter links des Cursors löscht, dem könnte der folgende Schmankerl gefallen.

set bind-tty-special-chars off
"\C-w": unix-filename-rubout

Diese beiden Zeilen müssen der inputrc hinzugefügt werden. Dazu kann entweder die systemweite (bei Debian z.B.) /etc/inputrc oder aber die benutzerspezifische ~/.inputrc genutzt werden.

Nun noch der Vorher-Nachher-Vergleich. Als Beispiel-Input nehme ich die folgende Zeile:

cd /home/strubbl/

Wenn man nun Strg+w vor der Änderung nutzt, wirkt es wie folgt:

cd 

Der komplette Pfad wurde gelöscht.

Mit der Änderung in der inputrc kann man nun auch Teile des Pfades löschen. Die einmalige Benutzung des Tastenkürzels bewirkt:

cd /home/

Wie praktisch, find ich!

Habe mich eben auch noch von frakturfreak aufklären lassen, dass es sich bei Strg+w und Strg+y um ein Konzept namens einen Kill-Ring handelt (, das vom Emacs stammt) – quasi eine Zwischenablage für Textpassagen darstellt. Nett!

Woher ich das habe? phrakture ist schuldig und zeigt auf seinen Git-Diff.

März 5, 2010 · 1 Minute