频道栏目
首页 > 资讯 > 其他综合 > 正文

嵌入式中程序升级,使用ftp shell脚本,方式

13-02-27        来源:[db:作者]  
收藏   我要投稿
这个脚本是两年前写的,基本原理是ftp服务器端有个文件列表,客户端定时把文件列表下载下来,校验一下本地文件与升级服务器上的文件是否一致,如果不一致则升级。
服务器端的文件列表
大概如下
count = 1
01=MD5=ftp路径=设备存放路径。
 
注意!看脚本是先看一下定义,然后从下往上看。
 
#!/bin/sh
#升级目录在 /update 中
#升级目录在 /update/list.ini 服务器上列表
#升级目录在 /update/list.ini_bak 服务器上列表备份
#升级目录在 /update/loc_list.int 本地文件列表
#升级目录在 /update/update_list.ini 升级文件列表
#升级目录在 /update/down/ 为升级的文件夹 保存所有下载的文件
 
 
#ip port folder 90.0.17.35 21 tgr20
#rm -rf /update/*
 
 
ftp_name="tgr20"
ftp_passwd="tgr20"
#ip=$1
#port=$2
#folder=$3
#list="list.ini"
#ftp_url="ftp://$ip:$port/"
#echo $ftp_url
#if [ $# == 3 ]
#then
#ftp_url="$ftp_url$folder/"
#fi
list="list.ini"
mkdir -p "/update"
folder="tgr20/"
ftp_url="$1/$folder"
ftp_url_para="/update/ftp_url_para"
ver="cur_ver"
if [ $# == 0 ]
then
ls $ftp_url_para > /dev/null
if [ $? != "0" ]
then
exit 0
fi
ftp_url=`cat $ftp_url_para`
fi
echo $ftp_url > $ftp_url_para
echo "url=$ftp_url"
ftp_list="$ftp_url$list"
sev_list="/update/$list"
sev_list_bak=$sev_list"bak"
loc_list="/update/loc_$list"
ftp_ver="$ftp_url$ver"
loc_ver="/usr/bin/$ver"
 
 
 
 
#ftp_file loc_file
update_list="/update/update_list.ini"
down_status="/update/status"
net_status="/update/net_status"
log="/update/log"
root_folder="/update/down"
mkdir -p $root_folder
 
 
#下载状态
#如果网络ok 0
#如果网络fail 1
#文件校验失败 2
file_value1="/update/value1"
check_fail_times="3"
 
 
 
 
 
 
#判断当前状态
#如果当前状态 检测中 0
#如果当前状态 下载中 1
#如果当前状态 校验中 2
#如果当前状态 拷贝中 3
 
 
#
fun_init_system()
{
echo "0" > down_status
echo "0" > net_status
echo "0" > file_value1
rm -rf $root_folder
rm $update_list
rm $sev_list
rm $sev_list_bak
}
 
 
# ftp_src loc_dest 
fun_ftp_get()
{
mkdir -p `dirname $2`
#wget -c --retry-connrefused -t 0 -T 5 -O /home/jerry/1234.ini  ftp://90.0.17.250:21/list.ini
#wget -c --user=$ftp_name --password=$ftp_passwd --retry-connrefused -t 0 -T 5 -O $2 $1
ret=`wget -c -T 30 -O $2 $1`
return ret
 
 
}
 
 
#下载服务器文件列表
fun_down_sev_file_list()
{
rm -rf $sev_list
fun_ftp_get $ftp_list $sev_list
# md51='md5sum' $sev_list
# rm -rf $sev_list_bak
# cp $sev_list $sev_list_bak
}
#获取本地文件列表
fun_down_loc_file_list()
{
rm -rf $loc_list
# md5sum /bin_jerry/* >> $loc_list
md5sum /usr/bin/* >> $loc_list
md5sum /usr/lib/* >> $loc_list
md5sum /lib/modules/2.6.33/* >> $loc_list
}
#比较是否需要升级
#检测列表是否有更新 1 有升级 0 没有升级
# src dest md5 mode
fun_compare_list()
{
#生成需要下载的文件列表
echo "0" > $file_value1
rm -rf $update_list
cat $sev_list | while read line
do
set word1 word2 word3 word4
set $line
src=$1
dest=$2
md5=$3
mode=$4
new_file="$src $root_folder$dest $md5 $mode"
cat $loc_list | while read line
do
# md5 app
set word5 word6
set $line
if [ $2 == $dest -a  $1 == $md5 ]
then
echo "1" > $file_value1
break 
fi 
done 
tmp=`cat $file_value1`
if [ $tmp == 0 ]
then
echo $new_file >> $update_list
fi 
echo "0" > $file_value1
done 
ls $update_list
if [ "$?" -eq "0" ]
then
echo "********************compare_result_update***************************"
return 1
fi
return 0
}
 
 
#拷贝文件
# src dest md5 mode
fun_copy_file()
{
cat $1 | while read line
do
set word1 word2 word3 word4
set $line
echo $2
echo $root_folder
# a=${a:0:32}
full_path=$2
dest_path=${full_path#$root_folder}
rm -rf $dest_path
cp -rf $2 $dest_path
done 
rm -rf $root_folder
echo "0" > $down_status
echo "______________________reboot_system______________________"
reboot
}
#md5校验
#file_name value
#0:ok 1:fail
fun_md5sum()
{
md5=`md5sum $1`
md5=${md5:0:32}
if [ $md5 == $2 ]
then
return 0
fi
return 1
}
#校验文件
# src dest md5 mode
fun_check_file()
{
echo "____________fun_check_file = $1 __________________________"
cat $1 | while read line
do
set word1 word2 word3 word4
set $line
times=0
while true;
do
fun_md5sum $2 $3
if [ "$?" == "0" ]
then
echo "check ok"
break
fi
rm -rf $2
fun_ftp_get $ftp_url$1 $2
#网络校验fail
echo "1" > $net_status
times=$((times+1))
if [ $times == $check_fail_times ]
then
fun_init_system
echo "check fail 3 return "
return 0
fi
 
 
done
done
status=`cat $net_status`
echo "netstatus = $status"
if [ $status == "0" ]
# if [ $status == "0" -o $status == "2" ]
then
echo "3" > $down_status
 
echo "start copy file..."
fun_copy_file $update_list
fi
}
 
 
#开始下载文件
# src dest md5 mode
fun_down_file()
{
echo "1" > $down_status
cat $1 | while read line
do
set word1 word2 word3 word4
set $line
fun_ftp_get $ftp_url$1 $2
chmod  $4 $2
done 
echo "2" > $down_status
fun_check_file $update_list
}
 
 
#检测是否有需要升级的文件
fun_check_update()
{
 
 
#0:ok 1:fail
#fun_md5sum()
#ftp_ver="$ftp_url$ver"
#loc_ver="/usr/bin/$ver"
 
 
 
 
 
 
fun_down_sev_file_list
fun_down_loc_file_list
fun_compare_list
if [ "$?" -eq "1" ]
then
fun_down_file $update_list
fi
}
 
 
 
 
 
 
 
 
#
fun_go_on_down_file()
{
echo "_________________go_on_down_file_____________________"
ls $sev_list_bak > /dev/null
if [ $? != 0 ]
then
echo "" > $sev_list_bak
fi
 
 
ls $sev_lis > /dev/null
if [ $? != 0 ]
then
echo "1" > $sev_list
fi
rm -rf $sev_list
fun_ftp_get $ftp_list $sev_list
a=`md5sum $sev_list`
a=${a:0:32}
b=`md5sum $sev_list_bak`
b=${b:0:32}
if [ "$a" == "$b" ]
then
ls $update_list > /dev/null
if [ $? != 0 ]
then
fun_compare_list
fi
fun_down_file $update_list
echo "_________________go_on_down_file_end_____________________"
return 0
fi
echo "_________________go_on_down_file_find_new_file__________________"
fun_check_update
cp $sev_list $sev_list_bak
echo "_________________go_on_down_file_find_new_file_end__________________"
}
 
 
#"状态检测"
#如果当前状态 检测中 0
#如果当前状态 下载中 1
#如果当前状态 校验中 2
#如果当前状态 拷贝中 3
 
 
fun_check_stauts()
{
echo "_______________fun_check_stauts____________________"
status=`cat $1`
echo "down_status:$status"
case $status in
0) fun_check_update ;;
1) fun_go_on_down_file ;;
2) fun_check_file $update_list ;;
3) fun_copy_file $update_list ;;
*) fun_check_update;;
esac
echo "_______________fun_check_status_complete____________________"
}
 
 
 
 
 
 
#如果网络ok 0
#如果网络fial 1
#如果网络 check fail 2
 
 
fun_net_ok()
{
fun_check_stauts $down_status
sleep 86400
}
fun_net_error()
{
sleep 86400
fun_check_stauts $down_status
}
fun_check_fail()
{
sleep 86400
fun_check_stauts $down_status
}
 
 
#入口函数
fun_main()
{
echo "0" > $net_status
while true;
do www.2cto.com
#查看网络状态
status=`cat $net_status`
echo "net_status : $status"
case $status in
0) fun_net_ok ;;
1) fun_net_error ;;
2) fun_check_fail ;;
*) fun_net_ok;;
esac
done
}
fun_main
 
相关TAG标签
上一篇:台积电:绝大多数7nm客户都会转向6nm_IT新闻_博客园
下一篇:最后一页
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站