repo-update 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/bin/bash
  2. set -e;
  3. if [[ "$1" != "" ]];then
  4. host_to_sync="$1";
  5. force=true;
  6. else
  7. force=false;
  8. fi;
  9. root="$(readlink -f $(dirname $BASH_SOURCE)/..)";
  10. . $root/etc/repo.conf
  11. . $root/etc/sites.conf
  12. for val in "${sites[@]}"; do
  13. unset site;
  14. declare -A site;
  15. eval "site=($val)";
  16. host=${site[host]};
  17. user=${site[username]};
  18. if ! $force || [[ "$host_to_sync" == "all" ]] || [[ "$host_to_sync" == "$user@$host" ]];then
  19. echo "Updating $user@$host";
  20. case ${site[type]} in
  21. rsync)
  22. rsyncd(){
  23. echo -e "\t\tSyncing $1";
  24. expect -c "
  25. set timeout 1
  26. log_user 0
  27. spawn rsync -ra --exclude=\".gitignore\" --exclude=\"$reponame.db\" $1 $user@$host:${site[root]};
  28. expect {
  29. yes/no {
  30. send yes\r;
  31. exp_continue
  32. }
  33. password: {
  34. send $(echo ${site[password]} | base64 --decode | gpg -d -q --no-mdc-warning)\r
  35. set timeout -1
  36. }
  37. eof {
  38. exit
  39. }
  40. }
  41. ";
  42. }
  43. echo -e "\tUploading files to ${site[root]}";
  44. rsyncd $root/skel/;
  45. rsyncd $root/repo/latest/;
  46. echo -e "\tDone.";
  47. ;;
  48. ssh)
  49. escp(){
  50. length=$(($#-1));
  51. files=${@:1:$length};
  52. expect -c "
  53. set timeout 1
  54. log_user 0
  55. spawn scp -r $files \"$user@$host:${site[root]}/${!#}\"
  56. expect {
  57. yes/no {
  58. send yes\r;
  59. exp_continue
  60. }
  61. password: {
  62. send $(echo ${site[password]} | base64 --decode | gpg -d -q --no-mdc-warning)\r
  63. set timeout -1
  64. }
  65. eof {
  66. exit
  67. }
  68. }";
  69. }
  70. essh(){
  71. args="$@";
  72. expect -c "
  73. set timeout 1
  74. log_user 0
  75. spawn ssh $user@$host $args
  76. expect {
  77. yes/no {
  78. send yes\r;
  79. exp_continue
  80. }
  81. password: {
  82. send $(echo ${site[password]} | base64 --decode | gpg -d -q --no-mdc-warning)\r
  83. set timeout -1
  84. }
  85. eof {
  86. exit
  87. }
  88. }";
  89. }
  90. upload_local_dir(){
  91. find $root/$1 -mindepth 1 | while read file; do
  92. if [ -f "$file" ] && [[ "$(basename $file)" != '.gitignore' ]] && [[ "$(basename $file)" != '$reponame.db' ]];then
  93. echo -e "\t\tF: $(basename $file)";
  94. nfile=${file:((${#root}+${#1}+2))};
  95. escp $file $nfile;
  96. elif [ -d "$file" ];then
  97. file=${file:((${#root}+${#1}+2))};
  98. echo -e "\t\tD: $file";
  99. essh mkdir -p ${site[root]}/$2/$file;
  100. fi;
  101. done;
  102. }
  103. echo -e "\tUploading files to ${site[root]}";
  104. essh mkdir -p ${site[root]}/;
  105. upload_local_dir skel;
  106. if $force; then
  107. upload_local_dir repo/latest;
  108. else
  109. upload_local_dir repo/updates;
  110. ls -l $root/repo/latest/ | egrep '^d' | awk '{print $9}' | while read arch; do
  111. if [ -d "$root/repo/latest/$arch" ];then
  112. escp $root/repo/latest/$arch/$reponame.db.tar.gz /$arch/$reponame.db.tar.gz;
  113. essh cd ${site[root]}/$arch && rm -f $reponame.db && ln -s $reponame.db.tar.gz $reponame.db;
  114. fi;
  115. done;
  116. fi;
  117. echo -e "\tDone.";
  118. ;;
  119. *)
  120. echo -e "\tType '${site[type]}' not implemented.";
  121. esac;
  122. fi;
  123. done;
  124. if ! $force; then
  125. ls -l $root/repo/updates/ | egrep '^d' | awk '{print $9}' | while read arch; do
  126. rm -f $root/repo/updates/$arch/*.pkg.tar.xz;
  127. done;
  128. fi;