tazpkg diff modules/upgrade @ rev 836
Add module "upgrade"; make bullet-proof code to work with "root" ("recharge" and "upgrade" modules); re-make depends/rdepends commands.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Sat Aug 15 17:41:08 2015 +0300 (2015-08-15) |
parents | |
children | a02e36d44d06 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/modules/upgrade Sat Aug 15 17:41:08 2015 +0300 1.3 @@ -0,0 +1,209 @@ 1.4 +#!/bin/sh 1.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg 1.6 +# upgrade - TazPkg module 1.7 +# Check for upgrades and make system up-to-date 1.8 + 1.9 + 1.10 +# Options: 1.11 + 1.12 +# Environment variables: 1.13 +# root Root of the packages DB 1.14 +# check Only check for upgrades 1.15 +# install Check and install all upgraded packages 1.16 + 1.17 + 1.18 +# Connect function libraries 1.19 +. /lib/libtaz.sh 1.20 + 1.21 + 1.22 + 1.23 + 1.24 +# Get TazPkg working environment 1.25 +# ------------------------------ 1.26 + 1.27 +[ ! -d "$root/etc/slitaz" ] && mkdir -p "$root/etc/slitaz" 1.28 +[ ! -e "$root/etc/slitaz/slitaz.conf" ] && cp /etc/slitaz/slitaz.conf "$root/etc/slitaz" 1.29 +[ ! -e "$root/etc/slitaz/tazpkg.conf" ] && cp /etc/slitaz/tazpkg.conf "$root/etc/slitaz" 1.30 +[ ! -e "$root/etc/slitaz-release" ] && echo 'cooking' > "$root/etc/slitaz-release" 1.31 + 1.32 +# Read configuration 1.33 +if [ -n "$root" ]; then 1.34 + # Patch external conf files to correctly handle --root value 1.35 + slitaz_conf=$(mktemp); cp "$root/etc/slitaz/slitaz.conf" $slitaz_conf 1.36 + tazpkg_conf=$(mktemp); cp "$root/etc/slitaz/tazpkg.conf" $tazpkg_conf 1.37 + sed -i "s| /| $root/|g; s|\"/|\"$root/|g" $slitaz_conf $tazpkg_conf 1.38 + . $slitaz_conf; . $tazpkg_conf; rm $slitaz_conf $tazpkg_conf 1.39 +else 1.40 + . /etc/slitaz/slitaz.conf; . /etc/slitaz/tazpkg.conf 1.41 +fi 1.42 + 1.43 + 1.44 + 1.45 + 1.46 +# Functions 1.47 +# --------- 1.48 + 1.49 +# Get repositories priority using $PKGS_DB/priority. 1.50 +# In this file undigest repos are called by their names and main mirror 1.51 +# by 'main'. Sort order: priority 1.52 + 1.53 +look_for_priority() { 1.54 + [ -s "$PKGS_DB/priority" ] && priority=$(cat $PKGS_DB/priority) 1.55 + 1.56 + for rep in main $(ls $PKGS_DB/undigest 2>/dev/null); do 1.57 + if [ ! -s "$PKGS_DB/priority" ] || ! grep -q ^$rep$ $PKGS_DB/priority; then 1.58 + priority=$(echo -e "$priority\n$rep") 1.59 + fi 1.60 + done 1.61 + 1.62 + priority=$(echo "$priority" | sed '/^$/d' | \ 1.63 + while read line; do 1.64 + case $line in 1.65 + (main) echo $PKGS_DB;; 1.66 + (*) echo $PKGS_DB/undigest/$line;; 1.67 + esac 1.68 + done) 1.69 +} 1.70 + 1.71 + 1.72 + 1.73 + 1.74 +time="$(date +%s)" 1.75 + 1.76 +# Recharge packages databases (if necessary) (respects "root" value) 1.77 +tazpkg recharge >&2 1.78 + 1.79 +echo -n > $UP_LIST 1.80 +blocked_counter=$(mktemp) 1.81 +tmp_up_list=$(mktemp) 1.82 + 1.83 +look_for_priority 1.84 +repo_number=1 1.85 +for repo in $priority; do 1.86 + if [ "$repo" == "$PKGS_DB" ]; then 1.87 + repo_name='Main' 1.88 + else 1.89 + repo_name="$(basename "$repo")" 1.90 + fi 1.91 + 1.92 + [ ! -f "$repo/packages.info" ] && continue 1.93 + { 1.94 + cat $BLOCKED | awk '{printf "%s\t%s\n", $1, "b"}'; 1.95 + cat $PKGS_DB/installed.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "i", $2, $9}'; 1.96 + cat $repo/packages.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "p", $2, $9}' 1.97 + } | sort -t$'\t' -k1,1 | awk -F$'\t' \ 1.98 + -vnewbuild="$(_ 'New build')" -vcolornewbuild="$(emsg '<c 34>')" \ 1.99 + -vnewver='→ ' -vcolornewver="$(emsg '<c 32>')" \ 1.100 + -vblocked=" ($(_ 'Blocked'))" -vcolorblocked="$(emsg '<c 31>')" \ 1.101 + -vcolor0="$(emsg '</c>')" \ 1.102 + -vreponum=$repo_number -vreponame=$repo_name \ 1.103 + -vuplist="$UP_LIST" -vblocked_counter="$blocked_counter" \ 1.104 +'{ 1.105 + 1.106 + if ($1 != p) { 1.107 + if (vi && vp) { 1.108 + bb = (b=="") ? "i" : "b" 1.109 + if ("" vi != vp) { # important: compare as strings 1.110 + startc = (b=="") ? colornewver : colorblocked; 1.111 + printf "%s\t%s\t%s\t%s\t%s%s%s%s%s\t%s\n", p, vi, reponum, reponame, startc, newver, vp, b, color0, bb; 1.112 + print p >> uplist; 1.113 + if (b!="") printf 1 >> blocked_counter; 1.114 + } else if (mi != mp) { 1.115 + startc = (b=="") ? colornewbuild : colorblocked; 1.116 + printf "%s\t%s\t%s\t%s\t%s%s%s%s\t%s\n", p, vi, reponum, reponame, startc, newbuild, b, color0, bb; 1.117 + print p >> uplist; 1.118 + if (b!="") printf 1 >> blocked_counter; 1.119 + } 1.120 + } 1.121 + p = $1; b = b1 = b2 = vi = mi = vp = mp = ""; 1.122 + } 1.123 + if ($2 == "b") { b = blocked; b1 = bl1; b2 = bl2; } 1.124 + if ($2 == "i") { vi = $3; mi = $4; } 1.125 + if ($2 == "p") { vp = $3; mp = $4; } 1.126 +}' >> $tmp_up_list 1.127 + 1.128 + repo_number=$((repo_number + 1)) 1.129 + 1.130 +done 1.131 + 1.132 +case "$output" in 1.133 + html) 1.134 + cat <<EOT 1.135 +<table class="wide zebra"> 1.136 + <thead> 1.137 + <tr><td>$(_ 'Package')</td><td>$(_ 'Repository')</td><td>$(_ 'Version')</td><td>$(_ 'Status')</td></tr> 1.138 + </thead> 1.139 + <tbody> 1.140 +EOT 1.141 + sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' '{ 1.142 + if($4=="Main"){repoicon="slitaz"}else{repoicon="web"} 1.143 + if($6=="b"){pkgicon="pkgib"}else{pkgicon="pkgi"} 1.144 + 1.145 + printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"/>", $1; 1.146 + printf "<a data-icon=\"%s\" href=\"?info=%s\">%s</a></td>", pkgicon, $1, $1; 1.147 + printf "<td><span data-icon=\"%s\">%s</span></td>", repoicon, $4; 1.148 + printf "<td>%s</td>", $2; 1.149 + printf "<td>%s</td></tr>\n", $5; 1.150 + }' 1.151 + echo '</tbody></table>' ;; 1.152 + *) 1.153 + emsg "<n>$(_ 'Package')<i 26>$(_ 'Repository')<i 38>$(_ 'Version')<i 49>$(_ 'Status')<->" 1.154 + sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' \ 1.155 + '{printf "%-24s %-11s %-10s %s\n", $1, $4, $2, $5}';; 1.156 +esac 1.157 + 1.158 +sed -i /^$/d $UP_LIST 1.159 +upnb=$(wc -l < $UP_LIST) 1.160 +pkgs=$(wc -l < $PKGS_DB/installed.info) 1.161 +time=$(($(date +%s) - $time)) 1.162 +if [ "$upnb" -eq 0 ]; then 1.163 + install="n" 1.164 + _ 'System is up-to-date...' 1.165 +fi 1.166 + 1.167 +if [ "$upnb" -ne 0 ]; then 1.168 + blocked_count="$(wc -m < $blocked_counter)" 1.169 + 1.170 + blocked="$(_p \ 1.171 + '%s blocked' \ 1.172 + '%s blocked' $blocked_count \ 1.173 + $blocked_count)" 1.174 + 1.175 + footer "$(_p \ 1.176 + 'You have %s available upgrade (%s)' \ 1.177 + 'You have %s available upgrades (%s)' $upnb \ 1.178 + $upnb "$blocked")" 1.179 +fi 1.180 +emsg "$(_p \ 1.181 + '%s installed package scanned in %ds' \ 1.182 + '%s installed packages scanned in %ds' $pkgs \ 1.183 + "<c 32>$pkgs</c>" $time)" 1.184 + 1.185 + 1.186 +# Clean 1.187 +rm $blocked_counter $tmp_up_list 1.188 + 1.189 +# Pkgs to upgrade ? Skip, let install them all, or ask user 1.190 +[ -n "$check" ] && exit 0 1.191 +if [ "$upnb" -gt 0 ]; then 1.192 + if [ -n "$install" ]; then 1.193 + answer=0 1.194 + else 1.195 + confirm "$(_ 'Do you wish to install them now? (y/N)')" 1.196 + answer=$? 1.197 + fi 1.198 + case "$answer" in 1.199 + 0) 1.200 + for pkg in $(cat $UP_LIST); do 1.201 + echo 'y' | tazpkg -gi "$pkg" --forced #--reason="upgrade" 1.202 + done 1.203 + # List is generated each time and must be cleaned so 1.204 + # tazpkg-notify doesn't find upgrades anymore. 1.205 + rm $UP_LIST; touch $UP_LIST ;; 1.206 + *) 1.207 + _ 'Leaving without any upgrades installed.' 1.208 + newline 1.209 + exit 0 ;; 1.210 + esac 1.211 +fi 1.212 +newline