Aggiungere altri pacchetti

A questo punto ci potrebbe anche venire la voglia di metter dentro qualcosa in più alle nostre belle immagini Kamikaze. Aggiungere pacchetti in OpenWrt è davvero molto semplice a patto che si riesca a compilarli per l'architettura desiderata al primo colpo, altrimenti il tutto diventa un pò più difficile per la necessità di apportare qualche modifica ai sorgenti e creare le opportune patch.

1. B.A.T.M.A.N.

AGGIORNAMENTO: questi miei files per aggiungere batman alle immagini Kamikaze sono stati appena inseriti nel tree ufficiale di Kamikaze, per questo, seguendo questo tutorial dopo il 18 marzo 2007, non c'è più bisogno di inserire a mano il pacchetto. Lascio comunque queste istruzioni a scopo didattico.

Come primo esempio aggiungeremo al nostro trunk il pacchetto batman che ci metterà a disposizione il daemon per il protocollo B.A.T.M.A.N.
Entriamo nella nostra directory trunk/package/ e creiamo la cartella "batman":

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $ mkdir batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $ cd batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $

Nella cartella batman creiamo il Makefile con il contenuto seguente:

#
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk

PKG_NAME:=batman-III
PKG_VERSION:=0.2.0a
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tbz2
PKG_SOURCE_URL:=http://downloads.open-mesh.net/batman
PKG_MD5SUM:=d5ac8329633590ed072a6b7ecccacf0b
PKG_CAT:=bzcat

PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install

include $(INCLUDE_DIR)/package.mk

define Package/batman
  SECTION:=net
  CATEGORY:=Network
  DEPENDS:=+libpthread +kmod-tun
  TITLE:=B.A.T.M.A.N. Better Approach To Mobile Ad-hoc Networking
  URL:=https://www.open-mesh.net/
endef

define Build/Configure
endef

define Build/Compile
        rm -rf $(PKG_INSTALL_DIR)
        mkdir -p $(PKG_INSTALL_DIR)
        $(MAKE) -C "$(PKG_BUILD_DIR)" \
                $(TARGET_CONFIGURE_OPTS) \
                NODEBUG=1 \
                OFLAGS="$(TARGET_CFLAGS)" \
                OS="linux" \
                INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
                STRIP="/bin/true" \
                batmand install
endef

define Package/batman/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
endef


$(eval $(call BuildPackage,batman))

Se usate direttamente vim o simili da shell, il copia & incolla sarà un pò difficoltoso per via della traduzione da tabs a spazi. Per risolvere potete dare unexpand --first-only - | cat > nomefile incollare il testo, premere ENTER e poi premere CTRL-D per salvare il file.

Il Makefile che abbiamo appena creato sembra lungo e tenebroso ma in realtà è assolutamente lineare. Vediamone qualche passaggio:

PKG_NAME:=batman-III
PKG_VERSION:=0.2.0a
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tbz2
PKG_SOURCE_URL:=http://downloads.open-mesh.net/batman
PKG_MD5SUM:=d5ac8329633590ed072a6b7ecccacf0b
PKG_CAT:=bzcat

Con queste poche righe abbiamo istruito il sistema di compilazione di OpenWrt a:

Semplice, no?

define Package/batman
  SECTION:=net
  CATEGORY:=Network
  DEPENDS:=+libpthread +kmod-tun
  TITLE:=B.A.T.M.A.N. Better Approach To Mobile Ad-hoc Networking
  URL:=https://www.open-mesh.net/
endef

Qui invece abbiamo specificato i dettagli del pacchetto, quelli che poi vedremo nei menu dell'utility di configurazione del source tree (il make menuconfig per intenderci). Il parametro DEPENDS indica che per poter vedere la voce batman è necessario aver già selezionato libpthread e kmod-tun.

define Build/Configure
endef

define Build/Compile
        rm -rf $(PKG_INSTALL_DIR)
        mkdir -p $(PKG_INSTALL_DIR)
        $(MAKE) -C "$(PKG_BUILD_DIR)" \
                $(TARGET_CONFIGURE_OPTS) \
                NODEBUG=1 \
                OFLAGS="$(TARGET_CFLAGS)" \
                OS="linux" \
                INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
                STRIP="/bin/true" \
                batmand install
endef

Qui invece abbiamo definito come il pacchetto deve essere configurato e compilato. La versione indicata di batman non prevede configurazione, altrimenti avremmo inserito un bel configure. Nella compilazione abbiamo inserito anche un "batman install", vedremo più avanti il perchè

define Package/batman/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
endef

In quest'ultimo blocco abbiamo invece specificato cosa bisogna fare per installare il pacchetto. Se proviamo a compilare dopo aver aggiunto il solo Makefile otterremo un errore. In effetti è da aggiungere una piccola patch che modifica il Makefile di batman (del pacchetto, non il Makefile che abbiamo appena scritto) per aggiungergli la funzioanlità di "install" che abbiamo chiamato alla fine del Build/Compile inserito nel Makefile precedente. Quindi posizioniamoci nella cartella package/batman e creiamo una cartella patches:

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package/batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ mkdir patches
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ cd patches
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/patches $ 

In questa cartella creiamo il file "001-makefile.patch" con il contenuto seguente:

--- batman-III-0.2.0a.old/Makefile      2007-02-28 15:41:11.000000000 +0100
+++ batman-III-0.2.0a/Makefile  2007-02-28 15:42:02.000000000 +0100
@@ -27,6 +27,7 @@
 CFLAGS =               -Wall -O0 -g3
 LDFLAGS =              -lpthread
 #LDFLAGS =             -static -lpthread
+SBINDIR =      $(INSTALL_PREFIX)/usr/sbin

 UNAME=$(shell uname)

@@ -67,3 +68,7 @@

 clean:
                rm -f batmand batmand-mips* *.o *~
+
+install:
+               mkdir -p $(SBINDIR)
+               install -m 755 batmand $(SBINDIR)

In questo modo la compilazione di batman stesso farà si che il daemon "batmand" venga installato nella cartella "/usr/sbin" con i giusti permessi. A questo punto potremo riconfigurare il source tree selezionando anche batman, ovviamente per poter avere questa voce tra le opzioni di "Network" dovremo prima selezionare la libreria libpthread e il modulo kernel kmod_tun.
Volendo, possiamo "corredare" il pacchetto batman anche di un file di configurazione ed uno script di start stop. Per farlo, creiamo la cartella "files" in "package/batman/", dentro questa creiamo la cartella "etc" e, dentro questa, creiamo le cartelle "config" e "init.d":

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package/batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ mkdir files
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ cd files
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/files $ mkdir etc
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/files $ mkdir etc/config
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/files $ mkdir etc/init.d

Fatto questo, creiamo nella cartella "batman/files/etc/config/" un file dal nome "batman" con il seguente contenuto:

config batman general
        option interface                ath0
        option announce
        option gateway_class
        option originator_interval
        option preferred_gateway
        option routing_class
        option visualisation_srv

E, nella cartella "batman/files/etc/init.d/" un file dal nome "batman" con il seguente contenuto:

START=100
. /lib/config/uci.sh
uci_load batman
start () {
        interface=$(uci get batman.general.interface)
        if [ "$interface" = "" ]; then
                echo $1 Error, you must specify at least a network interface
                exit
        fi
        announce=$(uci get batman.general.announce)
        gateway_class=$(uci get batman.general.gateway_class)
        originator_interval=$(uci get batman.general.originator_interval)
        preferred_gateway=$(uci get batman.general.preferred_gateway)
        routing_class=$(uci get batman.general.routing_class)
        visualisation_srv=$(uci get batman.general.visualisation_srv)
        batman_args=""

        if [ $announce ]; then
                batman_args=${batman_args}'-a '$announce' '
        fi

        if [ $gateway_class ]; then
                batman_args=${batman_args}'-g '$gateway_class' '
        fi

        if [ $originator_interval ]; then
                batman_args=${batman_args}'-o '$originator_interval' '
        fi

        if [ $preferred_gateway ]; then
                batman_args=${batman_args}'-p '$preferred_gateway' '
        fi

        if [ $routing_class ]; then
                batman_args=${batman_args}'-r '$routing_class' '
        fi

        if [ $visualisation_srv ]; then
                batman_args=${batman_args}'-v '$visualisation_srv' '
        fi

        batman_args=${batman_args}$interface
        batmand $batman_args >/dev/null 2>&1
}

restart () {
        $0 stop
        sleep 3
        $0 start
}

stop () {
        killall batmand
}

A questo punto, il nostro "batman" avrà anche uno script di start-stop ed un file di configurazione, dobbiamo solo includere questi file nel pacchetto. Lo facciamo aggiungendo due linee alla fine del file "package/batman/Makefile" creato all'inizio, all'interno della sezione "Package/batman/install":

define Package/batman/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
        $(CP) -a ./files/* $(1)/
        chmod -R 755 $(1)/etc/init.d/batman
endef

Compilando con queste modifiche avremo quindi un pacchetto batman completo, con il suo script di start-stop.

2. X-Wrt-mesh

Ovviamente potremo necessitare di aggiungere un pacchetto che non sia disponibile come tarball di sorgenti, ma, come visto per X-Wrt, sia disponibile tramite un sistema di versioning. In quest'altro esempio, alla stregua di X-Wrt descritto all'inizio del tutorial, aggiungeremo altri pacchetti da svn (fortemente sperimentali) che aggiungono a X-Wrt la possibilità di visualizzare e configurare i parametri dei protocolli di mesh networking installati nel sistema. Si tratta dei pacchetti (per ora):

Questi pacchetti sono sviluppati dai ragazzi di [www.meganetwork.org meganetwork.org] (di cui faccio parte). Dicevo che si tratta di pacchetti fortemente sperimentali infatti alla data in cui scrivo (18 marzo) risultano funzionanti solo webif-mesh e webif-batman che ho finito di sviluppare proprio ieri pomeriggio. Per aggiungere questi pacchetti quindi basterà farne il checkout svn dalla nostra catella trunk/package:

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-mesh
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-olsr
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-batman
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-netsukuku

A questo punto ci basterà lanciare un make menuconfig dalla cartella trunk e, nel sottomenù webif troveremo le voci aggiuntive di webif-mesh che potremo quindi selezionare per compilare ed includere nella nostra immagine Kamikaze.