tazpkg annotate modules/recharge @ rev 846
Remove "busybox" "prefixes" (thanks llev)
We used "busybox wget", etc. to be sure we called Busybox's "wget", not any other "wget". Workaround already done in "getenv" module.
We used "busybox wget", etc. to be sure we called Busybox's "wget", not any other "wget". Workaround already done in "getenv" module.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Fri Oct 09 13:14:01 2015 +0300 (2015-10-09) |
parents | a02e36d44d06 |
children | d62dc010e0ee |
rev | line source |
---|---|
al@834 | 1 #!/bin/sh |
al@834 | 2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg |
al@834 | 3 # recharge - TazPkg module |
al@834 | 4 # Recharge packages databases from a mirror |
al@834 | 5 |
al@834 | 6 |
al@834 | 7 # Options: |
al@834 | 8 # [main|<repository>] Repository name to recharge (all if empty) |
al@834 | 9 |
al@834 | 10 # Environment variables: |
al@834 | 11 # root Root of the packages DB |
al@834 | 12 # UA User Agent string ("TazPkg-<version>") |
al@834 | 13 |
al@834 | 14 |
al@834 | 15 # Connect function libraries |
al@834 | 16 . /lib/libtaz.sh |
al@834 | 17 |
al@836 | 18 # Get TazPkg working environment |
al@840 | 19 . @@MODULES@@/getenv |
al@834 | 20 |
al@834 | 21 |
al@836 | 22 |
al@836 | 23 |
al@834 | 24 # Functions |
al@834 | 25 # --------- |
al@834 | 26 |
al@834 | 27 # Download a file from specified mirror |
al@834 | 28 |
al@836 | 29 get_from_mirror() { |
al@836 | 30 case "$mirror" in |
al@836 | 31 http://* | https://* | ftp://*) |
al@846 | 32 wget -c -q -T 30 -U "$UA" "$mirror$1" 2>/dev/null;; |
al@836 | 33 *) |
al@836 | 34 ln -sf "$mirror$1" .;; |
al@836 | 35 esac |
al@836 | 36 status |
al@834 | 37 } |
al@834 | 38 |
al@834 | 39 |
al@834 | 40 # When recharging errors occur |
al@834 | 41 |
al@834 | 42 recharging_failed() { |
al@834 | 43 # Restore database from bak files |
al@834 | 44 action 'Restoring database files...' |
al@834 | 45 [ -e 'ID' -a ! -e 'ID.bak' ] && rm ID |
al@834 | 46 [ -e 'IDs' -a ! -e 'IDs.bak' ] && rm IDs |
al@840 | 47 for file in $(ls "$1"/*.bak); do |
al@840 | 48 mv -f "$file" "${file%.bak}" |
al@834 | 49 done |
al@834 | 50 status |
al@834 | 51 |
al@834 | 52 footer "$(colorize 31 "$(_ 'Recharging failed')")" |
al@834 | 53 } |
al@834 | 54 |
al@834 | 55 |
al@834 | 56 |
al@834 | 57 |
al@834 | 58 REPO="$1" |
al@834 | 59 |
al@834 | 60 # What to recharge: main, or all, or selected undigest |
al@834 | 61 case "$REPO" in |
al@834 | 62 main) repo_to_recharge="$PKGS_DB";; |
al@834 | 63 '') repo_to_recharge="$PKGS_DB $PKGS_DB/undigest/*";; |
al@834 | 64 *) repo_to_recharge="$PKGS_DB/undigest/$REPO" |
al@834 | 65 if [ ! -d "$repo_to_recharge" ]; then |
al@834 | 66 _ "Repository \"%s\" doesn't exist." "$repo_to_recharge" >&2 |
al@834 | 67 exit 1 |
al@834 | 68 fi |
al@834 | 69 ;; |
al@834 | 70 esac |
al@834 | 71 |
al@834 | 72 for path in $repo_to_recharge; do |
al@846 | 73 [ ! -s "$path/mirror" ] && continue # skip |
al@840 | 74 cd "$path" |
al@836 | 75 # Mirror URL will have a trailing slash |
al@840 | 76 mirror=$(cat mirror); mirror="${mirror%/}/" |
al@834 | 77 |
al@834 | 78 # Repository name |
al@834 | 79 if [ "$path" == "$PKGS_DB" ]; then |
al@834 | 80 repo_name='Main' |
al@834 | 81 else |
al@834 | 82 repo_name="$(_n 'Undigest %s' "$(basename "$path")")" |
al@834 | 83 fi |
al@834 | 84 |
al@834 | 85 title 'Recharging repository "%s"' "$repo_name" |
al@834 | 86 |
al@834 | 87 # Don't let ID be a symlink when using local repository. |
al@834 | 88 if [ -h ID ]; then mv -f ID ID.lnk; cat ID.lnk > ID; rm ID.lnk; fi |
al@834 | 89 if [ -h IDs ]; then mv -f IDs IDs.lnk; cat IDs.lnk > IDs; rm IDs.lnk; fi |
al@834 | 90 |
al@834 | 91 [ -f ID ] && mv ID ID.bak # Compatibility with "old" ID |
al@834 | 92 [ -f IDs ] && mv IDs IDs.bak |
al@836 | 93 action 'Checking...' |
al@836 | 94 get_from_mirror IDs |
al@836 | 95 |
al@834 | 96 [ -e 'IDs' ] && awk '{print $1}' IDs > ID # Compatibility with "old" ID |
al@836 | 97 [ -e 'IDs' ] && _ 'Database timestamp: %s' "$(date -d "@$(awk '{print $2}' IDs)" "+%x %R")" |
al@834 | 98 |
al@834 | 99 # Check if recharging is needed |
al@840 | 100 if [ -f 'IDs' ] && [ -f 'packages.info' ] && [ -f 'files.list.lzma' ] && \ |
al@840 | 101 cmp -s IDs IDs.bak; then |
al@834 | 102 footer "$(_ 'Repository "%s" is up to date.' "$repo_name")" |
al@834 | 103 rm IDs.bak ID.bak |
al@834 | 104 continue |
al@834 | 105 fi |
al@834 | 106 rm IDs.bak ID.bak 2>/dev/null |
al@834 | 107 |
al@834 | 108 action 'Creating backup of the last packages list...' |
al@834 | 109 for i in packages.desc packages.$SUM packages.txt packages.list \ |
al@834 | 110 packages.equiv files.list.lzma extra.list mirrors packages.info; do |
al@834 | 111 [ -f "$i" ] && mv -f $i $i.bak 2>/dev/null |
al@834 | 112 done |
al@840 | 113 # Always "[ Done ]" |
al@840 | 114 :; status |
al@834 | 115 |
al@834 | 116 # Download and extract bundle: extra.list, mirrors, files-list.md5, |
al@834 | 117 # packages.{info,desc,md5,txt,list,equiv} |
al@834 | 118 bundle='bundle.tar.lzma' |
al@840 | 119 action 'Getting "%s"...' "$bundle" |
al@840 | 120 get_from_mirror "$bundle" |
al@834 | 121 if [ -f "$bundle" ]; then |
al@846 | 122 tar -xaf "$bundle"; rm "$bundle" |
al@834 | 123 else |
al@840 | 124 recharging_failed "$path"; continue |
al@834 | 125 fi |
al@834 | 126 |
al@834 | 127 # Download files.list.lzma |
al@834 | 128 files_local='files.list.lzma'; files_remote='files-list.lzma' |
al@834 | 129 if [ -e "$files_local.bak" ]; then |
al@840 | 130 md5sum "$files_local.bak" | awk '{printf $1}' > files-list.md5.bak |
al@834 | 131 if cmp -s files-list.md5 files-list.md5.bak; then |
al@840 | 132 mv "$files_local.bak" "$files_remote" |
al@834 | 133 else |
al@840 | 134 action 'Getting "%s"...' "$files_remote" |
al@840 | 135 get_from_mirror "$files_remote" |
al@834 | 136 fi |
al@834 | 137 else |
al@840 | 138 action 'Getting "%s"...' "$files_remote" |
al@840 | 139 get_from_mirror "$files_remote" |
al@834 | 140 fi |
al@834 | 141 |
al@834 | 142 if [ ! -e "$files_remote" ]; then |
al@840 | 143 recharging_failed "$path"; continue |
al@834 | 144 fi |
al@840 | 145 mv -f "$files_remote" "$files_local" |
al@834 | 146 |
al@834 | 147 # Remove old database files (but packages.list.bak, extra.list.bak) |
al@834 | 148 for i in packages.desc packages.$SUM packages.txt packages.equiv \ |
al@834 | 149 files.list.lzma mirrors packages.info files-list.md5; do |
al@834 | 150 [ -f "$i.bak" ] && rm $i.bak 2>/dev/null |
al@834 | 151 done |
al@834 | 152 |
al@834 | 153 footer "$(_ 'Last database is ready to use.')" |
al@834 | 154 |
al@834 | 155 # Check diff |
al@834 | 156 if [ -f 'packages.list.bak' ]; then |
al@834 | 157 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff |
al@834 | 158 rm packages.list.bak |
al@834 | 159 if [ -f 'extra.list.bak' ]; then |
al@834 | 160 if [ -f 'extra.list' ]; then |
al@840 | 161 awk -F'|' '{print $1 " (extra)"}' extra.list > extra.list1 |
al@834 | 162 awk -F'|' '{print $1 " (extra)"}' extra.list.bak > extra.list1.bak |
al@834 | 163 diff -u extra.list1.bak extra.list1 | grep ^+[a-z] >> packages.diff |
al@834 | 164 rm extra.list.bak extra.list1 extra.list1.bak |
al@834 | 165 else |
al@834 | 166 mv extra.list.bak extra.list |
al@834 | 167 fi |
al@834 | 168 fi |
al@834 | 169 sed -i s/+// packages.diff |
al@834 | 170 |
al@834 | 171 new_pkgs=$(wc -l < packages.diff) |
al@834 | 172 if [ "$new_pkgs" -gt 0 ]; then |
al@834 | 173 title 'Mirrored packages diff' |
al@834 | 174 cat packages.diff |
al@834 | 175 footer "$(emsg "$(_p \ |
al@834 | 176 '%s new package on the mirror.' \ |
al@840 | 177 '%s new packages on the mirror.' "$new_pkgs" \ |
al@834 | 178 "<c 32>$new_pkgs</c>")")" |
al@834 | 179 fi |
al@834 | 180 else |
al@834 | 181 longline "$(_ "Note that next time you recharge the list, a list of \ |
al@834 | 182 differences will be displayed to show new and upgradeable packages.")" |
al@834 | 183 fi |
al@834 | 184 done |
al@834 | 185 newline |
al@840 | 186 |
al@840 | 187 # Close tazpkg-notify |
al@840 | 188 echo "quit" > /tmp/tazpkg-notify.fifo |