# HG changeset patch # User Christophe Lincoln # Date 1331776876 -3600 # Node ID 26f8f693b916d46c5f03baf69f1ca084ca357518 # Parent 9109770afce4fe74c9cb81cd475b4eaf733c4bcc Add cookiso (Automate and log ISO build) diff -r 9109770afce4 -r 26f8f693b916 cookiso --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cookiso Thu Mar 15 03:01:16 2012 +0100 @@ -0,0 +1,271 @@ +#!/bin/sh +# +# Cookiso utility - Build official ISO's in a chroot environment. +# The goal is ti have a tool well integrated to cookutils but who +# can run on it's own and to automate official SliTaz ISO creation. +# + +[ -f "/etc/slitaz/cook.conf" ] && . /etc/slitaz/cook.conf +[ -f "cook.conf" ] && . ./cook.conf + +# --> cook.conf +# SSH/RSA configuration to upload on a server. +SSH_CMD="dbclient -i /root/.ssh/id_rsa.dropbear" +SSH_ISO="/var/www/slitaz/mirror/iso" +SSH_HOST="slitaz@mirror.slitaz.org" +SSH_PLUS="ifconfig eth0" +#BWLIMIT="--bwlimit=40" + +# Cookiso DB files. +cache="$CACHE/cookiso" +repo="$SLITAZ/flavors" +iso="$SLITAZ/iso" +activity="$cache/activity" +command="$cache/command" +rollog="$cache/rolling.log" +commits="$cache/commits" + +# Parse cmdline options. +for opt in "$@" +do + case "$opt" in + --pkgdb) + cook pkgdb --flavors ;; + --push) + echo "TODO: Uplaod iso's to mirror" + exit 0 ;; + --flavors=*) + flavors=${opt#--flavors=} ;; + --version=*) + version=${opt#--version=} ;; + esac +done + +# Default to rolling, or: cookiso [cmd] --version=stable +case "$version" in + stable) + string=$(cat /etc/slitaz-release) ;; + cooking) + string=cooking ;; + *) + version=cooking + string=rolling ;; +esac + +# Running command +[ -d "$cache" ] && echo "$@" > $command +trap 'rm -f $command && exit 1' INT TERM + +# +# Functions +# + +usage() { + cat << EOT + +$(echo -e "\033[1mUsage:\033[0m") cookiso [command] [--option] + +$(echo -e "\033[1mCommands:\033[0m") + usage Display this short usage. + setup Setup Cookiso build environment. + push Manually push ISO to a server via SSH. + gen Generate specified flavors. + 4in1 Generate all 4in1 flavors. + rolling Build the rollings ISO's if any changes. + +$(echo -e "\033[1mOptions:\033[0m") + --pkgdb Generate packages DB before building ISO. + --push Upload freshly generated ISO to a server. + --flavors= List of flavors to generate with 'gen' command. + --version= Specify SliTaz version: [rolling|cooking|stable] + +EOT +} + +spider() { + echo ' // \\' + echo ' _\\()//_' + echo '/ // \\ \\' + echo ' | \__/ |' +} + +# Check for one a some flavors on cmdline +flavors_list() { + if [ "$flavors" == "all" ]; then + flavors=$(ls $SLITAZ/flavors) + fi + if [ ! "$flavors" ]; then + echo "No flavor specified on cmdline. Use: --flavors=" + rm -f $command && exit 0 + fi +} + +# Log activities, we want first letter capitalized. +log() { + grep ^[A-Z] | \ + sed s"#^[A-Z]\([^']*\)#$(date '+%Y-%m-%d %H:%M') : \0#" >> $activity +} + +log_bot() { + sed '/^.\//'d | sed '/^.hg/'d | tee -a $rollog +} + +# Generate requested flavors. +gen_flavors() { + cd $SLITAZ/flavors && hg pull -u + mkdir -p $cache && cd $cache + rm -rf *.flavor *.list *.conf + for flavor in $flavors + do + if [ "$flavor" != "core-4in1" ]; then + name="slitaz-$string-$flavor" + else + name="slitaz-$string" + fi + log=$iso/$name.log + rm -f $log && touch $log + echo "Building $string $flavor" | log + echo "Cookiso started: $(date '+%Y-%m-%d %H:%M')" | tee -a $log + tazlito pack-flavor $flavor | tee -a $log + tazlito get-flavor $flavor | tee -a $log + script -c "echo -e '\n' | tazlito gen-distro" -a $log + # Rename ISO and md5 + mv -f $SLITAZ/distro/slitaz-$flavor.iso $iso/$name.iso + cd $iso && md5sum $name.iso > $name.md5 + echo "Cookiso ended: $(date '+%Y-%m-%d %H:%M')" | tee -a $log + done && echo "" +} + +# Push an ISO to a server. +push_iso() { + export DROPBEAR_PASSWORD=none + for flavor in $flavors + do + rsync $BWLIMIT -vtP -e "$SSH_CMD" \ + $iso/slitaz-$string-$flavor.* \ + ${SSH_HOST}:$SSH_ISO/$string $SSH_PLUS + done +} + +# +# Commands +# + +case "$1" in + setup) + # Setup Hg repo and dirs + echo -e "\nSetting up Cookiso environment..." + cd $SLITAZ + if [ ! -d "flavors" ]; then + case $version in + cooking|rolling) + hg clone http://hg.slitaz.org/flavors ;; + stable) + hg clone http://hg.slitaz.org/flavors-stable flavors ;; + esac + fi + # Needed packages + for pkg in mercurial tazlito rsync dropbear + do + [ -d "/var/lib/tazpkg/installed/$pkg" ] || tazpkg -gi $pkg + done + echo "Creating directories and files..." + mkdir -p $cache $iso + touch $activity + sed -i s'/^WORK_DIR=.*/WORK_DIR="\/home\/slitaz"/' \ + /etc/tazlito/tazlito.conf + echo "" + echo "Flavors files : $SLITAZ/flavors" + echo "Cache files : $cache" + echo "ISO images : $iso" + echo "" ;; + push) + # Manually upload an ISO to a server. + flavors_cook + push_iso ;; + gen) + # Build one or more flavor. + flavors_list + echo -e "\nGenerating flavors:\n$flavors" + gen_flavors ;; + 4in1) + echo -e "\nGenerating 4in1 distro's..." + flavors="base justx gtkonly core core-4in1" + gen_flavors ;; + rolling) + # + # Official SliTaz rolling release flavors are automaticaly build. + # + # Check if packages list was modified or if any commit have been + # done in one the rolling flavors and rebuild ISO's if needed. + # + pkgs=$SLITAZ/packages/packages.md5 + last=$cache/packages.md5 + diff=$cache/packages.diff + cook="preinit justx core-4in1" + + # Log stuff + rm -f $rollog && touch $rollog + rm -f $commit $commits.tmp && touch $commits.tmp + echo "Rolling tracking for changes" | log + echo "Cookiso rolling started: $(date '+%Y-%m-%d %H:%M')" | log_bot + + # Packages changes + [ -f "$last" ] || cp -f $pkgs $cache + diff $last $pkgs > $diff + if [ -s "$diff" ]; then + echo "Found new or rebuilded packages" | log_bot + cat $diff >> $rollog + # + # TODO: Check new pkg and see if it's part of one of the rolling + # flavors, if not we have nothing to build. + # + for flavor in $cook + do + echo "$flavor" >> $commits.tmp + echo "New packages for : $flavor" | log_bot + done + else + echo "No changes found in packages MD5 sum" | log_bot + echo "" > $commits.tmp + fi + cp -f $pkgs $cache + + # Hg changes + cd $repo || exit 1 + cur=$(hg head --template '{rev}\n') + echo "Updating wok : $repo (rev $cur)" | log_bot + cd $repo && hg pull -u | log_bot + new=$(hg head --template '{rev}\n') + cur=$(($cur + 1)) + for rev in $(seq $cur $new) + do + for file in $(hg log --rev=$rev --template "{files}") + do + flavor=$(echo $file | cut -d "/" -f 1) + desc=$(hg log --rev=$rev --template "{desc}" $file) + echo "Commited flavor : $flavor - $desc" | log_bot + # Build only rolling flavor + if echo "$cook" | fgrep -q $flavor; then + echo $flavor >> $commits.tmp + fi + done + done + + # Keep previous commit and discard duplicate lines + cat $commits.tmp | sed /"^$"/d > $commits.new + uniq $commits.new > $commits && rm $commits.* + nb=$(cat $commits | wc -l) + echo "Flavors to cook : $nb" | log_bot + flavors=$(cat $commits) + gen_flavors + ;; + spider) + # SliTaz Easter egg command :-) + spider ;; + *) + usage ;; +esac + +rm -f $command +exit 0