Download multifiles v0.5
Lizenz: GPLv2, GPLv3.
Die zu verteilende Datei wird in einem UDP Multicast-Stream zyklisch zum Netzwerk zu einer angegebenen Multicast-Adresse (standardmäßig 224.2.2.4 Port 2222) gesendet. Um die Firmware zu erhalten, muss der Client der Multicast-Gruppe beitreten, indem er einen IGMP-Request sendet und damit beginnt, die Datei herunterzuladen. Sobald das Download abgeschlossen ist, wird der Client von der Gruppe getrennt und die Integrität der Datei verifiziert. Wenn die Verifizierung erfolgreich ist, wird die Datei entpackt (das Format ist.tar.gz) und das Skript customup.sh wird gestartet, welches in dem gerade heruntergeladenen Archiv enthalten ist. Das Skript aktualisiert die erforderlichen Dateien und führt andere für das Update erforderliche Aktionen aus.
Die Nutzung von Multicast ermöglicht es, ohne Vorbereitung eine beliebige Anzahl von IP Set-Top-Boxen zu aktualisieren, indem nur ein Stream genutzt wird.
Der Client führt das Update nicht durch, wenn die momentane Firmwareversion diejenigen gleicht, die im Stream verteilt wird oder neuer ist. Wenn jedoch auf dem Server die Option "force update" angegeben ist, wird das Update immer, ungeachtet der Version der Software, ausgeführt.
Abb. 1. Ein Netzwerkschema mit Multifiles
Der Stream besteht aus UDP-Paketen mit einem Kennsatz in folgendem Format:
struct mulfiles_header{
uint32_t message_type;
uint32_t flags;
uint32_t data_size;
uint32_t sequence_no;
uint32_t file_offset;
};
message_type kann einen dieser beiden Werte haben:
#define MF_MTYPE_INFO 0x04030201 #define MF_MTYPE_DATA 0x04030202
Pakete vom Typ MF_MTYPE_INFO sind Informationspakete und enthalten Information über die verteilte Datei, einschließlich folgender Daten:
struct mulfiles_message_info{
uint32_t file_size;
uint32_t fw_version;
unsigned char md5sum[16];
char filename[1024];
};
Dateigröße, Firmwareversion, Dateiname und MD5-Summe für die Integritätsprüfung. Informationspakete werden standardmäßig alle 2 Sekunden gesendet.
Pakete vom Typ MF_MTYPE_DATA enthalten den Inhalt der verteilten Datei. Der Kennsatz umfasst Information über den Versatz der im Paket enthaltenen Daten in Bezug auf den Dateianfang. Der Client kann jederzeit mit dem Download der Datei beginnen, ohne mit dem Start bis zum nächsten Zyklus zu warten. Diese Logik ermöglicht es, Dateien ohne weitere Verzögerungen, die durch die Suche nach dem Dateianfang oder dem Dateiende der verursacht werden, herunterzuladen.
Die Geschwindigkeit der Datenübertragung über das Netzwerk kann durch die Kommandozeilenoptionen der Server-Anwendung reguliert werden. Standardmäßig beträgt die Geschwindigkeit 100 KB pro Sekunde.
Kommandozeilenoptionen des Servers:
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. Gebrauch: Optionen [-i IP] Zu verwendende Multicast-IP-Adresse. Standardeinstellung: 224.2.2.4 [-p port] Zu verwendender UDP-Bord. Standardeinstellung: 2222 [-d] Debug-Meldungen aktivieren. Standardeinstellung: deaktiviert [-f file] Name der zu sendenden Datei. Standardeinstellung: testfile.bin [-s speed] Upload-Geschwindigkeit KB/s. Standardeinstellung: 100 KB/s [-t delay] Prophylaktische Verzögerung von Info-Meldungen, Sekunden. Standardeinstellung: 2 Sek [-u] "force update" Flag setzen. Standardeinstellung: "force update" Flag nicht gesetzt [-a version] Firmwareversion. Standardeinstellung: 0 [-h] Diese Hilfe
Ein Beispiel für den Serverstart:
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
Wie im Beispiel zu sehen, wird die Datei netup.tgz mit einer Geschwindigkeit von 100 KB/s zur Multicast-Gruppe 224.5.6.7:1111 gesendet. Firmwareversion ist 1104.
Kommandozeilenoptionen des Clients:
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. Gebrauch: Optionen [-i IP] Zu verwendende Multicast-IP-Adresse. Standardeinstellung: 224.2.2.4 [-p port] Zu verwendender UDP-Bord. Standardeinstellung: 2222 [-t socket wait timeout] Timeout für UDP-Socket, Sek. Standardeinstellung: 10 Sek. [-d] Debug-Meldungen aktivieren. Standardeinstellung: deaktiviert [-f file] Name der zu speichernden Datei. Standardeinstellung: Vom Server bereitgestellter Dateiname [-s stat_file] Name der Datei, zur Speicherung von Statistiken. Standardeinstellung: /tmp/mfstat.log [-a fw_version] Momentane Firmwareversion. Ein Download wird nur gestartet, wenn die zu empfangende Version neuer als die momentane Version ist. Standardeinstellung: 0 [-h] Diese Hilfe
Ein Beispiel für den Clientstart:
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.
Wie im Beispiel zu sehen ist, wird die Datei netup.tgz von der Multicast-Gruppe 224.5.6.7:1111 empfangen. Die momentane Dateiversion ist 1100, aber die vom Server bereitgestellte Version ist 1104.
Inhalt des Skript-Verzeichnisses:
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
Das Skript createfw.sh wird zur Erstellung der Firmware verwendet. Ein Beispiel für dieses Skript ist:
multifiles # cat scripts/createfw.sh FWPATH="firmware" FWNAME="mf_fw.tgz" (cd $FWPATH; tar cvfz ../$FWNAME ./*) echo "Firmware created. File: $FWNAME"
Wie zu sehen ist, archiviert das Skript den Inhalt des Firmware-Verzeichnisses in der Datei mf_fw.tgz . Diese Datei wird, wie oben beschrieben, über Multicast zur Verfügung gestellt.
Das Verzeichnis scripts/firmware/enthält die für das Update erforderlichen Dateien und das Skript customup.sh, das nach dem Download die erforderlichen Aktionen auf dem Clientgerät ausführt. Ein einfaches Beispiel für solch ein Skript ist unten angeführt:
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 ... "
Wie zu sehen ist, kopiert das Skript die neuen Dateien und aktualisiert, falls erforderlich, die Konfigurationsdateien.
Ein Beispiel eines Skripts, das den Empfang und die Verarbeitung der Firmware auf dem Clientgerät organisiert (das Beispiel bezieht sich auf eine IP STB):
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
Wie im Code oben zu sehen ist, führt das Skript folgende Schritte aus:
Das Archiv umfasst fertige Binary Builds für folgende Plattformen:
Es wird empfohlen, die Client-Anwendung (mfcln) in die IP STB Grundausstattung einzubeziehen. Es ist bei jedem Start der IP STB erforderlich diese Anwendung auszuführen, um mit der Firmware das Vorhandensein des Multicast-Streams zu überprüfen. Die Überprüfung dauert nicht länger als 2 Sekunden und wenn kein Firmware-Multicast-Stream oder eine ältere Firmware gefunden werden, wird ein gewöhnlicher Start ausgeführt, ohne irgendwelche Veränderungen vorzunehmen. Wenn eine neue Firmwareversion bezogen wurde, wird diese installiert und die folgenden Starts können nach einem veränderten, durch die installierte Firmware bereitgestelltem Schema erfolgen. Dies ermöglicht die automatische Inbetriebnahme gerade installierter IP STBs, da die Firmware speziell für das momentane Netzwerk erhalten wird.