Donnerstag, 28. November 2013

SALT: changing a minions hostname

Recently I had the requirement to change a minions hostname. One might think that changing the hostname in /etc/hostname and/or the FQDN in /etc/hosts is sufficient, but you have to do some more steps.
  1. update /etc/hostname and /etc/hosts
  2. stop service
  3. change minion id in /etc/salt/minion_id
  4. start service
That's it...

Mittwoch, 27. November 2013

Constructing and building a Hexacopter with Openscad

Hi, this is my first x-copter post and also my first blog post in english. (Wenn Sie den Blog lieber in deutsch lesen wollen, so lassen Sie es mich wissen - Danke.)

In this post I will show you how one can construct a multicopter (hexacopter) with Openscad. Openscad is a free software, available for Linux, Windows and Mac OS X, which can be used to create solid 3D CAD models. Despite other software, such as Blender, it's focus is on construction aspects and not on artistic design aspects. In this way it is comparable to Catia, Solidworks, AutoCad, etc. However, the difference to the aforementioned modelling tools is that Openscad is less interactive, that means your 3D models are created more like computer programs and are rendered by a compiler. At first hand, this sounds weird and difficult, but after time one learns to love the new flexibility. Another important aspect of Openscad is it's ability to export to various file formats, e.g., DXF and STL. This way, one can easily create models for 3D printers or cnc routers.

The idea behind this tutorial is to help others to get started doing something useful with Openscad. For me it seemed a littlebit difficult to construct nice looking shapes and to fully utilize the tool chain (3D printing and CNC routing). Please feel free to improve my approach to Openscad! Please read the offical Openscad tutorials before following my tutorial.

Okay, so let's get started. First, I want to explain what I want to build. My goal is to build a hexacopter which will be my experimental platform for testing equipment etc. It should be capable of carrying neat stuff like FPV equipment (osd, cam, transmitter), GPS, larger batteries, gimbals, etc.

So how do we get started, well, we first need a center plate. So lets create one... First we need something where we can mount the six beams. I will call that area beam support.

1: beamsupport = 30;
2: square([beamsupport,beamsupport],center=true);


Next, let's duplicate and rotate that area to create six support areas for the six beams.
 
1:  baseplatedia = 140;
2:  beamsupport = 30;
3:  for(i=[0:5]) {
4:   rotate([0,0,360/6*i])
5:   translate([baseplatedia/2-beamsupport/2,0,0])
6:    square([beamsupport,beamsupport],center=true);
7:  }
 

On line 1 and 2 we have introduced some variables, baseplatedia which is the maximum dia of the base plate and beamsupport which is the above mentioned support area. Then we have created a loop (line 3) that will rotate (line 4) our axes by multiples of 60 degrees (at most 6 times). This way it is possible to place the beam support areas. We have also added a translation to move the support areas to the outer diameters of our base plate (line 5). On line 6 the actual support area has been drawn. Now we have 6 independent and unconnected regions. In the next step we will connect these regions to the base plate by using the hull() function (see below line 3).
 
1:  baseplatedia = 140;
2:  beamsupport = 30;
3:  hull() {
4:   for(i=[0:5]) {
5:    rotate([0,0,360/6*i])
6:    translate([baseplatedia/2-beamsupport/2,0,0])
7:     square([beamsupport,beamsupport],center=true);
8:   }
9:  }


Now, we already have a simple base plate. Next we will round the corners. To round the corners the minkowski() function will be exploited. With minkowski it is possible to trace one object around the shape of another. That means if we trace a circle around a square, then the result will be a (larger) square with rounded corners. So let's do this.
 
1:  baseplatedia = 140;
2:  beamsupport = 30;
3:  corners = 5;
4:  hull() {
5:   for(i=[0:5]) {
6:    rotate([0,0,360/6*i])
7:    translate([baseplatedia/2-beamsupport/2-corners,0,0])
8:     minkowski() {
9:      circle(corners);
10:     square([beamsupport,beamsupport],center=true);
11:    }
12:  }
13: }


We have added the minkowski function (line 8) which traces a circle with radius corners (line 9) around the square (line 10). We have removed the size of the circle object from the desired translation of the support areas to get the requested overall diameter. Now we already have a nice looking basis for a center plate. So far, the complete object is a 2D object. In the next step we will extrude this object to a 3D object to get advantage of full 3D modelling. So let's do this.

1:  baseplatedia = 140;
2:  beamsupport = 30;
3:  corners = 5;
4:  linear_extrude(height=5){
5:   hull() {
6:    for(i=[0:5]) {
7:     rotate([0,0,360/6*i])
8:     translate([baseplatedia/2-beamsupport/2-corners,0,0])
9:      minkowski() {
10:      circle(corners);
11:      square([beamsupport,beamsupport],center=true);
12:     }
13:   }
14:  }
15: }



Now, we have a full 3D model and can start to add/place the beams, mounting holes etc. to finally arrive at my (not yet finished) final version.


Resources:

Freitag, 22. November 2013

python jenkinsapi unsigned SSL certificate workaround/disable cert check

Einer meiner Kunden nutzt zur Unterstützung seiner Softwareentwicklung ein Jenkins basiertes Build Cluster. Um den darauf laufenden Buildprozess weitestgehend zu automatisieren bietet Jenkins selbst eine API Schnittstelle an. Zu dieser Schnittstelle gibt es diverse Libraries in mehreren Sprachen, u.a. Python (pip install jenkinsapi). Aufgrund einer Integration der Jenkins Server ins LDAP wollte dieser Kunde nun seine Jenkins Instanzes auf SSL umstellen. Dabei sollten selbst signierte SSL Zertifikate/Root-Zertifikate zum Einsatz kommen.

Versucht man sich nun via JenkinsAPI (siehe Codeausschnitt) mit den Server jenkins-master zu verbinden, so bekommt man folgende Fehlermeldung.

from jenkinsapi.jenkins import Jenkins
jenkins = Jenkins('https://jenkins-master:8080')
 
Meldung/Fehler:
SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Die Meldung wird durch den verwendeten SSL Layer erzeugt, welcher nicht in der  Lage war das verwendete Zertifikat zu verifizieren. Es gibt nun verschiedene Möglichkeiten um dem Problem zu begegnen:
  1. offizielle SSL Zertifikate erwerben
  2. selbst signierte Zertifikate als vertrauenswürdige Zertifikate im SSL Layer installieren
  3. Überprüfung des Zertifikates für diese Verbindung deaktivieren.
Option 1 kam aufgrund der hohen Kosten und der angestrebten internen verwendung nicht in betracht. Auf Option 2 werde ich in einem anderen Blogpost näher eingehen. Vorerst soll uns aber mit Option 3 geholfen werden - meist ist dies auch ausreichend.
Nach einer Analyse der JenkinsAPI und der darunterliegenden requests API bietet es sich an die SSL Zertifikat Überprüfung über eine eigene Requester Klasse zu deaktivieren. Dies kann man wie folgt erreichen.
from jenkinsapi.jenkins import Jenkins
from jenkinsapi.utils.requester import Requester

class SSLRequester(Requester):
    def __init__(self, username=None, password=None):
        super(SSLRequester, self).__init__(username, password)

    def get_request_dict(self, url, params, data, headers):
        requestKWargs = super(SSLRequester, self).get_request_dict(url, params, data, headers)
        requestKWargs['verify'] = False
        return requestKWargs

jenkins = Jenkins('https://jenkins-master:8080', requester=SSLRequester())

Die Klasse SSLRequester überschreibt hierbei die in der Klasse Requester definierte get_request_dict Methode in der Art und Weise das zusätzlich zu den url, params, data, headers Parametern noch die Option verify=false als die darunterliegende requests Klasse/Methode übergeben wird. Nun wird die Jenkins Instanz ohne Fehlermeldungen über eine "sichere" SSL Verbindung erzeugt. Über dieselbe Art und Weise, mit Hilfe der SSLRequester Klasse kann man auch einen Pfad zu einer sogenannten "trusted certificate base" (Vertrauenswürdige Basiszertifikate) übergeben um dann mit Hilfe dieser Zertifikate seine selbst signierten Zertifikate zu verfifizieren.

Mittwoch, 20. November 2013

VirtualBox startet nicht (hangs during startup) - kvm issue

Auf einen Laptop mit Virtualisierungsunterstützung hatte ich neulich folgendes Problem: Scheinbar von einen Start zum nächsten wollte VirtualBox keine virtuellen Maschinen mehr starten. Meine Maschinen blieben alle während des Startups bei 0% stehen. Im Hintergrund kam dann immer ein 2. Fenster mit Fortschrittsbalken welches bei 20% hängen blieb. Im Log der virtuellen Mascine fand sich als letzte Meldung folgendes:

No VT-x or AMD-V CPU extension found.
Nach prüfen das die VT-x Erweiterungen auch wirklich noch im Bios aktiviert sind entschloss ich mich für eine Neuinstallation des Kerneltreibers.

/etc/init.d/vboxdrv setup
Leider schlug die Neuinstallation der Kerneltreiber mit der Meldung fehl das diese noch in Verwendung sind... Nach einigen weiteren rumprobieren entschloss ich mich für die Neuinstallation von VirtualBox.

apt-get remove virtualbox-4.2
Anschliessend habe ich mir die neueste Version von VirtualBox besorgt und mit dpkg installiert.Nach lösen eines Abhängigkeitsproblems mit einer Bibliothek (libvpx0) verlief die Installation problemlos. Leider war dies noch immer nicht die Lösung für mein Problem, wenn auch jetzt eine richtige/aussagekräftigere Fehlermeldung erschien.


VirtualBox can't operate in VMX root mode. VBox status code: -4011 (VERR_VMX_IN_VMX_ROOT_MODE).
Dieser Meldung nach wird die VMX Erweiterung bereits durch ein anderes Modul verwendet. Nach einigen suchen auf meinen Laptop war klar das irgendwie/irgendwann die kvm Kernelmodule installiert wurden.

lsmod | grep kvm
rmmod kvm_intel
rmmod kvm
Nach erfolgreichen entfernen dieser Module verlief der Startup aller virtuellen Maschinen wieder erfolgreich. Um ein erneutes Laden der Module zu verhindern kann man diese ggf. auch Blacklisten (/etc/modprobe.d/blacklist.conf). Bzw. die eigentliche Ursache für das Laden der Module finden (kvm selbst war bei mir nicht installiert...)

Quellen: 

  •  https://forums.virtualbox.org/viewtopic.php?t=7796
  • Google :)