MultiFiles

Un sistema per l'installazione di file (firmware) in un multicast UDP

Scarica multifiles v0.5

Licenza: GPLv2, GPLv3.

Principi del funzionamento di MultiFiles

Il file per la distribuzione viene inviato ciclicamente alla rete in un flusso multicast UDP (User Datagram Protocol) verso un determinato indirizzo multicast (per impostazione predefinita l'indirizzo è 224.2.2.4, porta 2222). Per ricevere il firmware, l'applicazione client deve unirsi al gruppo del multicast inviando una richesta IGMP e avviare il download del file. Una volta completato il download, l'applicazione client si disconnette dal gruppo e verifica l'integrità del file. Se la verifica è completata correttamente, il file viene decompresso (il formato è .tar.gz) e viene avviato lo script customup.sh contenuto nell'archivio appena scaricato. Lo script esegue l'aggiornamento dei file e tutte le altre attività necessarie allo stesso aggiornamento.

L'utilizzo del multicast consente di aggiornare in diretta qualsiasi numero di decodificatori IP utilizzando un solo flusso.

Se la versione corrente del firmware è simile o più recente di quella distribuita nel flusso, l'applicazione client non esegue l'aggiornamento. Tuttavia, se nel server viene selezionata l'opzione "force update" (Forza aggiornamento), l'aggiornamento viene eseguito a prescindere dalla versione del software.

Schema di Multifiles
Fig. 1. Uno schema della rete con Multifiles

Specifiche tecniche del flusso

Il flusso è costituito da pacchetti UDP insieme al titolo del seguente formato:

struct mulfiles_header{
    uint32_t message_type;
    uint32_t flags;
    uint32_t data_size;
    uint32_t sequence_no;
    uint32_t file_offset;
};

message_type può avere uno dei seguenti due valori:

#define MF_MTYPE_INFO 0x04030201
#define MF_MTYPE_DATA 0x04030202

I pacchetti di tipo MF_MTYPE_INFO sono pacchetti informativi che contengono informazioni relative al file distribuito, inclusi i seguenti dati:

struct mulfiles_message_info{
    uint32_t file_size;
    uint32_t fw_version;
    unsigned char md5sum[16];
    char filename[1024];
};

dimensioni del file, versione del firmware, nome del file e somma MD5 per il controllo dell'integrità. Per impostazione predefinita, i pacchetti informativi vengono inviati ogni 2 secondi.

Nei pacchetti di tipo MF_MTYPE_DATA risiede il contenuto del file distribuito. Nel titolo sono incluse le informazioni sull'offset dei dati contenuti nel pacchetto relativamente alla parte iniziale del file. L'applicazione client può inziare l'esecuzione del download senza attendere l'avvio del ciclo successivo. Questa logica consente il download dei file senza causare ulteriori ritardi dovuti alla ricerca della parte iniziale o finale del file.

La velocità della trasmissione dei dati nella rete può essere regolata mediante le opzioni della riga di comando dell'applicazione server. Per impostazione predefinita, la velocità è 100 Kbyte al secondo.

Specifiche tecniche dell'applicazione server

Opzioni della riga di comando del server:

multifiles # ./mfsrv -h
NetUP's multicast file upload utility (server). Copyright (c) 2001-2008 NetUP Inc.
www.netup.tv. Compile date: Nov  3 2008 13:22:49
 Use this utility at your own risk.
usage:
options
 [-i IP]          Multicast IP address to use. Default: 224.2.2.4
 [-p port]                UDP port to use. Default: 2222
 [-d]             Enable debug messages. Default: disabled
 [-f file]                Name of the file to send. Default: testfile.bin
 [-s speed]               Upload speed Kbytes/sec. Default: 100 Kbytes/sec
 [-t delay]               Prophylactic info messages delay, sec. Default: 2 sec
 [-u]             Setting force update flag. Default: force update flag not set
 [-a version]             Firmware version. Default: 0
 [-h]             This help

Esempio di avvio del server:

multifiles # ./mfsrv  -i 224.5.6.7 -p 1111 -f ./netup.tgz -s 100 -a 1104 -t 6
Using file:./netup.tgz file name:netup.tgz prophylactic_delay:6
Speed:102400 bytes/sec psleep: 13513
+ Sending file:netup.tgz sequence:1
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    File:netup.tgz successfully sent
+ Sending file:netup.tgz sequence:2

Come illustrato dall'esempio, il file netup.tgz viene inviato al gruppo multicast 224.5.6.7:1111 a una velocità di 100 Kbyte/s. La versione del firmware è la 1104.

Specifiche tecniche dell'applicazione client

Opzioni della riga di comando dell'applicazione client:

multifiles # ./mfcln -h
NetUP's multicast file upload utility (client). Copyright (c) 2001-2008 NetUP Inc.
www.netup.tv. Compile date: Nov  3 2008 13:22:48
 Use this utility at your own risk.
usage:
options
 [-i IP]          Multicast IP address to use. Default: 224.2.2.4
 [-p port]        UDP port to use. Default: 2222
 [-t socket wait timeout]       UDP socket timeout, sec. Default: 10 sec.
 [-d]             Enable debug messages. Default: disabled
 [-f file]        Name of the file to save. Default using filename coming from server
 [-s stat_file]   Name of the file to save stats in. Default: /tmp/mfstat.log
 [-a fw_version]  Current fw version. Download is started only if 
                  the received version is newer than current. Default: 0
 [-h]             This help

Esempio di avvio dell'applicazione client:

multifiles # ./mfcln -i 224.5.6.7 -p 1111 -a 1100
Waiting for incoming data ...
Info message received. sequence:9240 filename:netup.tgz outfilename:netup.tgz.9240 
size:5741931 bytes
Receiving data ...
Filling file to required 5741931 bytes, blocks size is:1048576
File filled. Size is:5741931 requested size is:5741931. Starting write into
First offset:1379
Prophylactic info message received. filename:netup.tgz offset:208380 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:615480 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1022580 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1431060 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1838160 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:2245260 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:2653740 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3060840 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3467940 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3875040 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:4283520 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:4690620 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:5097720 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:5506200 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:69000 size:5741931 bytes 
force update:0 fw_version:1104
File 'netup.tgz.9240' received. Checking ...
e7a646426d66b5df3318ba09f1ae33d2 - our file md5. size:5741931
e7a646426d66b5df3318ba09f1ae33d2 - received md5
MD5 check success
File 'netup.tgz.9240' checked. Success.

Come illustrato dall'esempio, il file netup.tgz viene ricevuto dal gruppo multicast 224.5.6.7:1111. La versione corrente del file è la 1100, ma la versione fornita dal server è la 1104.

Creazione del firmware

Contenuto della directory degli script:

multifiles # ls -al scripts/
total 16
drwxr-xr-x 4 root root   84 Oct 27 13:51 .
drwxr-xr-x 5 root root 4096 Oct 27 15:36 ..
-rwxr-xr-x 1 root root  115 Oct 27 13:51 createfw.sh
-rwxr-xr-x 1 root root  187 Oct 27 13:42 customup.sh
drwxr-xr-x 3 root root   35 Oct 27 13:51 firmware
-rwxr-xr-x 1 root root  889 Oct 27 13:39 update.sh

Lo script createfw.sh viene utilizzato per la creazione del firmware. Ad esempio, lo script è:

multifiles # cat scripts/createfw.sh
FWPATH="firmware"
FWNAME="mf_fw.tgz"

(cd $FWPATH; tar cvfz ../$FWNAME ./*)
echo "Firmware created. File: $FWNAME"

Come illustrato, lo script archivia il contenuto della cartella del firmware all'interno di un file mf_fw.tgz. Come descritto precedentemente, questo file viene fornito al multicast.

Nella directory scripts/firmware/ sono contenuti i file necessari per l'aggiornamento insieme allo script customup.sh che, una volta eseguito il download, elabora le azioni necessarie al dispositivo client. Di seguito, viene illustrato un esempio semplice dello script appena descritto:

multifiles # cat scripts/firmware/customup.sh
echo "Running custom upgrade shell script ... Please, wait"
echo "Copying new files ... "
cp stb_client/bin/stb_client /netup/stb_client/bin/stb_client

echo "Updating config files ... "

Come viene illustrato, lo script esegue la copia dei nuovi file e, dove richiesto, aggiorna i file di configurazione.

Funzionamento del firmware nell'applicazione client

A seguire, viene illustrato un esempio dello script che organizza la ricezione e l'elaborazione nel dispositivo client (l'esempio viene fornito da un decodificatore IP):

multifiles # cat scripts/update.sh
MFPATH="/mfupdater"
NEPATH="/netup"
DSTPATH=$MFPATH/dst
STATFILE="/tmp/mfstat.log"

# Show update splash screen
cat $MFPATH/updatesp.bmp > /dev/fb0 2>/dev/null

# get current ver
if [ -f $NEPATH/version ]; then
    export CURVER=`cat $NEPATH/version`
else
    export CURVER=0
fi


$MFPATH/mfcln -s $STATFILE -t 3 -i 224.5.6.7 -p 1111 -f $MFPATH/download.bin -a $CURVER

if [ $? -eq 0 ]; then
    echo "Updating software ... "

    # Create dst path
    mkdir $DSTPATH 2>/dev/null

    # unbzip received file into /netup
    cd $DSTPATH
    cat $MFPATH/download.bin | tar -xz

    # run custom script in received file
    cd $DSTPATH
    sh customup.sh

    # save new version
    if [ -f $STATFILE ]; then
        cat $STATFILE > $NEPATH/version
    fi

    # cleanup dst dir if required. You can do this in customup.sh

    echo "Update done. New fw version:"
    cat $NEPATH/version
fi

Come illustrato dal codice precedente, lo script elabora le seguenti fasi:

  • Acquisizione della versione del firmware corrente. Le informazioni relative alla versione sono archiviate in /netup/version
  • Avvio del download del firmware dal gruppo multicast
  • Se il download del file è stato completato correttamente, viene decompresso e viene eseguito lo script customup.sh contenuto nell'archivio. Lo script esegue le azioni richieste (copia, aggiornamento della configurazione e così via)
  • I dati della nuova versione vengono salvati nel file /netup/version. Nell'eventualità che sia ricevuta una nuova versione del firmware oppure che nel server sia impostata l'opzione "force update" (Forza aggiornamento), verrà eseguito l'aggiornamento successivo.

Creazioni binarie

Nell'archivio sono incluse le creazioni binarie pronte per le seguenti piattaforme:

  • SH-4
  • Mipsel uclibc
  • ARM9
  • PPC
  • x86

Per i produttori di decodificatori IP

Nelle forniture di decodificatori IP di base, è consigliato includere l'applicazione client (mfcln). Al momento dell'avvio di ciascun decodificatore IP è necessario eseguire l'applicazione allo scopo di verificare la presenza del flusso multicast con il firmware. L'esecuzione della verifica non impiega più di due secondi e nell'eventualità che non venga trovato alcun flusso multicast firmware o sia stato fornito un firmware anteriore, verrà eseguito un avvio ordinario privo di modifiche. Se è stata ottenuta una nuova versione del firmware, questa viene installata e durante gli avvii successivi può seguire uno schema diverso fornito dal firmware installato. Ciò consente ai decodificatori IP appena installati di essere automaticamente messi in funzione grazie all'ottenimento del firmware specifico della rete corrente.


Get Adobe Flash player