NetUP MultiFiles

Система multicast-распространения файлов.
Лицензия: GPLv2, GPLv3.

Исходный код – multifiles v0.7

Обсуждение проекта на форуме NetUP о IPTV

Механизм работы пакета multifiles

Распространяемый файл циклически передается в сеть в виде UDP multicast-потока на определенный multicast-адрес (по умолчанию – 224.2.2.4, порт 2222). При этом клиент, желающий скачать этот файл, подключается к этой группе, посылая IGMP-запрос, и начинает получать этот файл. Как только получен весь файл, клиент отключается от группы и проверяет целостность полученного файла. Если проверка прошла успешно, то производится разархивирование файла (формат .tar.gz) и запуск скрипта customup.sh, который находится внутри полученного архива. Скрипт customup.sh производит обновление нужных файлов, а также другие операции, необходимые для обновления.

Использование multicast позволяет оперативно передать файл на любое количество клиентов, используя только один поток.

Стоит отметить, что клиент не производит обновление, если текущая версия ПО на клиенте такая же, как передаваемая в потоке, или более свежая. В случае если на сервере указан ключ "force update", обновление производится принудительно, вне зависимости от версии ПО.

Multifiles scheme

Схема сети при использовании пакета multifiles.

Описание потока

Поток представляет собой UDP-пакеты, которые содержат заголовок следующего формата:

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

message_type может принимать два значения:

#define MF_MTYPE_INFO 0x04030201
#define MF_MTYPE_DATA 0x04030202

Пакеты с типом MF_MTYPE_INFO представляют собой информационные пакеты и содержат информацию о передаваемом файле – в частности, следующую:

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

Размер файла, версия прошивки, имя файла и MD5-сумма для контроля целостности передачи. Информационные пакеты по умолчанию передаются с интервалом в 2 секунды.

В пакетах с типом MF_MTYPE_DATA находится содержимое передаваемого файла. В заголовке таких пакетов содержится информация о смещении блока передаваемых данных относительно начала файла. Таким образом, клиент может принимать файл с любой удобной позиции, не дожидаясь следующего цикла передачи. Такая логика позволяет максимально быстро принять файл без дополнительных задержек на поиск начала и конца файла. Скорость передачи данных в сеть можно регулировать ключами запуска сервера. По умолчанию скорость равна 100 КБайт/сек.

Описание программы-сервера

Ключи запуска сервера:

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

Пример запуска сервера:

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

Как видно из этого примера, производится передача файла netup.tgz в мультикаст-группу 224.5.6.7:1111 со скоростью 100 КБайт/сек. Версия прошивки 1104.

Описание программы-клиента

Ключи запуска клиента:

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

Пример запуска клиента:

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.

Как видно из этого примера, производится прием файла netup.tgz из мультикаст-группы 224.5.6.7:1111. Текущая версия файла 1100, а передаваемая с сервера - 1104.

Создание прошивки

Содержимое папки scripts:

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

Скрипт createfw.sh используется для создания прошивки. Пример такого скрипта:

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

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

Cкрипт архивирует содержимое папки firmware в файл mf_fw.tgz. Этот файл в дальнейшем будет передаваться через мультикаст, как описано выше.

Папка scripts/firmware/ содержит файлы, необходимые для обновления, и скрипт customup.sh, который выполняет необходимые действия на стороне клиента после скачивания. Простой пример такого скрипта:

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 ... "

Cкрипт копирует новые файлы и при необходимости обновляет конфигурационные файлы.

Работа с прошивкой на клиенте

Пример скрипта, организующего прием и обработку прошивки на клиенте (пример приведен для 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

Cкрипт выполняет следующие шаги:

  • Получает текущую версию ПО. Версия хранится в файле /netup/version;
  • Запускает получение прошивки из мультикаст-группы;
  • Если файл получен успешно, то производится его разархивирование и запуск скрипта customup.sh, находящегося в этом архиве. Этот скрипт производит необходимые действия по копированию файлов, обновлению конфигурации и т.д. (пример такого скрипта приведён выше);
  • Новый номер версии сохраняется в файл /netup/version. Следующее обновление произойдет в случае имзенения версии прошивки на сервере либо если указан ключ "force update" на сервере.

Бинарные сборки

В архиве доступны готовые бинарные сборки для следующих платформ:

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

Производителям IP STB

Предлагается включить приложение-клиент mfcln в базовую поставку IP STB. При каждом старте IP STB необходимо делать запуск для проверки наличия м ультикаст-потока с прошивкой. Такой запуск займет не более 2 секунд, если прошивки в мультикасте нет либо передается более старая прошивка. В этом случае можно производить дальнейший запуск без изменений. В случае, если из мультикаста была получена новая прошивка, производится ее установка, и дальнейший запуск уже может производиться по другой схеме, предусмотренной установленной прошивкой. Таким образом, свежеустановленные IP STB могут быть автоматически введены в работу, получив прошивку, специфичную для данной сети.