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

来源:互联网 发布:hadoop与java项目结合 编辑:程序博客网 时间:2024/06/13 22:24

这个脚本是两年前写的,基本原理是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
#查看网络状态
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