cookutils rev 1059

modules/pkgdb: provide "atomic" update now
author Aleksej Bobylev <al.bobylev@gmail.com>
date Tue May 29 04:09:44 2018 +0300 (2018-05-29)
parents ea288d4f994f
children 3911a2292888
files lighttpd/index.cgi modules/pkgdb
line diff
     1.1 --- a/lighttpd/index.cgi	Fri May 18 14:12:41 2018 +0300
     1.2 +++ b/lighttpd/index.cgi	Tue May 29 04:09:44 2018 +0300
     1.3 @@ -491,8 +491,10 @@
     1.4  				-e 's#Success$#<i>Success</i>#' \
     1.5  				-e 's#\([^a-z]\)ok$#\1<i>ok</i>#' \
     1.6  				-e 's#\([^a-z]\)yes$#\1<i>yes</i>#' \
     1.7 +				-e 's#: \(YES.*\)#: <i>\1</i>#' \
     1.8  				-e 's#\([^a-z]\)ON$#\1<i>ON</i>#' \
     1.9  				-e 's#\([^a-z]\)no$#\1<u>no</u>#' \
    1.10 +				-e 's#: \(NO.*\)#: <u>\1</u>#' \
    1.11  				-e 's#\([^a-z]\)none$#\1<u>none</u>#' \
    1.12  				-e 's#\([^a-z]\)false$#\1<u>false</u>#' \
    1.13  				-e 's#\([^a-z]\)OFF$#\1<u>OFF</u>#' \
     2.1 --- a/modules/pkgdb	Fri May 18 14:12:41 2018 +0300
     2.2 +++ b/modules/pkgdb	Tue May 29 04:09:44 2018 +0300
     2.3 @@ -24,8 +24,7 @@
     2.4  
     2.5  
     2.6  # Create suitable packages list for TazPkg and only for built packages
     2.7 -# as well as flavors files for TazLiTo. We don't need logs since we do it
     2.8 -# manually to ensure everything is fine before syncing the mirror.
     2.9 +# as well as flavors files for TazLiTo.
    2.10  
    2.11  # Find how much time was spent the last time (for web interface)
    2.12  lastcooktime=$(sed '/Time:/!d; s|.*: *\([0-9]*\)s.*|\1|' $LOGS/pkgdb.log 2>/dev/null | sed '$!d')
    2.13 @@ -63,27 +62,35 @@
    2.14  { _ 'Cook pkgdb started: %s' "$(date "$(_ '+%%F %%R')")"; newline; } | dblog
    2.15  
    2.16  cd $PKGS
    2.17 -rm -f packages.* extra.list
    2.18 -#touch packages.equiv
    2.19  
    2.20  # Web interface database files should exist on the mirror1
    2.21  >.folderlist; >.filelist
    2.22  chmod 666 .folderlist .filelist
    2.23  
    2.24 +# Command `cook pkgdb` may be executed by cron. Creating a packages database
    2.25 +# takes some time, during which previously pending packages may be continue to
    2.26 +# create. This will result in an error due to the lack of a database. This in
    2.27 +# turn can lead to errors in the creating of many subsequent packages and will
    2.28 +# require manual intervention.
    2.29 +# Solution is an atomic update of packages database: first we create new files
    2.30 +# (in the separate temp dir), and then instantly (well, almost) replace the old
    2.31 +# files by new ones.
    2.32 +
    2.33 +dbs=$(mktemp -d)
    2.34 +
    2.35  _n 'Creating file "%s"' 'packages.list' | dblog
    2.36 -find . -name '*.tazpkg' | sed 's|^./||; s|.tazpkg$||' > $PKGS/packages.list
    2.37 -echo " ($(filesize $PKGS/packages.list))" | dblog
    2.38 +find . -name '*.tazpkg' | sed 's|^./||; s|.tazpkg$||' > $dbs/packages.list
    2.39 +echo " ($(filesize $dbs/packages.list))" | dblog
    2.40  
    2.41  _n 'Creating file "%s"' 'packages.md5' | dblog
    2.42 -find . -name '*.tazpkg' -exec md5sum '{}' \; | sed 's|./||' > $PKGS/packages.md5
    2.43 -echo " ($(filesize $PKGS/packages.md5))" | dblog
    2.44 -cp $PKGS/packages.md5 $PKGS/packages.toremove			# list of unnecessary packages
    2.45 +find . -name '*.tazpkg' -exec md5sum '{}' \; | sed 's|./||' > $dbs/packages.md5
    2.46 +echo " ($(filesize $dbs/packages.md5))" | dblog
    2.47 +cp $dbs/packages.md5 $dbs/packages.toremove			# list of unnecessary packages
    2.48  
    2.49 -md5sum packages.md5 | cut -d' ' -f1 > ID
    2.50 -( cat ./ID | tr $'\n' ' '; date -ur ./ID +%s ) > IDs	# md5 and timestamp
    2.51 +md5sum $dbs/packages.md5 | cut -d' ' -f1 > $dbs/ID
    2.52 +( cat $dbs/ID | tr $'\n' ' '; date -ur $dbs/ID +%s ) > $dbs/IDs	# md5 and timestamp
    2.53  
    2.54  _n 'Creating file "%s"' 'descriptions.txt' | dblog
    2.55 -rm $PKGS/descriptions.txt 2>/dev/null
    2.56  for i in $(ls $WOK | sort); do
    2.57  	[ -d "$WOK/$i/taz" ] || continue
    2.58  
    2.59 @@ -93,25 +100,26 @@
    2.60  		pkgname=$(. $WOK/$i/taz/$j/receipt; echo $PACKAGE)
    2.61  		echo "$pkgname"
    2.62  		sed 's|^$| |' "$WOK/$i/taz/$j/description.txt"
    2.63 +		# if description.txt don't ends with \n then add one
    2.64 +		[ -z "$(tail -c1 $WOK/$i/taz/$j/description.txt)" ] || echo
    2.65  		echo
    2.66 -	done >> descriptions.txt
    2.67 +	done >> $dbs/descriptions.txt
    2.68  done
    2.69 -echo " ($(filesize $PKGS/descriptions.txt))" | dblog
    2.70 +echo " ($(filesize $dbs/descriptions.txt))" | dblog
    2.71  
    2.72  _n 'Creating file "%s"' 'bdeps.txt' | dblog
    2.73 -rm $PKGS/bdeps.txt 2>/dev/null
    2.74  for i in $(ls $WOK | sort); do
    2.75  	[ -s "$WOK/$i/receipt" ] || continue
    2.76  	bdeps=$(. $WOK/$i/receipt; echo $BUILD_DEPENDS) # remove newlines from some receipts
    2.77 -	echo "$i	$bdeps" >> $PKGS/bdeps.txt
    2.78 +	echo "$i	$bdeps" >> $dbs/bdeps.txt
    2.79  done
    2.80 -echo " ($(filesize $PKGS/bdeps.txt))" | dblog
    2.81 +echo " ($(filesize $PKGS/$dbs/bdeps.txt))" | dblog
    2.82  
    2.83  
    2.84  _ 'Creating lists from "%s"' "$WOK" | dblog
    2.85 -[ -e $PKGS/files.list ] && rm $PKGS/files.list
    2.86  cd $WOK
    2.87  rsumf=$(mktemp)
    2.88 +touch $dbs/packages.desc $dbs/packages.txt $dbs/packages.info $dbs/packages.equiv
    2.89  for i in *; do
    2.90  	[ -d "$WOK/$i/taz" ] || continue
    2.91  
    2.92 @@ -124,13 +132,13 @@
    2.93  		if [ -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION$arch.tazpkg" ]; then
    2.94  
    2.95  			# packages.desc lets us search easily in DB
    2.96 -			cat >> $PKGS/packages.desc <<EOT
    2.97 +			cat >> $dbs/packages.desc <<EOT
    2.98  $PACKAGE | $VERSION$EXTRAVERSION | $SHORT_DESC | $CATEGORY | $WEB_SITE
    2.99  EOT
   2.100  
   2.101 -			# packages.txt used by tazpkg and tazpkg-web also to provide
   2.102 +			# packages.txt used by tazpkg-web also to provide
   2.103  			# a human readable package list with version and description.
   2.104 -			cat >> $PKGS/packages.txt <<EOT
   2.105 +			cat >> $dbs/packages.txt <<EOT
   2.106  $PACKAGE
   2.107  $VERSION$EXTRAVERSION
   2.108  $SHORT_DESC
   2.109 @@ -149,7 +157,7 @@
   2.110  			[ -e "$pack/description.txt" ] && md5sum $pack/description.txt | sed 's| [^ ]*/| |' >> $rsumf
   2.111  			rsum=$(md5sum $rsumf | awk '{print $1}')
   2.112  
   2.113 -			cat >> $PKGS/packages.info <<EOT
   2.114 +			cat >> $dbs/packages.info <<EOT
   2.115  $PACKAGE	$VERSION$EXTRAVERSION	$CATEGORY	$SHORT_DESC	$WEB_SITE	$TAGS	$SIZES	$DEPENDS	$rsum	$PROVIDE
   2.116  EOT
   2.117  
   2.118 @@ -157,19 +165,19 @@
   2.119  			for k in $PROVIDE; do
   2.120  				DEST=''
   2.121  				echo $k | fgrep -q : && DEST="${k#*:}:"
   2.122 -				if grep -qs ^${k%:*}= $PKGS/packages.equiv; then
   2.123 +				if grep -qs ^${k%:*}= $dbs/packages.equiv; then
   2.124  					sed -i "s/^${k%:*}=/${k%:*}=$DEST$PACKAGE /" \
   2.125 -						$PKGS/packages.equiv
   2.126 +						$dbs/packages.equiv
   2.127  				else
   2.128 -					echo "${k%:*}=$DEST$PACKAGE" >> $PKGS/packages.equiv
   2.129 +					echo "${k%:*}=$DEST$PACKAGE" >> $dbs/packages.equiv
   2.130  				fi
   2.131  			done
   2.132  
   2.133  			# files.list provides a list of all packages files.
   2.134 -			sed "s|^|$PACKAGE: \0|" $i/taz/$j/files.list >> $PKGS/files.list
   2.135 +			sed "s|^|$PACKAGE: \0|" $i/taz/$j/files.list >> $dbs/files.list
   2.136  
   2.137  			# list of unnecessary packages
   2.138 -			sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$arch.tazpkg/d" $PKGS/packages.toremove
   2.139 +			sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$arch.tazpkg/d" $dbs/packages.toremove
   2.140  		else
   2.141  			# if receipt variable HOST_ARCH absent/empty or contains ARCH
   2.142  			if [ -z "$HOST_ARCH" -o "${HOST_ARCH/$ARCH/}" != "$HOST_ARCH" ]; then
   2.143 @@ -178,21 +186,20 @@
   2.144  		fi
   2.145  	done
   2.146  done
   2.147 -touch $PKGS/packages.desc $PKGS/packages.txt $PKGS/packages.info $PKGS/packages.equiv
   2.148  rm $rsumf
   2.149  
   2.150  
   2.151  # Display list size.
   2.152 -_ 'Done: %s (%s)' 'packages.desc'  "$(filesize $PKGS/packages.desc)"  | dblog
   2.153 -_ 'Done: %s (%s)' 'packages.txt'   "$(filesize $PKGS/packages.txt)"   | dblog
   2.154 -_ 'Done: %s (%s)' 'packages.info'  "$(filesize $PKGS/packages.info)"  | dblog
   2.155 -_ 'Done: %s (%s)' 'packages.equiv' "$(filesize $PKGS/packages.equiv)" | dblog
   2.156 +_ 'Done: %s (%s)' 'packages.desc'  "$(filesize $dbs/packages.desc)"  | dblog
   2.157 +_ 'Done: %s (%s)' 'packages.txt'   "$(filesize $dbs/packages.txt)"   | dblog
   2.158 +_ 'Done: %s (%s)' 'packages.info'  "$(filesize $dbs/packages.info)"  | dblog
   2.159 +_ 'Done: %s (%s)' 'packages.equiv' "$(filesize $dbs/packages.equiv)" | dblog
   2.160  
   2.161  cd $PKGS
   2.162  
   2.163  
   2.164  # Check for unnecessary packages
   2.165 -if [ -s "$PKGS/packages.toremove" ]; then
   2.166 +if [ -s "$dbs/packages.toremove" ]; then
   2.167  	newline | dblog
   2.168  	case x$rmpkg in
   2.169  		x) _ 'Found unnecessary packages (use `cook pkgdb --rmpkg` to remove):' | dblog;;
   2.170 @@ -200,53 +207,54 @@
   2.171  	esac
   2.172  	while read pkgsum pkgfile; do
   2.173  		echo "  - $pkgfile" | dblog
   2.174 -		sed -i "/${pkgfile%.tazpkg}/d" $PKGS/packages.list
   2.175 -		sed -i "/ $pkgfile/d" $PKGS/packages.md5
   2.176 +		sed -i "/${pkgfile%.tazpkg}/d" $dbs/packages.list
   2.177 +		sed -i "/ $pkgfile/d" $dbs/packages.md5
   2.178  		[ -n "$rmpkg" ] && rm $PKGS/$pkgfile	# remove packages only with --rmpkg
   2.179 -	done < $PKGS/packages.toremove
   2.180 +	done < $dbs/packages.toremove
   2.181  	newline | dblog
   2.182  fi
   2.183 -rm $PKGS/packages.toremove
   2.184 +rm $dbs/packages.toremove
   2.185  
   2.186  
   2.187  # files.list.lzma
   2.188  _n 'Creating file "%s"' 'files.list.lzma' | dblog
   2.189 -touch files.list
   2.190 +touch $dbs/files.list
   2.191  # pkgs.slitaz.org strongly depends on list sorted by packages names
   2.192 -#lzma e files.list files.list.lzma
   2.193 -/bin/lzma -zeqcT0 files.list > files.list.lzma
   2.194 -echo " ($(filesize $PKGS/files.list.lzma))" | dblog
   2.195 +#lzma e $dbs/files.list $dbs/files.list.lzma
   2.196 +/bin/lzma -zeqcT0 $dbs/files.list > $dbs/files.list.lzma
   2.197 +echo " ($(filesize $dbs/files.list.lzma))" | dblog
   2.198  
   2.199  # Pre-sorting filenames causes 10% smaller resulting lzma file
   2.200  _n 'Creating file "%s"' 'files-list.lzma' | dblog
   2.201 -cat files.list | sort -k2 -o files.list.sorted
   2.202 -#lzma e files.list.sorted files-list.lzma
   2.203 -/bin/lzma -zeqcT0 files.list.sorted > files-list.lzma
   2.204 -rm -f files.list files.list.sorted
   2.205 -echo " ($(filesize $PKGS/files-list.lzma))" | dblog
   2.206 +cat $dbs/files.list | sort -k2 -o $dbs/files.list.sorted
   2.207 +#lzma e $dbs/files.list.sorted $dbs/files-list.lzma
   2.208 +/bin/lzma -zeqcT0 $dbs/files.list.sorted > $dbs/files-list.lzma
   2.209 +rm -f $dbs/files.list $dbs/files.list.sorted
   2.210 +echo " ($(filesize $dbs/files-list.lzma))" | dblog
   2.211  
   2.212 -[ -e files.list.md5 ] && rm files.list.md5
   2.213 -md5sum files-list.lzma | cut -d' ' -f1 | tr -d $'\n' > files-list.md5
   2.214 +md5sum $dbs/files-list.lzma | cut -d' ' -f1 | tr -d $'\n' > $dbs/files-list.md5
   2.215  
   2.216  # Make bundle to fast recharge
   2.217  _n 'Creating file "%s"' 'bundle.tar.lzma' | dblog
   2.218 -[ -f bundle.tar.lzma ] && rm bundle.tar.lzma
   2.219  # Make sure to get "mirrors" file
   2.220 -until [ -e 'mirrors' ]; do
   2.221 -	wget -q http://mirror1.slitaz.org/mirrors
   2.222 +until [ -e "$dbs/mirrors" ]; do
   2.223 +	wget -q -O $dbs/mirrors http://mirror1.slitaz.org/mirrors
   2.224  	echo -n '.' | dblog; sleep 5
   2.225  done
   2.226  # Make sure to get "extra.list" file
   2.227 -until [ -e 'extra.list' ]; do
   2.228 -	wget -q -O extra.list http://mirror1.slitaz.org/packages/get.list
   2.229 +until [ -e "$dbs/extra.list" ]; do
   2.230 +	wget -q -O $dbs/extra.list http://mirror1.slitaz.org/packages/get.list
   2.231  	echo -n '.' | dblog; sleep 5
   2.232  done
   2.233 -busybox tar -chf bundle.tar \
   2.234 -	mirrors extra.list files-list.md5 packages.info descriptions.txt \
   2.235 -	packages.desc packages.md5 packages.txt packages.list packages.equiv
   2.236 -/bin/lzma -zeqcT0 bundle.tar > bundle.tar.lzma
   2.237 -rm ./bundle.tar ./mirrors
   2.238 -echo " ($(filesize $PKGS/bundle.tar.lzma))" | dblog
   2.239 +(
   2.240 +	cd $dbs
   2.241 +	busybox tar -chf bundle.tar \
   2.242 +		mirrors extra.list files-list.md5 packages.info descriptions.txt \
   2.243 +		packages.desc packages.md5 packages.txt packages.list packages.equiv
   2.244 +)
   2.245 +/bin/lzma -zeqcT0 $dbs/bundle.tar > $dbs/bundle.tar.lzma
   2.246 +rm $dbs/bundle.tar $dbs/mirrors
   2.247 +echo " ($(filesize $dbs/bundle.tar.lzma))" | dblog
   2.248  
   2.249  # Display some info.
   2.250  separator | dblog
   2.251 @@ -255,6 +263,10 @@
   2.252  # L10n: 's' is for seconds (cooking time)
   2.253  { _ 'Packages: %s - Time: %ss' "$nb" "$time"; newline; } | dblog
   2.254  
   2.255 +# "Atomic" update now
   2.256 +cp -f $dbs/* $PKGS
   2.257 +rm -r $dbs
   2.258 +
   2.259  
   2.260  # Create all flavors files at once. Do we really need code to monitor
   2.261  # flavors changes? Let's just build them with packages lists before