Froxlor, Sogo, Prosody und Letsencrypt vereinigt

Nachdem Squeeze LTS nun auch EOL ist, wurde es an der Zeit einen neuen Hostingserver aufzusetzen, der meine ganzen Internetservices vorhält. Diesmal wollte ich gleich anfangs alles schön integrieren, so dass keine Tweaks notwendig sind, um das Ganze zu pflegen. Ziel dabei war es, alle Dienste, die ein User zurVerfügung hat gegen die gleiche Datenbank authentifizieren, nämlich die Froxlor Mail_Users Table.

Um welche Dienste handelt es sich?

Für mich beinhaltet ein Standardsetup folgende Dienste:

  1. Mail ( IMAP, POP3, Sieve)
  2. Groupware mit Cal/CardDAV Support sowie Webfrontend mit Sogo
  3. Instant Messaging Account mit Prosody

1. Schritt Sogo

Sogo ist eine Groupware, bei der es sich um eine Weiterentlickung von OpenGroupware handelt. Ich setzte diese Goupware seit Jahren sehr zufriedenstellend ein, sie funktioniert einfach.

Nun bietet Sogo an, die Authentifizierung gegen LDAP oder SQL zu machen. Zudem wird auch der von mir in Froxlor eingesetzte Hashalgo SSHA512 unterstützt. Also einfach mal eine View gebaut, die die Daten für Sogo passend vorhält:

select `froxlor`.`mail_users`.`email` AS `c_uid`,
       `froxlor`.`mail_users`.`email` AS `c_name`,
       `froxlor`.`mail_users`.`password_enc` AS `c_password`,
       `froxlor`.`mail_users`.`email` AS `c_cn`,
       `froxlor`.`mail_users`.`email` AS `mail` 
       
       from `froxlor`.`mail_users` where (substr(`froxlor`.`mail_users`.`email`,(locate('@',`froxlor`.`mail_users`.`email`) + 1)) = 'example1.com')

Leider war dieser Versuch zum Scheitern verurteilt. Nach Durchschauen der Logs wurde auch schnell klar warum. Froxlor legt den Passworthash in einem Format ab, dass man in /etc/shadow vielleicht schon einmal gesehen hat und von dem ich mittlerweile weiss, das es sich um das  MCF  Format ( modular crypt format ) handelt.

Schaut man bei Sogo in die Docs findet man aber nur Erwähnung einer anderen Art den Hash abzulegen, nämlich am Anfang in geschweiften Klammern der Typ des Hashs und anschliesend der Hash selbst, salted und Base64 encoded.

Die Probleme gingen also los und ich bin erst einmal nicht wirklich weiter gekommen, da über die Details leider wieder sehr wenig Infos zu finden sind.

Ich habe dann mit kleinen Codestücken geschaut, wie ich das Ganze zusammenbekommen und letztendlich gab es nur die Lösung:

Das Passwort muss noch in einem anderen Format abgelegt werden

Dabei ist natürlich darauf zu achten, dass auch immer beide Felder beim Passwortwechsel aktualisiert werden. Hierzu bin ich durch die Froxlor Sources durchgegegangen, um herauszufinden  das die Datei customer_email.php den relevanten Code enthält. Ich habe mir jetzt zunutze gemacht, dass Froxlor die Option anbietet, dass Passwort in Klartext abzulegen. Diese Option hat durchaus seine Berechtigung, Klartext ist allerdings für mich ein NoGo, also war es deaktiviert.

Damit ich nun meinen Passworthash dort ablegen kann, habe ich die Sourcen gepatched:

root@master:~/src/Froxlor# diff customer_email.php /var/www/froxlor/customer_email.php 
457a458,459
> $ssha512_salt = substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
> $password_ssha512b64 = "{SSHA512.b64}" . base64_encode(hash('sha512', $password . $ssha512_salt, true) . $ssha512_salt);
484c486
< if (Settings::Get('system.mailpwcleartext') == '1') { $params["password"] = $password; } --- > if (Settings::Get('system.mailpwcleartext') == '1') { $params["password"] = $password_ssha512b64; }
646a649,650
> $ssha512_salt = substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
> $password_ssha512b64 = "{SSHA512.b64}" . base64_encode(hash('sha512', $password . $ssha512_salt, true) . $ssha512_salt);
658c662
< if (Settings::Get('system.mailpwcleartext') == '1') { $params["password"] = $password; } --- > if (Settings::Get('system.mailpwcleartext') == '1') { $params["password"] = $password_ssha512b64; }

Ist in Froxlor nun die Klartextpasswortablage aktiviert, wird in das Feld „password“ nun das Passwort  in meinem gewünschten Format abgelegt. Hier mal ein Beispielhash:

{SSHA512.b64}fuN89Rh0/H1we4Qf18+QAB9hFIndPsGykagJ8Zs8Dk3UXsN2ia3Fv/lwlAg3QfWS6qjW/LFmoHu/KIth4Mvl12FHai94S3pHRlQxTXFEXm0=

In diesem Hashformat hat Sogo keinerlei Probleme die Authentifizierung auszuführen, so dass dann mit folgender Domainkonfiguration und der Anpassung der View ( password anstatt password_enc und natürlich eine View pro Domain) Sogo bereits fertig integriert ist:

  domains = {
      example1.com = {
          SOGoMailDomain = example1.com;
          SOGoUserSources = (
                {
                  type = sql;
                  id = example1;
                  viewURL = "mysql://froxlor:PASSWORD@localhost:3306/froxlor/sogo_example1_view";
                  canAuthenticate = YES;
                  isAddressBook = NO;
                  userPasswordAlgorithm = "ssha512.b64";
                }
          );
      };
      example2.com = {
              SOGoMailDomain = example2.com;
              SOGoUserSources = (
                   {
                     type = sql;
                     id = example2;
                     viewURL = "mysql://froxlor:PASSWORD@localhost:3306/froxlor/sogo_example2_view";
                     canAuthenticate = YES;
                     isAddressBook = NO;
                     userPasswordAlgorithm = "ssha512.b64";
                   }
              );
      };
  };

2. Schritt Prosody

Auch hier besteht die Schwierigkeit darin zu wissen, was eigentich gemacht wird. Es gibt bereits ein Plugin, um gegen ein Klartextpasswort in SQL zu authentifizieren. Leider habe ich keine Doku dazu gefunden, wie denn solch ein Plugin genau definiert ist und wie die Schnittstellen sind. Zudem das Ganze noch in Lua, mein erster Kontakt mit der Sprache abgesehen vom Editieren der Prosody Config :-).
Letztendlich habe ich die Lösung durch probieren und anschauen einiger anderer Auth Plugins erreicht. Folgende Plugins haben mir geholfen:

Man findet die Auth Plugins hier

Mein erstes Problem war natürlich Lua, das ich bisher keine Ahnung von der Sprache hatte und meine Goto Scriptingsprache Python ist. Ist man das „batteries included“ gewöhnt, schaut man als erstes mal, was die Standardbibliothek einem so als Lösungsansatz bietet. Da ist man bei Lua erst einmal aufgeschmissen, zumindest ich, der vielleicht noch nicht weiss, wo die guten Infos zu finden sind.

Beim Suchen der von mir benötigten Funktionen – Base64 Encode/Decode, SHA2 Hash – bin ich schlieslich auf  luarocks gestossen.

luarocks install sha2

Bringt mir den nötigen Hashalgo.
Im LuaUsers Wiki habe die Base64 Funktionen gefunden.

Mit allen benötigten Funktionen ging es daran, meine Teile so zusammen zu pasten, dass es am Ende funktioniert. Dafür habe ich ein kleines Luascript geschieben und solange rumprobiert, bis ich mit dem gleichen Salt, gleiche Hashes in PHP und Lua generieren konnte.

Hier mal die entscheidenden Codefragmente:

local function SHA512b64HashPassword(plaintext, salt)
	local hash = '{SSHA512.b64}'..enc(sha2.sha512(plaintext..salt)..salt);
	log("debug", "Hash: %s", hash);
	return hash;
end
local function SHA512b64CheckHash(password, hash)
	local salt = string.sub(dec(string.sub(hash,13)),65)
        local phash = tostring(SHA512b64HashPassword(password,salt));
        log("debug", "*****Phash: %s", phash);
	log("debug", "*****Hash: %s", ahash);
        log("debug", "Salt: %s", salt);
        if hash == phash then
		log("debug", "Auth successfull");
		return true;
	else
                log("debug", "Auth failed");
                return false;
	end;

end

Letzendlich habe ich daraus dann ein eigens Prosody Auth Modul gemacht, mod_auth_sqlsha2. Es funktioniert bereits, ich muss aber auf jeden Fall noch einmal abchecken, wie saubere Fehlerbehandlung in Lua funktioniert. Zudem ist momentan nur die Authentifizierung umgesetzt, da ich aus dem SASL interface nicht wirklich schlau geworden bin.

3. Letsencrypt

Dieser Teil ist noch nicht vollständig integriert, da erst die nächste Froxlorversion eine Integration mitbringt. Das LEtsencrypt Tool bringt ja verschiedene Plugins mit und Ziel ist es natürlich, neue Zertifikate ohne Herunterfahren des Webservers hinzubekommen.
Dazu gibt es einen sehr interessanten Ansatz, dass Webroot Plugin zu benutzen und dann in jedem Vhost einen Alias zu setzen: Using Free SSL/TLS Certificates from Let’s Encrypt with NGINX

Firefox Sync 1.5: Added complexity without merit

Hello my reader(s),

For some time now I’m regularly checking the progress of the Firefox Docs about the new Sync 1.5, located at „Run your Sync-1.5 Server“ and „Run your own Firefox Account Server“.

The Sync Server setup is quite easy, it’s the Accounts server where it get’s difficult especially because the Docs are bad and haven’t progressed for a long time.

I’m starting to ask myself „why are you still using Firefox?“, because on the performance side Firefox did not progress, my impression is quite the opposite, my experience got worth.

So what has been my reason to use Firefox?

Quite right, it was the Sync 1.1 feature that allowed me to sync my settings over all my devices using a self hosted service. When Mozilla anounced to introduce a new system I thought that as long as I’m still able to self host and the new system brings in more flexibility no reason to not use it.

So I headed over to the Docs and started setting up a self hosted server. As long as I was dealing with only the Sync server, no problems. But I’m not willing to use the Mozilla Accounts server, I want to use a completly self hosted service. So I read the Accounts server Docs to find out that it is based on the brand new kid on the block nodejs.

What?

Yes so now you have to run not only a python service but another couple of nodejs services which all interact somehow and of course depending on your base OS, you’ll have to introduce some extra repos to fullfill the npm dependencies. I know that one should always use the best tool for the job and many projects use more then just one language. But why on earth has Mozilla made such a mess out of it’s once perfect feature?

The latest maybe promising setup docs can be found at FXA-Self-Hosting using docker images to offer the needed services.

The result will be 9, yes say it again 9 docker images running services that all interact and of course the HTTP ports need to be free on the host so that the nginx docker image can take the ports. Does that sound like a security improvement to the old Sync protocol?

Not in my view. I believe security is strongly related to using the KISS principle. Just the fact that I’ve 9 services running and no good Docs how the whole stack interacts is a recipe to building something inherently unsecure.

I’ll start playing around with the docker setup, maybe I’ll get some more insights how the whole stack is working, but I’m totally unsatisfied with the Mozilla performance, not being able to work on the Docs for more then 2 years.

So why on earth do more and more organisations leave the RFC way of creating a Spec ( produce code that does the job and progress with it ) and use a more enterprise style approach that has brought us already some nice beasts like the OpenXML Spec or  Oauth 2.0?

My explanation is quite simple: „If Oracle, SAP and  Citrix can do it and earn big money, we should follow“ :-).

Just create a product with that much complexity that nobody will be able to handle it, and of course make sure that the official admin docs aren’t worth the papper printed on and you’ve created a „opportunity“ for big bucks.

Has anybody already tried setting up Citrix or Oracle with the official Docs?

It’s a journey that will lead to frustration, so you think okay let’s get some proffessional help. You’ll be realizing that professional help is about earning money, not setting up a solution most of the time. The big bucks are only for one reason, to save the managers job as he can point to someone for the failure: „I’ve decided to use the leader in that domain, that decision can’t be wrong“.

Okay I’ll stop here cause I wanted to document my progress with Firefox Sync 1.5 and have to realize that I’m more and more into a rant.

Regards

Marc

Proxmox 2.1 Remote mit TigerVNC

Zur Zeit migriere ich eine VmWARE ESXi 4 Infrastruktur mit 2 Servern Richtung KVM. Als Management-Tool habe ich mit Proxmox rausgeschaut, dass auf einem Testserver bereits seit Version 1.9 stabil läuft.

Das Zugreifen auf eine VM über Remote Tools ist  ein „Must Have“. Folgendes Szenario erfordert es:

In einer VM wird eine VPN Verbindung konfiguriert, die den Defaultgateway in das verbundene Netzwerk verlegt. Sobald die VPN-Verbindung also offen ist, kann auf die Maschine nicht mehr mit RDP zugegriffen werden, es geht nur noch über die vom VM-Host angebotenen Remote-Tools.

Proxmox benutzt hierfür ein Java-VNC-Applet, was auch gut funktioniert. Nur ist es jetzt so, dass das Javaplugin mittlerweile von vielen als Sicherheitsrisiko angesehen wird und somit nicht zur Verfügung steht. Also musste eine Lösung gefunden werden, direkt mit einem VNC-Viewer eine Verbindung aufbauen zu können.

Als erstes galt es herrauszubekommen wie das mit dem Java-Applet funktioniert. Wenn man die Console startet, passieren 2 Dinge:

  1. Es wird nc -l -p 5900 -c „qm vncproxy VMID“ auf dem Host ausgeführt
  2. Es wird der Java Browser mit der entsprechenden Konfiguration gestartet

Jetzt wird das Ganze schon ein bissen klarer. Wenn man nun einfach einen Port öffnet und bei Connection ebenfalls den Qemu Vncproxy antriggert sollte es doch gehen.

Also gleich mal xinetd installiert ( geht natürlich auch mit openbsd-inetd ) und für einen Test folgende Konfiguration angelegt:

service vnc-10100
{
socket_type             = stream
wait                    = no
user                    = root
server                  = /usr/sbin/qm
server_args             = vncproxy 100
#log_on_failure += USERID
}

Jetzt noch in /etc/services den neuen Service eintragen:

vnc-10100       10100/tcp                        # vncproxy for Testmaschine

Nach einem Restart von xinetd kann man sich nun mit VNC mit den einzelnen Maschinen verbinden:

vncviewer.exe <IP Proxmox Host>::<Port der VM>

Meinen ersten Versuch mit TightVNC war schon vielversprechend, nur gab es Protokollprobleme, was an den benutzten X.509 Zertifikaten liegt, ein Feature, das weder Ultra- noch TightVNC bieten. Zum Glück gibt es mit TigerVNC einen Fork von TightVNC 4.0, der um dieses Feature erweitert wurde.

Die aktuelle Version 1.2 hat leider ein Problem mit dem Menü zum Senden von Sonderzeichen ( VNC bekommt ein Verbindungsproblem sobald man F8 antriggert ), aber Version 1.10 funktioniert wunderbar.

OpenVPN Accounts Management

Ich wurde mit dem Wunsch konfrontiert, eine Möglichkeit zu haben, Mitarbeitern, die über einen OpenVPN-Zugang verfügen, diesen temporär aktivieren/deaktivieren zu können. Zudem soll es möglich sein, ein Zeitspanne bis zur Deaktivierung angeben zu können, so dass der Zugang zu einem gewissen Zeitpunkt automatisch deaktiviert wird.

Bisher wurde oft einfach ein Zertifikat mit begrenzter Gültigkeitsdauer erstellt, was aber sehr unkomfortabel wird, soll dies öfters geschehen.

Zuerst habe ich mal geschaut, ob so ein Tool bereits existiert, habe aber leider nichts gefunden und entschieden dann halt selbst eins zu entwickeln.

Das Lesen der OpenVPN Doku gibt dann auch gleich ein paar Anhaltspunkte:

–client-config-dir dir
Specify a directory dir for custom client config files. After a connecting client has been authenticated, OpenVPN will look in this directory for a file having the same name as the client’s X509 common name. If a matching file exists, it will be opened and parsed for client-specific configuration options.
–ccd-exclusive
Require, as a condition of authentication, that a connecting client has a –client-config-dir file.

Beide Parameter in Kombination ermöglichen es einen Zugang zu deaktivieren. Mit –client-config-dir lässt sich ein Verzeichniss festlegen, indem accountspezifische Konfigurationen anglegt werden. Beim Einloggen überprüft dann OpenVPN, ob in diesem Verzeichniss eine Datei liegt, die dem Common Name des Anmeldenden entspricht. Dadurch könnten später auch accountspezifische Firewallregeln angetriggert werden.

Der zweite Parameter sorgt dafür, dass ein Login nur erfolgreich ist, wenn die Datei auch vorhanden ist.

D.h. um einen User zu deaktivieren, muss nur die entsprechende CCD-Datei gelöscht/umbenannt werden, um ihn wieder zu aktivieren, muss eine ( kann leer sein ) CCD-Datei erstellt werden.

Das Ganze soll nun in ein möglichst einfaches Webfrontend gegossen werden. Da ich lieber auf Python als PHP zurückgreife, habe ich mal geschaut, was es dort für einfachste Frameworks gibt und bin auf Bottle gestossen, ein sehr simples Framework, dass aber alles bietet, was ich brauche.

Sicherheit ist bei diesem ersten Test komplett aussen vor, d.h. ich gehe davon aus, dass nur ich selbst Zugang habe.

Hier mal der komplette Quellcode der App, ist ja nicht wirklich viel:

# -*- coding: latin-1 -*-

import os, sys, json, sqlite3, bottle, urllib, socket, re, subprocess as sub
from bottle import request, route, view, redirect, static_file

# rootpath config
ROOTPATH = os.path.dirname(__file__)

# Change working directory so relative paths (and template lookup) work again
os.chdir(os.path.dirname(__file__))

# ... build or import your bottle application here ...
# Do NOT use bottle.run() with mod_wsgi

bottle.debug(True)
app = bottle.Bottle()

### Config ####
BASE_URL = "/"
host="192.168.0.100"
port=7506
version=4
CCD_DIR='/etc/openvpn/ccd-1194/'
DB_DIR =  ROOTPATH + '/state/'
DB_NAME = DB_DIR + 'state.sqlite3'

def do_account_action(action='',account=''):
    if action == "activate":
        cmd = "mv /etc/openvpn/ccd-1194/" + account + "\.deactivated /etc/openvpn/ccd-1194/" + account
    else:
        cmd = "mv /etc/openvpn/ccd-1194/" + account + " /etc/openvpn/ccd-1194/" + account + ".deactivated"
    p = sub.Popen(['/bin/bash', '-c', cmd], stdout=sub.PIPE, stderr=sub.STDOUT)
    output = urllib.unquote(p.stdout.read())

    return output

def get_status():
    sock=connexion(host, port, 'status',version)
    data=sock.interact()
    tab1=re.findall("(.+),(\d+\.\d+\.\d+\.\d+\:\d+),(\d+),(\d+),(.+)", data)
    tab2=re.findall("(\d+\.\d+\.\d+\.\d+),(.+),(\d+\.\d+\.\d+\.\d+\:\d+),(.+)", data)

    num=(len(tab1)+len(tab2))/2

    stat_dict = {}
    for i in xrange(len(tab1)):
       for j in xrange(len(tab2)):
         if tab2[j][1]==tab1[i][0]:
            sendv=float(tab1[i][2])/1024
            receiv=float(tab1[i][3])/1024
            cn = tab1[i][0]            # common name
            ip_extern = tab1[i][1]     # ip intern
            ip_intern = tab2[j][0]     # official client IP
            bytes_send = '%.2f KB' % sendv
            bytes_received = '%.2f KB' % receiv
            tunnel_start = tab1[i][4]
            tunnel_stop =  tab2[j][3]
            stat_dict[cn] = [ ip_intern, ip_extern , bytes_send ,  bytes_received ,  tunnel_start , tunnel_stop ]
    return stat_dict

def get_db_config(account=''):
    conn = sqlite3.connect(DB_NAME)
    c = conn.cursor()
    c.execute("SELECT active, enddate FROM state WHERE account=?", [account])
    result = c.fetchall()

    if len(result)==0:
        return { 'active' : False, 'enddate' : '' }
    else:
        return { 'active': result[0][0], 'enddate' : result[0][1] }

def store_db_config(account='', aktiv=False, enddate=''):
    conn = sqlite3.connect(DB_NAME)
    c = conn.cursor()
    c.execute("REPLACE into state (account, active, enddate) VALUES (?,?,?)", (account,aktiv,enddate))
    conn.commit()
    c.close()

    return True

@app.route('/')
@app.route('/action/:action/:account')
@view('list-css')
def page(action='', account=''):
    retcode = "OK" + action + "  " + account
    if action == 'activate' or action == 'deactivate':
        retcode = do_account_action(action,account)
        redirect(BASE_URL)
    else:
        ccd_dir="/etc/openvpn/ccd-1194"
        name_list=os.listdir(ccd_dir)
        name_list.sort()
        stat_dict = get_status()

        # check if timerestriction is active
        timeresconfig = {}
        for name in name_list:
                timeresconfig[name] = get_db_config(name)
        return dict(names=name_list, status=stat_dict, trc = timeresconfig)

@app.route('/timeform', method='POST')
@view('printform')
def form():
    account = request.forms.get('account')
    active =  request.forms.get('active')
    enddate =  request.forms.get('enddate')
    if active:
        aktiv = True
    else:
        aktiv = False
    # now set the time restriction and redirect to index page
    status = store_db_config(account,aktiv,enddate)

    if status:
        redirect(BASE_URL)
    formdata = {}
    # Error, print Error
    formdata['keys'] = request.forms.keys()
    formdata['values'] = request.forms.values()
    return dict(form_data = formdata)

application = app

 

Bacula 5.2.6 auf Ubuntu Natty AMD64 installieren

Am 21. Februar gab es ein Update von Bacula auf Version 5.2.6. Unter Natty ist momentan aber nur Version 5.0.3 in den Repositories und die existierenden PPa’s machten auf mich keinen guten Eindruck. Also blieb nur die Möglichkeit das Ganze selbst zu compilieren.

Da ich aber auf einem Produktivsystem keine Mischung aus selbstcompiliertem und aus Repos installierten Programmen haben will, sollten natürlich Debian Pakete erzeugt werden.

Dies ist eine kleines Merkblatt für mich, wie ich es zum Laufen bekommen habe:

Als erstes müssen die Sourcen heruntergeladen  und entpackt werden werden. Nun fehlen die debian spezifischen Informationen zum bauen der Pakete. Zuerst habe ich einfach diejenigen aus den Sourcen der Version 5.0.3 genommen, die man mit einem

apt-get source bacula

bekommt. Nach dem Ausführen dieses Befehls findet man im aktuellen Verzeichnis die Originalsourcen, eine Beschreibungsdatei, die Patches und das bereits entpackte Sourceverzeichniss:

root@bacula:~/src#> ls -l
drwxr-xr-x 12 root     root    4096 2012-03-13 13:31 bacula-5.0.3
-rw-r–r–     1 root     root    203230 2011-03-07 17:05 bacula_5.0.3-0ubuntu2.diff
-rw-r–r–     1 root     root       2024 2011-03-07 17:05 bacula_5.0.3-0ubuntu2.dsc
-rw-r–r–     1 root     root      3800556 2011-02-14 21:04 bacula_5.0.3.orig.tar.gz

Als erstes habe ich mir den Patch angeschaut, um herauszubekommen, was geändert wurde. Glücklicherweise sind fast keine Änderungen ausserhalb des Debian-Verzeichnisses vorhanden.

Bevor ich damit versucht habe die Pakete zu bauen, bin ich beim stöbern noch über die Bacula Pakete für Precise gestossen, die bereits in Version 5.2.5 vorliegen. Da dachte ich mir doch, nimmste lieber die zur Version passenden Informationen als Basis zur Anpassung. Unter http://archive.ubuntu.com/ubuntu/pool/main/b/bacula/bacula_5.2.5-0ubuntu5.debian.tar.gz kann man die debianspezifischen Dateien herunterladen und im Root-Verzeichnis der entpackten Bacula-sourcen ebenfalls entpacken. Dies ergibt folgende Dateistruktur:

root@bacula:~/src/bacula-5.2.6#>ls -la
drwxr-xr-x 12 root     root   4096 2012-03-13 16:24 .
drwxr-xr-x   3 root     root       4096 2012-03-13 16:23 ..
-rw-r–r–     1 root     root      67472 2012-02-21 16:59 ABOUT-NLS
-rw-r–r–     1 root     root       2165 2012-02-21 16:59 AUTHORS
drwxr-xr-x   6 root     root       4096 2012-02-21 16:59 autoconf
-rw-r–r–     1 root     root     146570 2012-02-21 16:59 ChangeLog
-rw-r–r–     1 root     root       1665 2012-02-21 16:59 CheckList
-rwxr-xr-x    1 root     root         71 2012-02-21 16:59 code-changes
-rwxr-xr-x    1 root     root         69 2012-02-21 16:59 commits
-rwxr-xr-x    1 root     root     955210 2012-02-21 16:59 configure
-rw-r–r–     1 root     root         83 2012-02-21 16:59 COPYING
-rw-r–r–     1 root     root         83 2012-02-21 16:59 COPYRIGHT
drwxr-xr-x   2 root     root       4096 2012-03-13 16:23 debian
drwxr-xr-x 10 root     root       4096 2012-02-21 16:59 examples
-rwxr-xr-x   1 root     root         68 2012-02-21 16:59 get_authors
-rw-r–r–    1 root     root       3223 2012-02-21 16:59 INSTALL
-rw-r–r–    1 root     root      61356 2012-02-21 16:59 kernstodo
-rw-r–r–    1 root     root      43233 2012-02-21 16:59 LICENSE
-rwxr-xr-x   1 root     root       9781 2012-02-21 16:59 Makefile.in
drwxr-xr-x  2 root     root       4096 2012-02-21 16:59 manpages
drwxr-xr-x 22 root     root       4096 2012-02-21 16:59 platforms
drwxr-xr-x  2 root     root       4096 2012-02-21 16:59 po
-rw-r–r–    1 root     root      57243 2012-02-21 16:59 projects
-rw-r–r–    1 root     root       1836 2012-02-21 16:59 README
-rw-r–r–    1 root     root       1927 2012-02-21 16:59 README.AIX
drwxr-xr-x  2 root     root       4096 2012-02-21 16:59 release
-rw-r–r–    1 root     root      39336 2012-02-21 16:59 ReleaseNotes
drwxr-xr-x  3 root     root       4096 2012-02-21 16:59 scripts
drwxr-xr-x 15 root     root       4096 2012-02-21 16:59 src
-rw-r–r–    1 root     root        715 2012-02-21 16:59 SUPPORT
-rw-r–r–    1 root     root     146922 2012-02-21 16:59 technotes
-rw-r–r–    1 root     root       1284 2012-02-21 16:59 unaccepted-projects
drwxr-xr-x  2 root     root       4096 2012-02-21 16:59 updatedb
-rw-r–r–    1 root     root       1472 2012-02-21 16:59 VERIFYING

Nun hat man die nötige Dateistruktur zum kompilieren und kann die nötigen Anpassungen machen und natürlich die fehlenden Abhängigkeiten und Tools installieren. Als erstes habe ich die debhelper tools installiert:

apt-get install debhelper

Damit lässt sich herausbekommen, welche Abhängigkeiten vorhanden sind. Mit folgendem Aufruf bekommt man eine Liste der benötigten Pakete:

root@bacula:~/src/bacula-5.2.6# dpkg-checkbuilddeps

Auf meiner Kiste mussten folgende Pakete installiert werden:

aptitude install build-essential libpq-dev libncurses5-dev libssl-dev psmisc mysql-server libmysql++-dev libreadline-dev libsqlite0-dev libsqlite3-dev libwrap0-dev python-dev libgtk2.0-dev libgnome2-dev libacl1-dev libgnomeui-dev libx11-dev libxt-dev libqt4-dev libqwt5-qt4-dev quilt liblzo2-dev

Ein weiteres Paket fehlt, nämlich postgresql-server-dev-9.1. Erstens gibt es auf Natty nur Version 8.4, ausserdem brauche ich es nicht, da ich MySQL benutze.

Also einfach mal die zwei wichtigen Dateien im debian Verzeichniss angeschaut – rules und control. Aus der Control Datei habe ich alle Paketbeschreibungen, die sich auf Postgres beziehen entfernt:

bacula-common-pgsql, bacula-director-pgsql, bacula-sd-pgsql

Danach in der rules Datei alles gelöscht, was Bezug auf Postgres nimmt. Dabei ist mir aufgefallen, dass die aktuelle Version aus der Datei changelog erstellt wird und da ich Version 5.2.6 benutzte musste ich diese Version auch im Changelog angeben. Dafür habe ich einfach folgende Zeilen an den Anfang der Datei gesetzt:

bacula (5.2.6-0ubuntu1) natty; urgency=low

* Just a bug fix release

–My name <my@email.tld>  Wed, 07 Mar 2012 21:32:43 -0700

Jetzt einfach mal testen, ob es geht:

root@bacula:~/src/bacula-5.2.6#> dpkg-buildpackage -rfakeroot -uc -b

Hat auf Anhieb geklappt und lief ohne Probleme durch. Beim Installieren ist dpkg aber doch auf die Schnauze gefallen und die installierten Pakete konnten nicht konfiguriert werden. Nach ein bissen Suche ist mir aufgefallen, dass gawk gebraucht wird, also schnell mal installieren:

aptitude install gawk

Noch einmal versucht und alles lief glatt.

Ein Blick in die Release Notes offbahrt noch, dass sich da DB-Schema geändert hat. Um dies auf die aktuelle Version upzudaten findet man die Skripte unter

bacula-5.2.6/debian/tmp-install-mysql/etc/bacula/scripts/

Normalerweise sollten diese Skripte nach /etc/bacula/scripts kopiert werden. Das war bei mir nicht der Fall, ich habe jetzt aber auch nicht danach gesucht, sondern sie einfach per Hand kopiert. Das auszuführende Skript nennt sich update_mysql_tables. Am Anfang inZeile 11 noch den richtigen Datenbanknamen eingetragen und dann aufgerufen:

update_mysql_tables -p

Danach kann man in der Datenbank überprüfen, ob das Schema auf Version 14 gesetzt wurde, indem man in der Tabelle version nachschaut.

Jetzt kann man die neue Version testen und schauen, ob sie stabil läuft.

MAC OSX Remote Desktop über SSH konfigurieren

Da hat MAC OSX einen Remote Desktop, aber fast alle Beschreibungen, die man findet erklären einem, wie man unter der grafischen Oberfläche den Zugang konfiguriert.

Was macht man aber, wenn man nur einen SSH Zugang hat und sich damit den Desktop freischalten will?

Man schmeisst Google an und hofft, das es auch unter OSX Consolenfans gibt, die Infos dazu haben. Glücklicherweise gibt es die und auch ein Tool, um den VNC-Server zu konfigurieren, es nennt sich kickstart.

Wie gewohnt als erstes also mal ein man kickstart eingegeben, ohne Erfolg. Immerhin spuckt das Programm über den Flag -help Einiges aus.

Leider wird nicht ganz klar, wie man die Optionen jetzt vernünftig konfiguriert, aber ich habe letztendlich die für mich wichtigen Befehle herausbekommen:

  1. Alle Benutzer für VNC freischalten und Server neustarten:
    sudo kickstart -activate -configure -access -on -restart -agent -privs -all
  2.  Passwort für den VNC-Zugang setzen:
    sudo kickstart -configure -clientopts -setvncpw -vncpw <Passwort>

Den Pfad zum Programm habe ich aus Übersichtsgründen weggelassen: /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/

 

Wie ich zu einer CNC Fräse kam

Damit die folgende Geschichte Sinn macht, sollte ich vorab vielleicht doch einige Infos zu meiner Person loswerden.

Ich würde mich im Kontext der Geschichte als technik- und naturwissenschaftsbegeisterter Computernerd mit ausgeprägter Neugier und Schwächen bei Disziplin, Konzentration und Hartnäckigkeit bezeichnen.

In solch einem Geist schwirren durch Anregung der Umwelt ständig Ideen zu irgendwelchen Konstruktionen durch den Kopf. Jetzt behaupte ich mal das ist ganz normal, wer sich schon einmal in einem Verein betätigt hat kennt bestimmt die ganze „man müsste mal ….“-, „man könnte doch …“-, “ das muss so und so sein …“-Brut, die es immer besser weiss, es aber nie selbst macht.

An Ideen und Vorstellungen mangelt es also nicht, aber wohl an der Umsetzung. Auch oder besser gerade bei mir ist da nicht anders. Ich schätze mal von den ganzen Ideen, die so entstehen, schaffen es vielleicht ein paar wenige  Pozent eine längere Aufmerksamspanne zu ergattern. Von dieser Auswahl  werden dann wohl noch einmal 80-90% schnell wieder verworfen, da die Konstruktion mit Bordmitteln nicht umzusetzen ist.

Beim Rest beginnt man dann mal zu schauen, wie es um die Teilebeschaffung und deren Kosten steht. Und spätestens da wird es meistens ziemlich schnell ernüchternd. Selbst Materialien mit Produktionskosten im Centbereich kosten schnell duzende von Euros, wenn man nur eine geringe Menge braucht.

Im Endeffekt sterben also alle Projekte entweder daran, dass die Kosten zu hoch sind, oder die Materialbesorgung so langwierig ist, dass ich darauf keine Lust habe.

Jetzt bin ich aber doch ein Bastler, will also etwas umsetzen!!

Um die Ausbeute zu verbessern kam mir in den Sinn, dass es doch optimal wäre, wenn man die ganzen Kleinteile selbst aus Schrott herstellen kann. Dazu braucht es dann natürlich Maschinen und schon ist man bei der Frage welche es denn sein sollen.

Glücklicherweise habe ich vor kurzem eine alte Proxxon Drehbank überlassen bekommen. Diese habe ich ein bissen überarbeitet und wieder fit gemacht. Drehteile sind also schon einmal möglich, wenn natürlich die Genauigkeit dieser Maschine nicht mit einer ordentlichen Drehbank zu vergleichen ist. Aber immerhin ein Anfang.

Dann fehlt noch etwas für Teile, die nicht rund sind :-). Da fällt einem sofort das Stuchwort Fräse ein und steuerbar soll sie auch sein ( CNC ).

Also habe ich mich mal umgeschaut, was es so an Geräten gibt, die preislich passen und das machen können was ich will.

Ein bissen surfen brachte dann auch einige Ergebnisse, empfohlen sei mal Instructables. Hier findet man schnell Vorschläge, die im Bereich von einigen hundert Dollar zu realisieren sein sollen. Da freut sich das Herz und man wird ganz nervös. Leider sind die Preisangaben in Deutschland nicht realisierbar. Wenn man anfängt die benötigten Teile zu suchen landet man sehr schnell bei über 1000 Euro. Und das dann für eine Maschine, bei der noch nicht klar ist, was sie den überhaupt zu leisten vermag.

Mein zweiter Favorit wurde dann das Projekt von Lumenlabs. Es gibt einige  Videos die zeigen, dass zumindest Alu recht gut bearbeitet werden kann. Ich war eigentlich schon entschlossen mir das Teil zu bestellen, als dann doch einige Argumente gegen dieses Produkt auftauchten:

  1. Die Lieferzeit war aufgrund von gesundheitlichen Problemen des Herstellers sehr lang
  2. Der Zoll will ja auch noch seine Kohle und ruckzuck werden aus 700 Dollar weit über tausend
  3. Die Führungen basieren auf frei stehenden Stangen, was ich eher suboptimal finde.

Also dachte ich mir, solche Sachen müssen doch auch in Europa zu finden sein und tatsächlich, es gibt einige und nach ein bissen Recherche hatte ich unter anderem folgende Modelle am Start:

  1. Tron CNC
  2. BZT PF 600-C
  3. CNC Motion Tera
  4. EAS Easy 300
  5. Haase Cut 2500
  6. CNC Step
  7. Mixware P1

Um an Erfahrungswerte und weiteren Informationen zu bekommen, waren die zwei Foren Peters CNC Ecke und CNC Area sehr hilfreich. Beide kann ich nur empfehlen.

Über Monate bin ich immer wieder auf die einzlenen Seiten gegangen, habe die MAschinen verglichen, mir überlegt, was ich eigentlich haben will …….

Was man will ist eine gar nicht so einfache zu beantwortende Frage, aber ein paar grundlegende Feststellungen konnte ich dann doch erreichen:

  1. Das Material muss durchschiebbar sein, also man muss eine Fräsung in eine Platte setzen können, die länger ist als der Frästisch
  2. Die Breite sollte ausreichen, um Fräsung bei einer durchschnittliche Standbox hinzubekommen
  3. Es wird hauptsächlich Holz und Kunstoff verarbeitet werden, zumindest NE-Metalle sollten bearbeitbar sein und das vernünftig.
  4. Folgt eigentlich aus 3., Linearführungen sollen es sein.
Damit fallen schon einmal fast alle Kandidaten durch. Es bleiben ( meine Persönliche Meinung ) nur noch P1 und die Tera übrig.

Was mich dann letztendlich dazu bewogen hat mich für eine P1L zu entscheiden:

  1. Ist schon länger am Markt
  2. Der Konstrukteur stellt seine Maschine und  seine Motivation für einige Konstruktionentscheidungen überzeugend dar.
  3. Fürs Erste kommt es ein wenig günstiger ohne auf weitere Entwicklungstufen verzichten zu müssen.
Also habe ich mich Mitte Dezember 2011 endlich dazu durchgerungen eine P1L zu bestellen. Anfang Januar war sie dann da und bin sofort ans Zusammenbauen gegangen. Vielleicht schaffe ich es ja noch einen kleinen Bericht darüber zu schrieben, wie das so lief.
Zusammenfassend sei gesagt, das sich der positive Eindruck beim Zusammenbauen bestätigt hat. Alles ist durchdacht, Spiel zum Einstellen, wo man braucht, MAsshaltigkeit, wo es sie braucht.

 

 

FreeCAD 0.12 unter Lucid Kompilieren

Für meinen Open Source CNC-Stack habe ich FreeCAD als CAD-Tool ausgewählt. Für Lucid gibt es im Universe Repo  ein Paket in der Version 0.9.2646.5-1, auf der Homepage bekommt man für Linux im Moment die Version 0.11.3729 zum Download angeboten.

Vor einiger Zeit hatte ich die Version 0.9 installiert und fand das es bereits recht gut funktioniert. Danach bin ich zur Version 0.11 übergegangen und war sehr positiv überrascht, welchen Fortschritt das Projekt zwischen den Versionen gemacht hat. Jetzt ist aber nicht mehr 0.11 aktuell sondern die leider nur für Windows zum Download angebotene Version 0.12. Und wenn man die Release Notes liest, hat sich wieder einiges getan.

Um in den Genuss der aktuellen Version zu kommen, gibt es 2 Möglichkeiten:

  1. Es gibt ein Daily PPA, über welches man Version 0.13 installieren kann
  2. Man kompiliert selbst

Da ich das Programm auch produktiv benutzen will, habe ich mich entscheiden, mal zu schauen, wie gut die Version 0.12 läuft, also kommt nur selbst kompilieren in Frage.

Folgende Schritte haben mich zum Ziel gebracht:

  1. Download der Sourcen
  2. Installation aller nötigen Packete:
    sudo aptitude install libeigen2-dev libopencascade-dev doxygen libcholmod1.7.1  libumfpack5.4.0 libsu libadolc-dev libsuperlu3-dev libumfpack4-dev libsuitesparse-dev libmpfr-dev fftw-dev libfftw3-dev swig libspnav-dev pyqt4-dev-tools libboost-all-dev build-essential gfortran  libxerces-c-dev libsoqt-dev libsoqt4-dev cmake libgsl0-dev
  3. Download der aktuellen Eigen3 Version
  4.  Hat man alle nötigen Pakete, Kann man Eigen folgendermassen installieren:
    cmake
    sudo make install
    Es wird alles nach /usr/local installiert
  5. Nun kann man FreeCAD kompillieren und installieren:
    ./configure
    make
    make install
    FreeCAD wird in /home/user/FreeCAD installiert, es sind also keine Rootrechte nötig

Da ich auch FreeCAD 0.11 installiert habe, bin ich natürlich nicht ganz sicher ob oben auch alle nötgien Pakte aufgeführt sind.

Auf jeden Fall läuft es ohne Probleme bis jetzt.

Gruss

Schnuffle