#!/bin/bash help() { cat << EOT ROCKET - ROCK nEtwork packeTmanager ... or something alike ... ;-) The GEM Pools (install sources) are configured in /etc/rocket.conf Usage: rocket [options] ... Options: --nodeps ............ do not resolve dependencies (install mode) Modes: updsrc .............. update local rock source tree configsrc ........... run the source configuration tool smap ..... apply patch from ROCK Linux SubMaster which ....... search in the "provides" package information build ......... build tar.bz2 and .gem from sources emerge ........ build and install a package build-upgrade ....... build all packages for an upgrade emerge-upgrade ...... build and install all packages for an upgrade create ........ create .tar.bz2 and .gem file from local package index [ ] ..... create the index files for a directory with GEMs update .............. update the package cache upgrade ............. update all packages to newest version install ....... install/update package inst-nodeps ... install without dependencies remove ........ remove package search ...... search package descriptions for this regex fsearch ..... search package file list for this regex list ........ list all packages with a name matching the regex info .......... print package details flist ......... print package file list EOT exit 1 } nodeps=0 while [[ "$1" == --* ]] do case "$1" in --nodeps) nodeps=1 ;; *) help ;; esac done upd_archive() { filename="$( echo "$2" | tr "/:" __; )" refetch=0 if [ -f /var/adm/rocket/dbs/$filename ] then check_done=0 if [ -f /var/adm/rocket/dbs/$filename.md5 ]; then echo "Checking $2 (md5) ..." local_md5="$( cat /var/adm/rocket/dbs/$filename.md5 )" remote_md5="$( curl -s $2.md5 )" if [ -n "$local_md5" -a -n "$remote_md5" ]; then if [ ".$local_md5" != ".$remote_md5" ]; then refetch=1 fi check_done=1 fi fi if [ $check_done = 0 ]; then echo "Checking $2 (timestamp) ..." lastmod="$( curl -s -I $2 | grep '^Last-Modified: ' | sed 's,.*: ,,'; )" if [ -n "$lastmod" ]; then lastmod="$( date --date "$lastmod" "+%s"; )" mylastmod="$( find /var/adm/rocket/dbs/$filename -printf '%A@\n'; )" if [ "$mylastmod" -lt "$lastmod" ]; then refetch=1 fi else echo "WARNING: Unable to fetch modification time via HTTP!" fi fi fi if [ ! -f /var/adm/rocket/dbs/$filename -o "$refetch" = 1 ] then echo "Downloading $2 ..." if curl -w '\rFinished downloading %{size_download} bytes in %{time_total} seconds (%{speed_download} bytes/sec). \n' \ --progress-bar "$2" -o /var/adm/rocket/dbs/$filename.new then mv /var/adm/rocket/dbs/$filename.new /var/adm/rocket/dbs/$filename fi curl -s $2.md5 > /var/adm/rocket/dbs/$filename.md5 [ -s /var/adm/rocket/dbs/$filename.md5 ] || rm -f /var/adm/rocket/dbs/$filename.md5 fi echo "Processing $filename ..." gawk ' BEGIN { chunk=0; pkg="NONE"; ver="UNKOWN"; } $0 == "\027" { chunk++; next; } $0 == "\004" { if (!ignore) { close("/var/adm/rocket/descs/" pkg); close("/var/adm/rocket/dependencies/" pkg); close("/var/adm/rocket/cksums/" pkg); print pkg " '"$1"'/" pkg "-" ver ".gem" \ >> "/var/adm/rocket/locations.tmp"; } chunk=0; pkg="NONE"; next; } chunk == 0 { pkg=$0; ignore = (match(pkg, "^'$3'$") != 0); } chunk == 1 && !ignore { print > "/var/adm/rocket/descs/" pkg; } chunk == 2 && !ignore { if (match($2, "^'$4'$") == 0) print > "/var/adm/rocket/dependencies/" pkg; } chunk == 3 && !ignore { print > "/var/adm/rocket/cksums/" pkg; } chunk == 1 && $1 == "[V]" { ver = $2 "-" $3; } ' < <( gunzip < /var/adm/rocket/dbs/$filename; ) } call_postinstall() { if [ -n "$( /bin/ls /var/adm/postinstall/ | head -n1 )" ]; then read -p "Do you want to run the postinstall scripts now? [Y/n] " yn if [ "$yn" = "y" -o "$yn" = "Y" -o "$yn" = "" ]; then postinstall fi fi } case "$1" in updsrc) cd /usr/src/rock-src || exit 1 ./scripts/Update-Src ./scripts/Cleanup ;; configsrc) cd /usr/src/rock-src || exit 1 if [ ! -d config/rocket ]; then mkdir -p config/rocket cp -r /etc/ROCK-CONFIG/* config/rocket/ fi ./scripts/Config -cfg rocket ;; smap) cd /usr/src/rock-src || exit 1 url="https://www.rocklinux.net/submaster/data/$( echo $1 | sed 's,[^0-9],,g; s,^\(....\)\(..\)\(.*\),\1/\2/\3.patch,'; )" rm -f rocket-smap-temp.patch wget -O rocket-smap-temp.patch "$url" || exit 1 patch -p0 < rocket-smap-temp.patch || exit 1 rm -f rocket-smap-temp.patch ;; which) cd /usr/src/rock-src || exit 1 egrep -l "^\[PROVIDES\].* ($2)($| )" package/*/*/*.cache | \ cut -f4 -d/ | sed 's,\.cache$,,' ;; build) shift "$0" emerge "$@"; rc=$? if [ $rc -eq 0 ]; then "$0" create "$@" fi exit $rc ;; emerge) shift; cd /usr/src/rock-src || exit 1 if [ ! -d config/rocket ]; then mkdir -p config/rocket cp -r /etc/ROCK-CONFIG/* config/rocket/ ./scripts/Config -cfg rocket -oldconfig fi ./scripts/Build-Pkg -download -cfg rocket "$@"; rc=$? call_postinstall exit $rc ;; create) shift for pkg; do for f in /var/adm/packages/$pkg /var/adm/packages/$pkg:*; do if [ -f "$f" ]; then p="$(basename $f)" v="$(grep '^Package Name and Version' $f | \ cut -f6,7 -d' ' | tr ' ' - )" mine -T /var/adm / "$p" "$p-$v.tar.bz2" mine -C /var/adm "$p-$v.tar.bz2" "$p" "$p-$v.gem" fi done done ;; update) rm -rf /var/adm/rocket/{descs,dependencies,cksums} mkdir -p /var/adm/rocket/{descs,dependencies,cksums,dbs} touch /var/adm/rocket/locations.tmp gen_a_list() { grep '^[ ]*'$1'[ ]\+' /etc/rocket.conf | \ sed 's,^[ ]*'$1'[ ]*,,' | \ tr ' \t\n' '|' | sed 's,||*,|,g; s,|$,,; s,^|,,;' } ignore_list="($( gen_a_list ignore ))" ignore_list_deps="($( gen_a_list ignore-deps ))" while read keyword p1 p2 p3 p4 p5 rest; do case "$keyword" in archive) [ -n "$p2" ] || p2="packages.db" upd_archive "$p1" "$p1/$p2" \ "$ignore_list" "$ignore_list_deps" ;; meta-archive) while read url file rest; do [ -n "$file" ] || file="packages.db" upd_archive "$url" "$url/$file" \ "$ignore_list" "$ignore_list_deps" done < $( curl -s "$p1"; ) ;; ignore|ignore-deps) ;; *) echo "Unknown keyword '$keyword' in config file!" >&2 ;; esac done < <( grep '^ *[^#]' /etc/rocket.conf | tac; ) awk '{ l[$1] = $2; } END { for (i in l) print i, l[i]; }' \ < /var/adm/rocket/locations.tmp > /var/adm/rocket/locations.txt rm -f /var/adm/rocket/locations.tmp ;; search) matches=0; while read f; do echo if [ -f "/var/adm/packages/${f##*/}" ]; then echo "Match #$((matches++)) ${f##*/} (installed):" else echo "Match #$((matches++)) ${f##*/} (not installed):" fi egrep -i "^(\[I\]|\[T\].*$2)" $f done < <( egrep -lir "^\[(I|T)\].*$2" /var/adm/rocket/descs | sort; ) if [ $matches -gt 0 ]; then echo fi ;; fsearch) matches=0; if [ "${2#^}" != "$2" ]; then regex="^[^ ]+ [^ ]+ ${2#^}" else regex="^[^ ]+ [^ ]+ .*$2" fi while read f; do echo if [ -f "/var/adm/packages/${f##*/}" ]; then echo "Match #$((matches++)) ${f##*/} (installed):" else echo "Match #$((matches++)) ${f##*/} (not installed):" fi egrep -i "$regex" $f | cut -f3- -d' ' done < <( egrep -lir "$regex" /var/adm/rocket/cksums | sort; ) if [ $matches -gt 0 ]; then echo fi ;; list) while read p; do if [ -f "/var/adm/packages/$p" ] then s='i'; else s='.'; fi grep '^\[I\].*' /var/adm/rocket/descs/$p | sed "s,^....,$s $p\t," | expand -t25,35,45,55 done < <( egrep "^.*$2.* " /var/adm/rocket/locations.txt | cut -f1 -d' ' | sort; ) ;; info) echo; shift for pkg; do if [ -f "/var/adm/packages/$pkg" ]; then echo "$pkg (installed)" else echo "$pkg (not installed)" fi echo egrep '^\[[I ]\]' /var/adm/rocket/descs/$pkg && echo egrep '^\[[T ]\]' /var/adm/rocket/descs/$pkg && echo egrep '^\[[U ]\]' /var/adm/rocket/descs/$pkg && echo egrep '^\[[MA]\]' /var/adm/rocket/descs/$pkg && echo egrep '^\[[V ]\]' /var/adm/rocket/descs/$pkg && echo egrep '^\[[LS]\]' /var/adm/rocket/descs/$pkg && echo done ;; flist) for pkg; do cut -f3- -d' ' /var/adm/rocket/cksums/$pkg done ;; build-upgrade|emerge-upgrade) updlist="" while read pkg ver extraver; do [ -f /var/adm/descs/$pkg ] || continue [ -n "$extraver" ] || extraver="0" grep -q "^\[V\] $ver $extraver\$" /var/adm/descs/$pkg || updlist="$updlist $pkg" done < <( cd /usr/src/rock-src/package; grep -rH '^\[V\]' */*/*.desc | sed 's,.*/\([^/]*\)\.desc:\[V\],\1,'; ) if [ "$updlist" = "" ]; then echo "All packages are up to date." else echo "Going to ${1%-*}:" echo "$updlist" | fmt -w60 | sed 's,^, ,' read -p 'Press ENTER to continue or Ctrl-C to abort.' "$0" ${1%-*} $updlist fi ;; upgrade) updlist="" while read pkg ver; do [ -f /var/adm/descs/$pkg ] || continue grep -q "^\[V\] $ver\$" /var/adm/descs/$pkg || updlist="$updlist $pkg" done < <( grep -rH '^\[V\]' /var/adm/rocket/descs | sed 's,.*/\([^/]*\):\[V\],\1,'; ) if [ "$updlist" = "" ]; then echo "All packages are up to date." else echo "Going to update:" echo "$updlist" | fmt -w60 | sed 's,^, ,' read -p 'Press ENTER to continue or Ctrl-C to abort.' "$0" install $updlist fi ;; install) shift if [ $nodeps = 0 ] then deps=$( echo $( echo "$*" | tr ' ' '\n' | gawk ' function get_deps(p, depsfn) { if (A[p]) return; A[p] = 1; depsfn = "/var/adm/rocket/dependencies/" p; while ((getline < depsfn) > 0) { if (!D[$2]) { D[$2] = 1; get_deps($2); } } close(depsfn); } { P[$1] = 1; get_deps($1); } END { for (d in D) { if (!P[d]) { pkgfn = "/var/adm/packages/" d; if ((getline < pkgfn) > 0) close(pkgfn); else { descfn = "/var/adm/rocket/descs/" d; if ((getline < descfn) > 0) { close(descfn); print d; } } } } } '; ); ) else deps="" fi if [ -n "$deps" ]; then echo "You requested for install:" echo " $*" echo "The following dependencies are automatically added:" echo " $deps" read -p "Do you want to continue? [Y/n] " yn if [ "$yn" != "y" -a "$yn" != "Y" -a "$yn" != "" ]; then echo "" echo "Hint: Add the packages you don't want to be installed" echo "to /etc/rocket.conf (with the 'ignore' keyword), run" echo "'rocket update' and re-run the command" echo "" echo " $0 $*" echo "" echo "Abort." exit 1 fi set -- $* $deps fi for pkg; do url="$( grep "^$pkg " /var/adm/rocket/locations.txt | \ cut -f2 -d' ' | tail -n1; )" if [ -z "$url" ]; then echo "Package $pkg not found - maybe you need to add the archive" echo "to /etc/rocket.conf and run 'rocket update' first." else echo "+ mine -i '$url'"; mine -i "$url" fi done call_postinstall exit 0 ;; remove) shift echo "+ mine -rs $*" mine -rs "$@" call_postinstall ;; index) [ -n "$2" ] && { cd "$2" || exit 1; } echo "Creating packages.db ..." mine -P *.gem | gzip -9 > packages.db echo "Creating packages_stripped.db ..." gawk ' BEGIN { chunk=0; } $0 == "\004" { chunk=0; print; next; } $0 == "\027" { chunk++; print; next; } chunk != 3 { print; } ' < <( gunzip < packages.db; ) | gzip -9 > packages_stripped.db echo "Creating MD5 checksum files ..." md5sum packages.db > packages.db.md5 md5sum packages_stripped.db > packages_stripped.db.md5 ;; *) help ;; esac