2011-01-24 16:29

[Shell] 透過版本編號與遠端的 package 同步

有一個的任務是要將一個用 tar 封裝的目錄從 server 端同步到 client 上,然後有機個考量點:
  • 必須確保 client 永遠都讀得到資料
  • 最小的資料中斷
  • 最小的硬碟存取
  • 必要的錯誤處理


建立 server 端的 package
  1. #!/bin/bash 
  2. # package_build.sh 
  3.  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin 
  5. export PATH 
  6.  
  7. PROJECT_NAME=metadata 
  8. SOURCE_PATH=/var/projects 
  9. PORTING_PATH=/var/www 
  10.  
  11. PACKAGE_NAME=$PROJECT_NAME.$(/bin/date +%s) 
  12. OLD_PACKAGE=$(find $PORTING_PATH -name "$PROJECT_NAME.*.tgz") 
  13.  
  14. # Create Package 
  15. cd $SOURCE_PATH/$PROJECT_NAME 
  16. tar -zcf $PORTING_PATH/$PACKAGE_NAME.tgz ./* 
  17.  
  18. # Update version number to release 
  19. echo $PACKAGE_NAME > $PORTING_PATH/$PROJECT_NAME.latest 
  20.  
  21. # remove old version 
  22. #rm -f $OLD_PACKAGE 
  23.  
  24. echo -e "<< $PACKAGE_NAME package complete >>" 
  25. exit 0 


client 端的同步處理
  1. #!/bin/bash 
  2. # package_sync.sh 
  3.  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin 
  5. export PATH 
  6.  
  7. REMOTE_URL=http://remote_site/ 
  8. TARGET_PATH=/var/www 
  9. PROJECT_NAME=metadata 
  10. PROJECT_PATH=$TARGET_PATH/$PROJECT_NAME 
  11.  
  12.  
  13. # get now version 
  14. NOW_VERSION=$PROJECT_NAME.0000000000 
  15. if [ -h "$PROJECT_PATH" ] && [ -d "$PROJECT_PATH" ]; then 
  16.    NOW_VERSION=$(readlink $PROJECT_PATH) 
  17. fi 
  18. echo -e 'NOW_VERSION' $NOW_VERSION 
  19.  
  20.  
  21. # get remote version  
  22. REMOTE_VERSION=$(curl -f $REMOTE_URL/$PROJECT_NAME.latest |tr -d '\r') 
  23. if [ "j$?" != "j0" ]; then  exit 1; fi 
  24. echo -e 'REMOTE_VERSION' $REMOTE_VERSION 
  25.  
  26.  
  27. # deff version, not deff goto exit. 
  28. if [ ! "$NOW_VERSION" \< "$REMOTE_VERSION" ]; then  exit 0; fi 
  29.  
  30.  
  31.  
  32. echo -e "Update package" 
  33.  
  34. # create now version folder 
  35. mkdir -p $TARGET_PATH/$REMOTE_VERSION 
  36. if [ "$?" != "0" ]; then  exit 1; fi 
  37.  
  38. # Download Package 
  39. cd $TARGET_PATH/$REMOTE_VERSION 
  40. curl -o $PROJECT_NAME.tgz $REMOTE_URL/$REMOTE_VERSION.tgz 
  41. if [ "$?" != "0" ]; then  exit 1; fi 
  42.  
  43. # Decompression Package 
  44. tar -zxf $PROJECT_NAME.tgz 
  45. rm -f $PROJECT_NAME.tgz 
  46.  
  47. # Update version link 
  48. cd $TARGET_PATH 
  49. ln -sfn $REMOTE_VERSION $PROJECT_NAME 
  50.  
  51. # remove old version 
  52. rm -rf $NOW_VERSION 
  53.  
  54. exit 0; 

0 回應: