Firmware Subversion

Aus Freifunk Leipzig
Wechseln zu: Navigation, Suche

Weil das alte SVN einen Datenbank-Fehler hatte und mit der Zeit auch ein wenig die Ordnung verloren gegangen ist, war das ein guter Anlass aufzuräumen. Leider sind aber alle bisherigen Revisionsänderungen verloren gegangen.

Die aktuelle Leipziger Freifunk-Firmware finder sich jetzt unter:
https://dev.leipzig.freifunk.net/trac/browser/firmware

Inhaltsverzeichnis

Aufbau des Repositories

Verzeichnislayout

  • firmware/ - Das Wurzelverzeichnis
    • trunk/ - Der Entwicklerzeig in dem an der Firmware gebaut wird
    • branches/ - Dieses Verzeichnis enthält die jeweiligen Versionen der Firmware
    • packages/ - Der Quelltext aller Leipziger Add-Ons
    • contrib/ - Hier befinden sich Erweiterungen und Tools für den Umgang mit dem Repository
      • repoman/ - Repository Manager, damit lassen sich die einzelnen Branches verwalten und Images bauen
      • packages/ - Die gepackten Add-On Pakete für die jeweiligen Versionen (Branches)
        • 1.4.5-o/ - Add-Ons für Version 1.4.5-o
        • 1.6.10-a/ - Add-Ons für Version 1.6.10-a
        • ... - usw.
      • patches/ - Modifikation an einzelner Software
      • source/ - Quellcode für zusätzliche Programme
      • orig/ - Beinhaltet die jeweiligen Berliner Originalversionen auf denen der Trunk aufbaut

Anmerkungen

./branches/
Speicherort der verschiedenen Versionen. Die Version mit der höchsten Nummer ist i.d.R. der aktuelle "testing" Branch, die vorletzte Version das aktuelle root-Dateisystem wie es auch unter http://firmware.leipzig.freifunk.net/firmware zu finden ist.

./trunk/
In diesem Verzeichnis wird hauptsächlich entwickelt.

./contrib/
Hier befinden sich build-tools mit denen aus den Quellen ein funktionierendes Firmware-Image gebaut werden kann.


Infos zur Verwendung von Subversion gibts hier

Images bauen

Es gibt 2 Varianten sich Firmware-Images zu bauen. Die manuelle Variante ist nachfolgend beschrieben:

Manuelle Variante

# auschecken (der Unterordner ./firmware wird beim checkout angelegt)
# (später dann nur mit "svn up" updaten)
cd /[lokalerpfad]
svn co https://dev.leipzig.freifunk.net/svn/firmware
# eine stabile Version nach z.B. tmp exportieren
svn export ./firmware/branches/1.4.5-m/ /tmp/root-current
# bzw. eine Testversion...
svn export ./firmware/branches/1.4.5-n/ /tmp/root-testing
# Tipp: Den Versionsstatus eines Branches kannst du mit "svn propget" herausfinden:
svn propget ffl:branch ./firmware/branches/[branch]
# dort evtl. das spätere root-Dateisystem nach eigenen Wünschen 
# anpassen/hinzufügen/verändern/löschen 
# (wenn du weißt was du tust)
cd /tmp/root-current
# nach root.tgz packen und gleich
tar -czvf /tmp/root.tgz .
# in den ff-kit-ordner kopieren
cp /tmp/root.tgz /[lokalerpfad]/firmware/contrib/freifunk-openwrt-kit-1.4.5-de/ .
# in den freifunk-openwrt-kit-Ordner wechseln
cd /[lokalerpfad]/firmware/contrib/freifunk-openwrt-kit-1.4.5-de/
# Firmwareimage erzeugen 
# (./gen-openwrt ohne parameter aufgerufen zeigt die Optionen)
./gen-openwrt trx -v 1.4.5-custom > /tmp/firmware.trx
# Firmware auf Router kopieren
scp /tmp/firmware.trx root@192.168.1.1:/tmp/
# einloggen
ssh root@192.168.1.1
# flashen  ;) 
firmware-burn /tmp/firmware.trx

Mit dem "releases" Tool als Wizzard

Zusätzlich gibt es noch ein Firmware-Tool in /contrib/repoman/releases mit dem man bequem Images bauen kann. Wenn du nur sporadisch Images baust und keine Verwendung für eine lokale Arbeitskopie des kompletten Firmware-Repositories hast dann kannst du dir mit dem Tool die Quellen automatisch aus dem Netz laden und ein Image erstellen lassen.

Das Programm auschecken...

svn export https://dev.leipzig.freifunk.net/svn/firmware/contrib/repoman/releases

... und eine stabile Firmware bauen ...

./releases --branch stable

... oder die "testing" Version nutzen:

./releases --branch testing

... brandneu aus dem Trunk geht auch (auf eigene Gefahr!):

./releases --branch unstable

Anschließend fragt das Programm nach dem Image-Typ, gebe hier das passende an, z.B. 7 für "trx". Das fertige Image kannst du dann in /tmp finden.

Lokale Arbeitskopie statt Online-Repository nutzen

Die obere Methode hat den Nachteil das du jedesmal die aktuellen Quellen aus dem Online-Repository herunterladen musst um ein Firmware-Image zu bauen. Deshalb gibt es noch eine Offline-Variante die eine bereits ausgecheckte Arbeitskopie auf der Festplatte nutzt um die Images zu generieren.

Beim ersten Mal brauchst du einen kompletten checkout des Firmware-Repositories, später reicht ein "svn up" um den neuesten Stand zu erhalten:

svn co https://dev.leipzig.freifunk.net/svn/firmware
cd firmware/contrib/repoman/

Nun kann man mit dem "releases" Tool und dem "--local" Parameter Images aus der Arbeitskopie bauen lassen. Der "--type" Parameter ist optional. Beispiel für die stabile Version:

./releases --local ../../ --branch stable --type trx

... oder wenn man ein Testing-Image möchte:

./releases --local ../../ --branch testing --type trx

Danach findest du ein neues Image in /tmp welches ungefähr so heißt:

ffl-firmware-1.4.5-m123.trx

Dieses Image kann man dann wie gehabt auf sein Gerät flashen.


Das Tool kennt noch weitere Optionen die du dir mit

./releases --help

anzeigen lassen kannst.

Konventionen im Umgang mit dem Repository

Solltest du vor haben eigene Änderungen in das Repository einzuchecken so gilt es einige Dinge zu beachten:

  • Alle Änderungen nur im Trunk vornehmen!
  • Bitte nur funktionierende Änderungen übertragen, also keine "halben Sachen"
  • Bitte kommentiere deine Änderungen ausreichend

Wie kann ich denn nun was einchecken?

Nachdem du dir das komplette Firmware Repository ausgecheckt hast solltest du den Ordner "trunk" im "firmware" Verzeichnis finden. Um Änderungen vorzunehmen wechselst du in den Trunk:

cd /dein/lokaler/pfad/firmware/trunk/

Hier befindest du dich jetzt im Root-Verzeichnis der Firmware. Dort kannst du einfach lokal deine Änderungen vornehmen. Wenn du fertig bist überträgst du deine Änderungen mittels

svn commit

an das Repository. Bitte vergiss nicht deine Änderungen ausreichend zu kommentieren.

Sonstiges

Wie kann ich ein Diff zwischen zwei Versionen in /firmware/orig/ (oder einem beliebigem anderen Ordner) machen?

Das funktioniert mittels "svn diff url_alt@rev_alt url_neu@rev_neu". Zunächst muss man die beiden Revisionen finden, das geht z.B. hier (in der Spalte "Rev") oder mit dem "svn info" Befehl (wobei die "Letzte geänderte Rev" zu beachten ist):

jow@wws-lt3:~$ svn info https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.9                                          
Pfad: 1.6.9
URL: https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.9
Basis des Projektarchivs: https://dev.leipzig.freifunk.net/svn
UUID des Projektarchivs: ab181a69-ba2e-0410-a84d-ff88ab4c47bc
Revision: 716
Knotentyp: Verzeichnis
Letzter Autor: ufo
Letzte geänderte Rev: 671
Letztes Änderungsdatum: 2007-10-16 01:52:30 +0200 (Di, 16 Okt 2007)

In unserem Beispiel hat der Ordner /firmware/orig/1.6.9 die Revision 671 und der Ordner /firmware/orig/1.6.10 die Revision 714. Ausgestattet mit diesen beiden Revisionsnummern kann man sich jetzt die Differenzen zwischen den beiden Ordnern zeigen lassen:

svn diff https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.9@671 https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.10@714




Hier ist ein kleines Beispielscript was die drei o.g. Schritte zusammenfasst:

#!/bin/sh
# delta.sh - Finde die Unterschieder zweier Versionen in /firmware/orig/
baseurl=https://dev.leipzig.freifunk.net/svn/firmware/orig
if [ -z "$1" -o -z "$2" ]; then
       echo "Aufruf: $0 <alte Version> <neue Version>";
       exit 1
fi
oldrev=$(LC_ALL=C svn info $baseurl/$1 | grep 'Last Changed Rev' | cut -d' ' -f4)
newrev=$(LC_ALL=C svn info $baseurl/$2 | grep 'Last Changed Rev' | cut -d' ' -f4)
svn diff $baseurl/$1@$oldrev $baseurl/$2@$newrev

Damit reduziert sich der oben beschriebene Weg auf folgenden Befehl:

./delta.sh 1.6.9 1.6.10

Wenn man nur eine Liste der geänderten Dateien möchte (ohne den Diff-Text) kann man folgendes probieren:

./delta.sh 1.6.9 1.6.10 | grep Index: