文档说明?/p>
本文档简述了
openwrt sdk
的升级功能流程,从页面传入升级文件到升级文件检测,?/p>
到调用升级脚本进行升级,
升级完成后,
进行系统重启?/p>
最后简述了如何添加升级文件标识?/p>
标识包括自己定义的字段,
以及升级软件?/p>
md5
值?/p>
达到防止用户用其?/p>
openwrt sdk
编译
出来的固件刷新我们的系统,以及防止升级软件被破坏?/p>
文档需要用到的文件及在
sdk
中的路径(某些文件路径可能随项目的不同而改动)
?/p>
./package/ralink/ui/luci-mtk/src/modules/admin-full/luasrc/controller/admin/system.lua
./target/linux/ramips/image/ Makefile
./package/base-files/files/lib/upgrade/common.sh
./package/base-files/files/lib/functions.sh
./package/base-files/files/sbin/sysupgrade
./target/linux/ramips/base-files/lib/ramips.sh
./target/linux/ramips/base-files/lib/upgrade/platform.sh
文档正文?/p>
1.
从页面接受传过来的升级文?/p>
作为整个流程的开始,功能实现在文?/p>
system.lua
中?/p>
这是一?/p>
lua
文件,很容易?/p>
function
index
函数中找到系统升级功能的入口函数?/p>
action_flashops
。在这个函数中首先通过
fp
=
io.open(image_tmp,
"w")
打开升级临时文件?/p>
/tmp/firmware.img
,打开后通过
fp:write(chunk)
写入页面传进来的升级文件。到这里,接?/p>
升级文件完成
?/p>
2.
检测升级文件的合法?/p>
实现同样在文?/p>
system.lua
中?/p>
在函?/p>
image_supported()
中进行检测,这个函数通过
image
magic
number
来检测升级文?/p>
是否合法。函?/p>
image_supported()
会调?/p>
platform.sh
脚本中的
platform_check_image
函数?/p>
platform_check_image
函数调用
ramips.sh
脚本中的
ramips_board_name
函数,获?/p>
board
name
?/p>
ramips_board_name
函数从文?/p>
/tmp/sysinfo/board_name
中获?/p>
board name
?/p>
若没
有则?/p>
unknown
,并返回给调用者,我用的板?/p>
ralink-soc
?/p>
platform_check_image
函数继续
调用
common.sh
脚本中的
get_magic_long
函数?/p>
用以获取升级文件
magic
?/p>
就是升级文件?/p>
4
?/p>
?/p>
get_magic_long
函数
调用
common.sh
脚本中的
get_image
函数用以
获取?/p>
?/p>
/tmp/firmware.img
内容,其实就?/p>
cat
/tmp/firmware.img.
获取到的内容,通过
dd
bs=4
count=1
,来获取?/p>
4
位,最后通过
hexdump -v -n 4 -e '1/1 "%02x"'
处理以十六进制编码返?/p>
调用者?/p>
获取到的升级文件
magic
?/p>
?/p>
platform_check_image
函数中与
27051956
做对比,
?/p>
个值是在固件编译的时候已经定好了的。如果相等,就是合法的升级文件,继续升级动作?/p>
不相等则为非法升级文件,
做一些后续处理并终止升级动作?/p>
到这里检测升级文件合法性完
成?/p>
3.
检测升级文件不合法后的处理
实现同样在文?/p>
system.lua
中?/p>
检测到不合法后?/p>
通过
nixio.fs.unlink(image_tmp)
来删除临时文?/p>
/tmp/firmware.img
?/p>
并通过
image_invalid = true
,设置检测失败,用以通知页面显示提示信息。终止升级。处理完成?/p>