diff options
Diffstat (limited to 'branches/0.6/src')
-rw-r--r-- | branches/0.6/src/createpkg | 511 | ||||
-rwxr-xr-x | branches/0.6/src/jail-commit | 170 | ||||
-rwxr-xr-x | branches/0.6/src/jail-update | 61 | ||||
-rwxr-xr-x | branches/0.6/src/lspkg | 132 | ||||
-rwxr-xr-x | branches/0.6/src/mkbuild | 1196 | ||||
-rwxr-xr-x | branches/0.6/src/mkjail | 113 | ||||
-rwxr-xr-x | branches/0.6/src/rebuildpkg | 87 | ||||
-rwxr-xr-x | branches/0.6/src/repos | 87 | ||||
-rwxr-xr-x | branches/0.6/src/simplaret | 1045 | ||||
-rwxr-xr-x | branches/0.6/src/templatepkg | 959 |
10 files changed, 4361 insertions, 0 deletions
diff --git a/branches/0.6/src/createpkg b/branches/0.6/src/createpkg new file mode 100644 index 0000000..03612a9 --- /dev/null +++ b/branches/0.6/src/createpkg @@ -0,0 +1,511 @@ +#!/bin/bash +# +# createpkg: package builder using http://slack.sarava.org/slackbuilds scripts +# feedback: rhatto at riseup.net | gpl +# +# createpkg is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# createpkg is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# /etc/simplepkg/slackbuildrc parameters: +# +# SLACKBUILDS_DIR="/folder/to/place/slackbuilds", defaults to /var/slackbuilds +# SVN="svn://repository", defaults do svn://slack.sarava.org/slackbuilds +# SYNC="yes|no", whether to always update the repository +# +# TODO +# +# - optionally show a dependency tree before create the package +# - in function solve_dep: resolve program versions +# - mkdir source directory - error... (please check!) + +#--------------------------------------------------- +# Createpkg functions +#--------------------------------------------------- + +CREATEPKG_VERSION="1.0.5" + +function error_codes { + + # Slackbuilds error codes + ERROR_WGET=31 # wget error + ERROR_MAKE=32 # make source error + ERROR_INSTALL=33 # make install error + ERROR_MD5=34 # md5sum error + ERROR_CONF=35 # ./configure error + ERROR_HELP=36 # dasable + ERROR_TAR=37 # tar error + ERROR_MKPKG=38 # makepkg error + ERROR_GPG=39 # gpg check error + ERROR_PATCH=40 # patch error + ERROR_VCS=41 # cvs error + ERROR_MKDIR=42 # make directory error + + # Createpkg error codes + ERROR_INSTPKG=200 # installpkg error + ERROR_DEPEN=201 # dependency error + SCRIPT_OR_PACKAGE_NOT_FOUND=202 # Script or package not found +} + +function eecho { + + # echoes a message + # usage: eecho <message-type> <message> + # message-type can be: commun, messag, error, normal + + echo -e "${1}${2}${normal}" + +} + +function handle_error { + + # This function deals with internal createpkg errors + # and also with non-zero exit codes from slackbuilds + # Input: $1 - error code + # Output: Error mensage + # + # check slackbuild exit status are: + # + # ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 + # ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 + # ERROR_TAR=37; ERROR_MKPKG=38 ERROR_GPG=39 + # ERROR_PATCH=40; ERROR_VCS=41; ERROR_MKDIR=42 + # + # thanks to rudsonalves at yahoo.com.br for this spec. + + # we don't want to process when exit status = 0 + [ "$1" == "0" ] && return + + # Exit codes + case $1 in + 2) usage ;; + 3) eecho $alert "$BASENAME: could not update the repository $2" ;; + 4) eecho $alert "$BASENAME: could not create folder $2" ;; + 5) eecho $alert "$BASENAME: script not found for $2" ;; + $ERROR_WGET) + eecho $error "$BASENAME: error downloading source/package for $2" ;; + $ERROR_MAKE) + eecho $error "$BASENAME: error compiling $2 source code" ;; + $ERROR_INSTALL) + eecho $error "$BASENAME: error installing $2" ;; + $ERROR_MD5) + eecho $error "$BASENAME: error on source code integrity check for $2" ;; + $ERROR_CONF) + eecho $error "$BASENAME: error configuring the source code for $2" ;; + $ERROR_HELP) + exit 0 ;; # its supposed to never happen here :P + $ERROR_TAR) + eecho $error "$BASENAME: error decompressing source code for $2" ;; + $ERROR_MKPKG) + eecho $error "$BASENAME: error creating package $2" ;; + $ERROR_GPG) + eecho $error "$BASENAME: error verifying GPG signature the source code for $2" ;; + $ERROR_PATCH) + eecho $error "$BASENAME: error patching the source code for $2" ;; + $ERROR_VCS) + eecho $error "$BASENAME: error downloading $2 source from version control system" ;; + $ERROR_MKDIR) + eecho $error "$BASENAME: make directory $2 error, aborting" ;; + $ERROR_INSTPKG) + eecho $error "$BASENAME: install package $2 error, aborting" ;; + $ERROR_DEPEN) + eecho $error "$BASENAME: dependency solve error, aborting" ;; + *) eecho $error "$BASENAME: unknown error or user interrupt" ;; + $SCRIPT_OR_PACKAGE_NOT_FOUND) + eecho $error "$BASENAME: SlackBuild or package not found" ;; + esac + + exit $1 + +} + +function build_repo { + + # Checkout a new slackbuild working copy + BASEDIR="`dirname $SLACKBUILDS_DIR`" + mkdir -p $BASEDIR || handle_error 4 $BASEDIR + cd $BASEDIR + svn checkout $SVN + cd $SLACKBUILDS_DIR + +} + +function usage { + + # Help mensage + eecho $commun "Createpkg version $CREATEPKG_VERSION\n" + eecho $commun "Usage: createpkg [--install/-i] package-name" + eecho $commun " createpkg --no-deps/-np package-name" + eecho $commun " createpkg --search/-s package-name" + eecho $commun " createpkg --info/-f package-name" + eecho $commun " createpkg --list/-l" + eecho $commun " createpkg --sync" + eecho $commun " createpkg --help/-h" +} + +function check_config { + + # check the configuration + TMP=${TMP:=/tmp}; + REPOS=${REPOS:=$TMP}; + # Create $TMP and $REPOS if need + [ ! -e $TPM ] && mkdir $TMP + [ ! -e $REPOS ] && mkdir $REPOS + # + SLACKBUILDS_DIR=${SLACKBUILDS_DIR:=/var/slackbuilds} + SVN=${SVN:=svn://slack.sarava.org/slackbuilds} + SYNC=${SYNC:=no} + BASEDIR="`dirname $SLACKBUILDS_DIR`" + +} + +function solve_dep { + + # Solve dependency + local PACK="$1" + local COND="$2" + local VER="$3" + + # Check package in local system + PACK="`echo $PACK | sed -e 's/\+/\\\+/'`" + INSTALLED=`eval "ls /var/log/packages/ | egrep -E '^$PACK-[^-]+-[^-]+-[^-]+$'"` + CHECK=$? + + # TODO: Make check version procedures + if [ -z "$INSTALLED" ]; then + if [ $CHECK -ne 0 ]; then + # Check package in SlackBuilds tree + eecho $messag "$BASENAME: processing $PACKAGE dependency $PACK" + SYNC=no CREATEPKG_CHILD=$CREATEPKG_CHILD createpkg --install $PACK + + # check if the package was built and installed + EXIT_CODE="$?" + + if [ "$EXIT_CODE" == "5" ]; then + + # exit code 5 == slackbuild not found + # try to use simplaret + ARCH=$DEFAULT_ARCH simplaret --update + ARCH=$DEFAULT_ARCH simplaret --install $PACK + EXIT_CODE="$?" + if [ "$EXIT_CODE" != "0" ]; then + handle_error $SCRIPT_OR_PACKAGE_NOT_FOUND $PACK + fi + + elif [ "$EXIT_CODE" != "0" ]; then + handle_error $EXIT_CODE $PACK + fi + + fi + fi + +} + +function check_repo { + + # Verify if repository exist + [ ! -d "$SLACKBUILDS_DIR" ] && build_repo + +} + +function sync_repo { + + # Synchronize repository + cd $SLACKBUILDS_DIR + svn update || build_repo + #simplaret --update + +} + +function find_slackbuild { + + # Find SlackBuild script in the repository + find $SLACKBUILDS_DIR -iname $1.SlackBuild + +} + +function info_builds { + + # Show packages info + if [ "$PKG_PATH" != "" ]; then + for i in $PKG_PATH; do + PACKAGE=`basename $i .SlackBuild` + NAME_UP=`echo $PACKAGE | tr [a-z] [A-Z]` + eecho $commun "$NAME_UP: " + + PKG_DIR=`dirname $i` + if [ -e $PKG_DIR/slack-desc ]; then + eval "cat $PKG_DIR/slack-desc | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + else + eval "cat $i | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + fi + + if [ -e $PKG_DIR/slack-required ]; then + eecho $commun "slack-required" + cat $PKG_DIR/slack-required | sed 's/^/ /' + fi + done + fi + +} + +function list_builds { + + # List all available SlackBuilds + cd $SLACKBUILDS_DIR + echo "Sarava SlackBuilds list" + # level 1 + for i in *; do + if [ -d $i ]; then + echo -e " $i: " + ( + cd $i + # level 2 + for j in *; do + if [ -d $j ]; then + eecho $commun " $j" + ( + cd $j + BUILD="`ls *.SlackBuild 2>/dev/null`" + if [ "$BUILD" != "" ]; then + # level 3 + for k in $BUILD; do + eecho $messag " $k" + done + else + BUILD="" + fi + for k in *; do + if [ -d $k ]; then + eecho $messag " $k.SlackBuild" + fi + done + ) + fi + done + ) + fi + done + +} + +function color_select { + + # Select color mode: gray, color or none (*) + # commun - Communication + # messag - Commum messages + # error - Error messages + # normal - turn off color + case "$1" in + 'gray') + commun="\033[37;1m" + messag="\033[37;1m" + error="\033[30;1m" + alert="\033[37m" + normal="\033[m" + ;; + 'color') + commun="\033[34;1m" # green + messag="\033[32;1m" # blue + error="\033[31;1m" # red + alert="\033[33;1m" # yellow + normal="\033[m" # normal + ;; + *) + commun="" + messag="" + error="" + alert="" + normal="" + ;; + esac + +} + +#--------------------------------------------------- +# Starting createpkg +#--------------------------------------------------- +# Common functions +COMMON="/usr/libexec/simplepkg/common.sh" +SIMPLEPKG_CONF="/etc/simplepkg/simplepkg.conf" + +# Loading error codes +error_codes + +# First load simplepkg helper functions +source $COMMON && source $SIMPLEPKG_CONF +if [ $? -ne 0 ]; then + eecho $error "error: file $COMMON not found, check your $BASENAME installation" + exit 1 +fi + +# Load slackbuildrc definitions +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +else + source /etc/slackbuildrc 2>/dev/null +fi + +# Select color mode: gray, color or none (*) +color_select $COLOR + +# This is used to show how many children process we have +if [ -z "$CREATEPKG_CHILD" ]; then + CREATEPKG_CHILD="1" +else + let CREATEPKG_CHILD++ +fi + +BASENAME="`basename $0`[$CREATEPKG_CHILD]" + +check_config +check_repo + +case $1 in + '--search'|'-s') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + find_slackbuild $2 + exit + ;; + '--info'|'-f') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + PKG_PATH=`find_slackbuild $2` + info_builds + exit + ;; + '--install'|'-i') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + PACKAGE="$2" + INSTALL="1" + ;; + '--no-deps'|'-nd') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + NO_DEPS="1" + PACKAGE="$2" + ;; + '--sync') + sync_repo + exit 0 + ;; + '--help'|'-h'|'') + usage + exit 0 + ;; + '--list'|'-l') + list_builds + exit 0 + ;; + *) + if [ "${1:0:1}" != "-" ]; then + PACKAGE="$1" + else + handle_error 2 + fi + ;; +esac + +# Synchronize repository +[ "$SYNC" == "yes" ] && sync_repo + +# Get SlackBuild script +BUILD_SCRIPT="`find_slackbuild $PACKAGE`" + +# Check SlackBuild script found +if [ -z "$BUILD_SCRIPT" ]; then + handle_error 5 $PACKAGE +fi + +# Select one SlackBuild +if [ "`echo $BUILD_SCRIPT | wc -w`" -gt 1 ]; then + AUX="$PS3" + PS3="Choice: " + LIST=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | sed -r 's/.*\/(.*)\.SlackBuild$/\1/'`" EXIT" + + select PACKAGE in `echo $LIST`; do + break + done + + if [ "$PACKAGE" = "EXIT" ]; then + eecho $error "error: None package select" + exit 1 + fi + + # Select only one SlackBuild in BUILD_SCRIPT + BUILD_SCRIPT=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | grep "/$PACKAGE.SlackBuild"` + PS3="$AUX" +else + #PACKAGE=`echo $BUILD_SCRIPT | sed -r 's/.*\/(.*)\.SlackBuild$/\1/'` + PACKAGE=`basename $BUILD_SCRIPT .SlackBuild` +fi + +# Get dirname and script name from slackbuild +SCRIPT_BASE="`dirname $BUILD_SCRIPT`" +SCRIPT_NAME="`basename $BUILD_SCRIPT`" +eecho $messag "$BASENAME: found script $PACKAGE.SlackBuild, now checking for dependencies" + +# Sets the package's slack-required +if [ -f "$SCRIPT_BASE/$PACKAGE.slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/$PACKAGE.slack-required" +elif [ -f "$SCRIPT_BASE/slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/slack-required" +fi + +if [ ! -z "$SLACK_REQUIRED" -a "$NO_DEPS" != "1" ]; then + # this routine checks for dependencies in package's slack-required + ( grep '^[^#]' $SLACK_REQUIRED | while read dep; do + if [ ! -z "$dep" ]; then + PROGRAM="`echo $dep | awk '{ print $1 }'`" + CONDITION="`echo $dep | awk '{ print $2 }' | tr [=\>\<] [egl]`" + VERSION="`echo $dep | awk '{ print $3 }' | tr -dc '[:digit:]'`" + solve_dep $PROGRAM $CONDITION $VERSION + fi + true + done ) + if [ $? -ne 0 ]; then + eecho $messag "$BASENAME: dependency solve error" + exit 1 + fi + eecho $messag "$BASENAME: done checking for $PACKAGE dependencies" +else + eecho $messag "$BASENAME: no unmet dependencies for $PACKAGE" +fi + +eecho $messag "$BASENAME: processing $SCRIPT_NAME" + +# Change to script base directory +cd $SCRIPT_BASE + +# Select repository directory +NEW_REPOS=$REPOS/$( echo ${SCRIPT_BASE#$SLACKBUILDS_DIR/} ) + +# Create repository directory +[ ! -e $NEW_REPOS ] && mkdir -p $NEW_REPOS 2>/dev/null + + +# Remove old-versions +rm $NEW_REPOS/$PACKAGE-*-*-*.tgz 2>/dev/null + +# Execute SlackBuild script with variables protection +( INTERACT=no REPOS=$NEW_REPOS sh ./$SCRIPT_NAME ) + +# Check if package was built +handle_error $? $PACKAGE + +PKG_TGZ="`ls -1 -c $NEW_REPOS/$PACKAGE-*-*-*.tgz | head -n 1`" + +if [ "$INSTALL" == "1" ]; then + # as we dont have the full package file name, we'll + # use the newer file name that matches our wildcard: + + upgradepkg --install-new $PKG_TGZ +fi diff --git a/branches/0.6/src/jail-commit b/branches/0.6/src/jail-commit new file mode 100755 index 0000000..f2695d7 --- /dev/null +++ b/branches/0.6/src/jail-commit @@ -0,0 +1,170 @@ +#!/bin/bash +# +# jail-commit: update config files from a jail to a template +# feedback: rhatto@riseup.net | gpl +# +# Jail-commit is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# Jail-commit is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo $BASENAME: commit a jail configuration into a template + echo "usage: \"$BASENAME [<jail-path> [template]]\"" + echo " \"$BASENAME --all\" to commit all templates" + echo " \"$BASENAME --help\" for help" + +} + +function template_merge { + + # copy differences between the jail + # and the template in the template folder + + # usage: template_merge <jail-path> + + if [ -z "$1" ] || [ ! -d "$TEMPLATE_BASE.d" ]; then + return 1 + fi + + echo "" > $TEMPLATE_BASE.perms.tmp + cd $TEMPLATE_BASE.d + + for file in `find | grep -v -e "/.svn$" | grep -v -e "/.svn/" | grep -v -e "^\.$"`; do + + if [[ -e "$file" && -e "$1/$file" ]]; then + + if [ ! -d "$file" ] && [ ! -h "$file" ]; then + if ! diff $file $1/$file; then + echo Updating $file + cp -af $1/$file $file + fi + elif [ -h "$file" ]; then + if [ "`readlink $file`" != "`readlink $1/$file`" ]; then + rm -f $file + ln -s `readlink $1/$file` $file + fi + fi + + perms="`numeric_perm $1/$file`" + owner="`get_owner $1/$file`" + group="`get_group $1/$file`" + echo "$file;$owner;$group;$perms" >> $TEMPLATE_BASE.perms.tmp + + else + if [ ! -e "$1/$file" ]; then + echo $BASENAME: warning: missing file `slash $1/$file` + fi + fi + + done + + cat $TEMPLATE_BASE.perms.tmp | sed '/^$/d' > $TEMPLATE_BASE.perms + rm -f $TEMPLATE_BASE.perms.tmp + + if ! svn_check $TEMPLATE_BASE,perms; then + svn add $TEMPLATE_BASE,perms + fi + +} + +function template_svn_commit { + + # issue a svn_commit from a template folder + # usage: template_svn_commit <template-folder> + + if use_svn && [ -d "$1/.svn" ]; then + cd $1 + echo First checking out from the repository... + svn update + echo Commiting changes to the repository... + svn commit -m "changes for `date`" + if [ "$?" != "0" ]; then + echo $BASENAME: commit error + fi + fi + +} + +function do_commit { + + # commit jail changes to a repository + # usage: do_commit <jailpath> [template] + + local jailpath template + + jailpath="$1" + jail="`basename $jailpath`" + + if [ ! -z "$2" ]; then + template="$2" + else + template="$jail" + fi + + search_template $template --update + if [ "$?" == "0" ] && ! echo "$TEMPLATE_UPDATE_LIST" | grep -q " `basename $TEMPLATE_BASE` "; then + TEMPLATE_UPDATE_LIST=" $TEMPLATE_UPDATE_LIST `basename $TEMPLATE_BASE` " # the spaces are important + if [ "$jailpath" == "/" ]; then + echo Updating main installation... + else + echo Updating $jailpath... + fi + if [ -d "$TEMPLATE_BASE.d" ] || [ -a "$TEMPLATE_BASE.template" ]; then + SILENT=yes templatepkg -u $template $jailpath + template_merge $jailpath + fi + else + if [ -z "$SILENT" ]; then + echo $BASENAME: template $template not found + fi + return 1 + fi + +} + +TEMPLATE_UPDATE_LIST="" + +if [ "$1" == "--help" ]; then + usage +elif [ "$1" == "--all" ]; then + template_svn_commit $BASE_CONF/templates +elif echo $1 | grep -q -e "^--"; then + usage +elif [ ! -z "$1" ]; then + do_commit $1 $2 + if [ "$?" == "0" ]; then + template_svn_commit `dirname $TEMPLATE_BASE` + fi +else + SILENT="yes" + if [ -e $JAIL_LIST ]; then + for jailpath in `cat $JAIL_LIST`; do + do_commit $jailpath + done + fi + # main jail + do_commit / main + template_svn_commit $BASE_CONF/templates +fi + diff --git a/branches/0.6/src/jail-update b/branches/0.6/src/jail-update new file mode 100755 index 0000000..c5a008f --- /dev/null +++ b/branches/0.6/src/jail-update @@ -0,0 +1,61 @@ +#!/bin/bash +# +# jail-update: update config files from a jail to a template +# feedback: rhatto@riseup.net | gpl +# +# Jail-update is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# Jail-update is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo "$BASENAME: update a jail configuration from a template" + echo "usage: $BASENAME <jail-path> [template]" + +} + +if [ -z "$1" ] || [ "$1" == "--help" ] || echo $1 | grep -q -e "^--"; then + usage + exit 1 +fi + +if [ -z "$2" ]; then + template_name="`basename $1`" +else + template_name="$2" +fi + +search_template $template_name --update + +if [ "$?" != "0" ]; then + echo $BASENAME: template $template_name not found + exit 1 +elif [ ! -d "$1" ]; then + echo $BASENAME: jail $1 not found + exit 1 +fi + +update_template_files +copy_template_files $1 +set_jail_perms $1 + diff --git a/branches/0.6/src/lspkg b/branches/0.6/src/lspkg new file mode 100755 index 0000000..01900f2 --- /dev/null +++ b/branches/0.6/src/lspkg @@ -0,0 +1,132 @@ +#!/bin/bash +# +# lspkg v0.3: view installed and contents of slackware packages +# +# feedback: rhatto at riseup.net | gpl +# +# Lspkg is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# Lspkg is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON not found, check your `basename $0` installation" + exit 1 +fi + +function head_line { + echo "usage: [ROOT=/otherroot] `basename $0` [option expression]" +} + +function usage { + head_line + echo " +options are: + + -v, --view: view installed package contents + -p, --print: print the contents of a package file + -r, --remove: remove matching packages + -s, --search: search a file under installed packages + -d, --description: show matching packages' descriptions +" +} + +# ----------------------------------------------------- +# lspkg +# ----------------------------------------------------- + +if [ $# -eq 2 ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$2-[0-9]* 2> /dev/null`" + if [ -z "$LIST_PKGS" ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$2* 2> /dev/null`" + fi +elif [ $# -eq 1 ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$1-[0-9]* 2> /dev/null`" + if [ -z "$LIST_PKGS" ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$1* 2> /dev/null`" + fi +else + LIST_PKGS="`ls /$ROOT/var/log/packages/ 2> /dev/null`" +fi + +LIST_PKGS="`slash $LIST_PKGS`" + +case $1 in + "-h"|"--help") + usage + ;; + "-v"|"--view") + if [ ! -z "$2" ]; then + if [ ! -z "$LIST_PKGS" ]; then + for file in $LIST_PKGS; do + less $file + done + else + if [ ! -z "$ROOT" ]; then + echo "$2: package not found on /$ROOT/var/log/packages" + else + echo "$2: package not found on /var/log/packages" + fi + fi + else + head_line + exit 1 + fi + ;; + "-p"|"--print") + if [ -f "$2" ]; then + tar ztvf $2 + else + echo $2: file not found + fi + ;; + "-r"|"--remove") + if [ ! -z "$2" ]; then + if [ ! -z "$LIST_PKGS" ]; then + removepkg /$ROOT/var/log/packages/$1-[0-9]* + fi + fi + ;; + "-s"|"--search") + if [ ! -z "$2" ]; then + eval "grep -l '\/$2$' /$ROOT/var/log/packages/*" + fi + ;; + "-d"|"--description") + if [ ! -z "$2" ]; then + for file in $LIST_PKGS; do + pack="`package_name $file`" + echo -e " Package description for $file:\n" + sed -n "/^$pack:/ { s/$pack://; p; }" $file + done + else + head_line + exit 1 + fi + ;; + *) + if [ ! -z "$LIST_PKGS" ]; then + for pack in $LIST_PKGS; do + echo $pack + done + else + if [ ! -z "$ROOT" ]; then + echo "$1: package not found on /$ROOT/var/log/packages" + else + echo "$1: package not found on /var/log/packages" + fi + fi + ;; +esac diff --git a/branches/0.6/src/mkbuild b/branches/0.6/src/mkbuild new file mode 100755 index 0000000..cae7224 --- /dev/null +++ b/branches/0.6/src/mkbuild @@ -0,0 +1,1196 @@ +#!/bin/bash -x +# +# Script para gerar SlackBuild +# Por Rudson R. Alves +# +# Este script auxilia a criação de SlackBuilds, com o modelo +# do Luiz do Sarava Linux +# +# SlackBuilds são scripts utilizados no Slackware para gerar +# pacotes tgz. +# +# Turn off debug +set +x +# +# Version 0.9.18 +PROG_VERSION=0.9.18 + +#-------------------------------------------------------------------- +# Functions +#-------------------------------------------------------------------- +# Show ./configure --help +function config_help() +{ + view_file "Check ./configure --help" $CONFIG_HELP +} + +# Show file +# INPUT: $1 string textbox +# $2 file +function view_file() +{ + [ $# -ne 2 ] && return 1 + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title " $1 " --textbox $2 20 75 +} + +# Exit function +function mk_exit() +{ + clean_all + clear + exit $1 +} + +# Clear all temp files +function clean_all() +{ + [ -s $DEPENDENCY_LIST ] && cp $DEPENDENCY_LIST $BASEDIR/slack-required + + rm $AUX_TMP 2>/dev/null + rm $SLACKDESC_TMP 2>/dev/null + rm $SLACKBUILD.test 2>/dev/null + rm $DEPENDENCY_LIST 2>/dev/null + if [ ! -z $MK_PKGNAME ]; then + rm $BASEDIR/*_$MK_PKGNAME.mkbuild 2>/dev/null + rm -rf /tmp/$MK_PKGNAME 2>/dev/null + rm $CONFIG_HELP 2>/dev/null + fi +} + +# Print from file $2, the lines betwen <$1> and </$1> lines +function print_lines() +{ + [ $# -ne 2 ] && mk_exit 1 + eval "sed -n '/<$1>/,/<\/$1>/ { /<$1>/ b; /<\/$1>/ b; p; }' $2" +} + +# Print from file $2, the lines betwen <$1> and $2 lines +function print_lines_to() +{ + [ $# -ne 3 ] && mk_exit 1 + eval "sed -n '/<$1>/,/$2/ { /<$1>/ b; /$2/ b; p; }' $3" +} + +# Make slack-desc file +function mk_slackdesc() +{ + print_lines_to "slackdesc" "|-----" $SB_MODEL + echo -n $MK_PKGNAME | tr [a-z+\-] " " + echo -n "|-----handy-ruler" + let N=18+${#MK_PKGNAME} + for i in `seq $N $SLACKDESC_LEN`; do + echo -n "-" + done + echo -en "|\n" + + for i in `seq 1 11`; do + echo -en "$MK_PKGNAME: \n" + done + print_lines "slackdesc" $SB_MODEL | sed '1,/\]\]/ d' +} + +# Get label status from SlackBuild model +function get_status() +{ + [ $# -ne 2 ] && mk_exit 1 + eval "sed -n '/<$1>/ p' $2 | sed 's/.*> \([a-z]\+\)/\1/'" +} + +# Get status from edited SlackBuild +# input: $1 -> section name +# output: section status and section number +function mk_status() +{ + for i in `seq 0 $MAXSECTION`;do + if [ "${SECTION_NAME[i]}" = "$1" ]; then + echo "${SECTION_FLAG[i]} $i" + return 0 + fi + done + return 1 +} + +# Edit file $3, by change string [[$1]] to $2 +function edit_file() +{ + local STR_OLD + local STR_NEW + + [ $# -ne 3 ] && mk_exit 1 + STR_OLD=$( echo $1 | sed 's/\//\\\//g' ) + STR_NEW=$( echo $2 | sed 's/\//\\\//g' ) + eval "sed 's/\[\[$STR_OLD\]\]/$STR_NEW/' $3 > $AUX_TMP" + mv $AUX_TMP $3 +} + +# Unpackage source +function unpkg_source() +{ + # FIXME: if MK_DECOMPRESSOR -ne bunzip2 or gunzip... + if [ $MK_DECOMPRESSOR = "bunzip2" -o $MK_DECOMPRESSOR = "gunzip" ]; then + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Main Menu" --title "$MK_TITLE" --infobox "Uncompress source in /tmp/$MK_PKGNAME. Wait" 3 45 + [ $? -ne 0 ] && return 100 + mkdir /tmp/$MK_PKGNAME/ 2>/dev/null + tar xvf $MK_SOURCE -C /tmp/$MK_PKGNAME/ 1>/dev/null + [ $? -ne 0 ] && mk_exit 1 + MK_TMPSRC="/tmp/$MK_PKGNAME/`ls /tmp/$MK_PKGNAME/`" + + DOC_FILES=`find $MK_TMPSRC -type f -maxdepth 1 -name "[A-Z]*" | sed 's/.*\/\(.*\)$/\1/'` + else + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --title "$MK_TITLE" --msgbox "$MK_DECOMPRESSOR not configurated..." 5 45 + fi +} + +# Download source +function download_url() +{ + clear + mkdir -p $MK_SOURCEDIR/$MK_PKGNAME 2>/dev/null + wget --continue --limit-rate=$MK_LIMITRATE $MK_URL -P $MK_SOURCEDIR/$MK_PKGNAME/ + if [ $? -ne 0 ]; then + echo "URL error" + return 0 + fi + MK_SOURCE=$MK_SOURCEDIR/$MK_PKGNAME/$MK_SRCNAME +} + +# Select source file +function select_source() +{ + MK_SOURCE=$BASEDIR + while [ ! -f $MK_SOURCE ]; do + MK_SOURCE=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Main Menu" --title " Select source file name (use spaces to select): " --fselect "$MK_SOURCE" 10 70` + [ $? -ne 0 ] && return 100 + if [ ! -f $MK_SOURCE ]; then + MK_SOURCE="$MK_SOURCE/" + fi + done + + MK_SRCNAME=`basename $MK_SOURCE` + MK_SOURCEDIR=`dirname $MK_SOURCE` +} + +#-------------------------------------------------------------------- +# Edit functions +#-------------------------------------------------------------------- +# Edit authot, Initials and editor +function edit_author() +{ + MK_AUTHOR=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with author complite name:" 8 60 "$MK_AUTHOR"` + edit_file "AUTHOR NAME" "$MK_AUTHOR" ~/.mkslackbuild + + MK_AUTHOR_INITIALS=`echo $MK_AUTHOR | sed 's/ /\n/g' | sed 's/^\([A-Z]\).*/\1/' | sed ':i; $!N; s/\n//; ti' | tr [A-Z] [a-z]` + MK_AUTHOR_INITIALS=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with author assignature:" 8 60 "$MK_AUTHOR_INITIALS"` + edit_file "AUTHOR INITIALS" "$MK_AUTHOR_INITIALS" ~/.mkslackbuild + + MK_EDITOR=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with editor command:" 8 60 "pico"` + edit_file "EDITOR" "$MK_EDITOR" ~/.mkslackbuild + + MK_SOURCEDIR=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with sources directory:" 8 60 "\`pwd\`"` + edit_file "SOURCE DIR" "$MK_SOURCEDIR" ~/.mkslackbuild + + if [ "$USER" != "root" ]; then + SLACKBUILDRC=`[ -e ~/.slackbuildrc ] && echo ~/.slackbuildrc || echo /etc/slackbuildrc` + MK_REPOS=`grep 'REPOS=' $SLACKBUILDRC | sed 's/REPOS=\(.*\)/\1/'` + else + SLACKBUILDRC=`su -c "[ -e ~/.slackbuildrc ] && echo ~/.slackbuildrc || echo /etc/slackbuildrc" 2>/dev/null` + MK_REPOS=`su -c "grep 'REPOS=' $SLACKBUILDRC | sed 's/REPOS=\(.*\)/\1/'" 2>/dev/null` + fi + + MK_REPOS=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with binary repository directory:" 8 60 "$MK_REPOS"` + edit_file "REPOS DIR" "$MK_REPOS" ~/.mkslackbuild + + MK_SLACKBUILD_DIR=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with binary repository directory:" 8 60 "$MK_SLACKBUILD_DIR"` + edit_file "SLACKBUILD DIR" "$MK_SLACKBUILD_DIR" ~/.mkslackbuild + + MK_ARCH=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter default architecture to SlackBuild:" 8 60 "i468"` + edit_file "DEFAULT ARCH" "$MK_ARCH" ~/.mkslackbuild + + MK_LIMITRATE=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter wget limit rate:" 8 60 "120k"` + edit_file "LIMIT RATE" "$MK_LIMITRATE" ~/.mkslackbuild +} + +# Edit source URL +function edit_url() +{ + MK_URL=${MK_URL:="http://downloads.sourceforge.net/"} + MK_URL=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --cancel-label "Main Menu" --title "$MK_TITLE" --inputbox "Enter with complite URL from source:" 8 60 "$MK_URL"` + [ $? -ne 0 ] && return 100 +} + +# Edit source name +function edit_source_name() +{ + # Carrega nome do arquivo + MK_SRCNAME=`basename $MK_URL` + MK_SRCNAME=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --cancel-label "Main Menu" --title "$MK_TITLE" --inputbox "Enter with source file name:" 8 60 "$MK_SRCNAME"` + [ $? -ne 0 ] && return 100 +} + +# Edit MK_PKGNAME, MK_VERSION and MK_EXTENSION +function edit_pkgname() +{ + # Remove nome, versão e extensão do nome da fonte + MK_SRC_NAME=`echo $MK_SRCNAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\1/'` + MK_PKGNAME=`echo $MK_SRC_NAME | tr [A-Z_] [a-z\-]` + MK_VERSION=`echo $MK_SRCNAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\2/'` + MK_EXTENSION=`echo $MK_SRCNAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\3/'` + + # Configura nome, versão e extensão do pacote + ANS=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Main Menu" --title "$MK_TITLE" \ + --form "Check information below:" 14 52 7 \ + "Source name:" 1 1 "$MK_SRC_NAME" 1 15 30 60 \ + "Package name:" 3 1 "$MK_PKGNAME" 3 15 30 60 \ + "Version:" 5 1 "$MK_VERSION" 5 15 30 60 \ + "Extension:" 7 1 "$MK_EXTENSION" 7 15 30 60` + [ $? -ne 0 ] && return 100 + + MK_SRC_NAME=`echo $ANS | awk '{print $1}'` + MK_PKGNAME=`echo $ANS | awk '{print $2}'` + MK_VERSION=`echo $ANS | awk '{print $3}'` + MK_EXTENSION=`echo $ANS | awk '{print $4}'` +} + +# Edit MK_DECOMPRESSOR and MK_DECOMPRESSOR_TEST_FLAG +function edit_decompress_arg() +{ + # Remove nome, versão e extensão do nome da fonte + MK_DECOMPRESSOR="" + MK_DECOMPRESSOR_TEST_FLAG="" + + # Configura nome, versão e extensão do pacote + ANS3=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Main Menu" --title "$MK_TITLE" \ + --form "Check information below:" 10 55 3 \ + "Uncompress program:" 1 1 "$MK_DECOMPRESSOR" 1 23 25 60 \ + "Uncompress test flag:" 3 1 "$MK_DECOMPRESSOR_TEST_FLAG" 3 23 25 100` + [ $? -ne 0 ] && return 100 + + MK_DECOMPRESSOR=`echo $ANS3 | awk '{print $1}'` + MK_DECOMPRESSOR_TEST_FLAG=`echo $ANS3 | awk '{print $2}'` +} + +# Edit configure options +function edit_configure() +{ + CONFIG_HELP=`mktemp -p /tmp/ config_$MK_PKGNAME.XXXXXX` + + $MK_TMPSRC/configure --help > $CONFIG_HELP + config_help + #[ "$( cat $CONFIG_HELP | egrep '/usr/local')" != "" ] && MK_PREFIX=/usr || MK_PREFIX=/opt/kde + MK_PREFIX="/usr" + MK_OPTIONS="" + local ANS0=1 + + while [ $ANS0 -eq 1 ]; do + local ANS1="7" + while [ $ANS1 -ne 0 ]; do + ANS1=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Continue" --title "$MK_TITLE" \ + --menu "Select one option" 0 0 0 \ + 1 "View ./configure --help" \ + 2 "View documentations" \ + 3 "PREFIX=$MK_PREFIX" \ + 4 "OPTIONS=$MK_OPTIONS" \ + 0 "Continue"` + + case $ANS1 in + '1') + config_help + ;; + '2') + view_docs + ;; + '3') + MK_PREFIX=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with prefix for install $MK_PKGNAME" 8 60 "$MK_PREFIX"` + ;; + '4') + MK_OPTIONS=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with configure options for compile $MK_PKGNAME" 8 60 "$MK_OPTIONS"` + ;; + *) + ANS1=0 + ;; + esac + done + + # Configure + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title " Execute ./configure below? " --yesno "./configure --prefix=$MK_PREFIX $MK_OPTIONS" 6 70 + if [ $? -eq 0 ]; then + ( + cd $MK_TMPSRC + ./configure --prefix=$MK_PREFIX $MK_OPTIONS + ) + + echo -en "\nPress ENTER to continue" + read ANS0 + fi + + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title " Configure line is ok? " --yesno "./configure --prefix=$MK_PREFIX $MK_OPTIONS" 6 70 + + ANS0=$? + done +} + +# Show Documentations files +function view_docs() +{ + local MENU="" + local SELECT="" + local ANS2=0 + + for i in $DOC_FILES; do + MENU="$MENU \"$i\" \"\" " + done + + while [ $ANS2 -eq 0 ]; do + SELECT=`eval "dialog --stdout --backtitle \"Make SlackBuild $PROG_VERSION [$MK_PKGNAME]\" --cancel-label \"Continue\" --title \"$MK_TITLE\" --menu \"Select doc-file below:\" 20 45 13 $MENU"` + ANS2=$? + [ $ANS2 -eq 0 ] && view_file "File: $SELECT" $MK_TMPSRC/$SELECT + done +} + +# Edit documentations files +function edit_docfiles() +{ + [ -z $MK_TMPSRC ] && return 0 + + if [ -e $MK_TMPSRC ]; then + LIST=`( cd $MK_TMPSRC; find . -type f -maxdepth 1 | cut -c3- )` + DOCMENU="" + for i in $LIST; do + if [ "`echo NEWS TODO README AUTHORS INSTALL ChangeLog MAINTAINERS COPYING | grep $i`" != "" ]; then + DOCMENU="$DOCMENU $i \"\" on" + else + DOCMENU="$DOCMENU $i \"\" off" + fi + done + SELECTDOCS=`eval "dialog --stdout --separate-output --backtitle \"Make SlackBuild $PROG_VERSION [$MK_PKGNAME]\" --title \"$MK_TITLE\" --cancel-label \"Continue\" --checklist \"Select documentation files below:\" 20 45 13 $DOCMENU"` + fi + + MK_DOCFILES="`echo $SELECTDOCS | sed ':i; N; s/\n/ /; bi'`" +} + +# Edit compiler architecture +function edit_arch() +{ + MK_ARCH=`dialog --stdout --backtitle "Make SlackBuild documentation files below:" --cancel-label "Main Menu" --title "$MK_TITLE" --inputbox "Set an architecture to compiler:" 8 45 $MK_ARCH` + [ $? -ne 0 ] && return 100 +} + +#-------------------------------------------------------------------- +# Mount files +#-------------------------------------------------------------------- +# Change string $1 to $2 in all files in the current directory +function change_strings() +{ + [ $# -ne 2 ] && mk_exit 1 + #[ -z "$2" ] && return 0 + eval "grep -l \"\[\[$1\]\]\" *" | while read FILE; do + edit_file "$1" "$2" $FILE + done +} + +# Build initial sections +function start_build() +{ + change_strings "SLACKBUILD AUTHOR" "$MK_AUTHOR" + change_strings "SLACKBUILD AUTHOR INITIALS" $MK_AUTHOR_INITIALS + change_strings "SOURCE NAME" "$MK_SRC_NAME" + change_strings "PROGRAM NAME" "$MK_PKGNAME" + change_strings "PACKAGE NAME" "$MK_PKGNAME" + change_strings "DECOMPRESSOR" "$MK_DECOMPRESSOR" + change_strings "DECOMPRESSOR TEST FLAG" "$MK_DECOMPRESSOR_TEST_FLAG" + change_strings "PROGRAM URL" "${MK_URL//$MK_SRCNAME}" + change_strings "ARCH" "$MK_ARCH" + change_strings "VERSION" $MK_VERSION + change_strings "SOURCE EXTENSION" ${MK_EXTENSION#tar.} + change_strings "DOWNLOAD FOLDER URL" "`dirname $MK_URL`" + if [ -z $MK_OPTIONS ]; then + change_strings "OTHER CONFIGURE ARGS" "\"\"" + else + change_strings "OTHER CONFIGURE ARGS" "$MK_OPTIONS" + fi + change_strings "DOCUMENTATION FILES" "$MK_DOCFILES" + change_strings "PREFIX" "$MK_PREFIX" +} + +# Mount final SlackBuild +function mount_slackbuild() +{ + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --infobox "SlackBuild save in $SLACKBUILD" 5 45 + + rm $SLACKBUILD 2>/dev/null +# [ ! -e `dirname $SLACKBUILD` ] && mkdir `dirname $SLACKBUILD` + for i in `seq 0 $MAXSECTION`; do + if [ "${SECTION_FLAG[i]}" = "all" -o "${SECTION_FLAG[i]}" = "on" ]; then + cat ${SECTION_NAME[i]}_$MK_PKGNAME.mkbuild >> $SLACKBUILD + echo "" >> $SLACKBUILD + fi + done + chmod +x $SLACKBUILD +} + +# Mount SlackBuild to section $1 +function mount_slackbuild_to() +{ + if [ $# -eq 1 ]; then + END_SECTION=$1 + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --infobox "SlackBuild save in $SLACKBUILD.test" 5 45 + + rm $SLACKBUILD.test 2>/dev/null + let i=0 + while [ $i -le $END_SECTION ]; do + if [ "${SECTION_FLAG[i]}" = "all" -o "${SECTION_FLAG[i]}" = "on" ]; then + cat ${SECTION_NAME[i]}_$MK_PKGNAME.mkbuild >> $SLACKBUILD.test + echo "" >> $SLACKBUILD + fi + let i++ + done + echo "" >> $SLACKBUILD + fi +} + +# Make files section +function make_file_sections() +{ + THIS_MODEL=$1 + + # Create SlackBuilds-sections files + rm *_$MK_PKGNAME.mkbuild 2>/dev/null + + # Make files section + INDEX=0 + while read ITEM; do + SECTION_NAME[INDEX]="$ITEM" + + AUX=${SB_SECTION[$INDEX,0]}_${MK_PKGNAME} + SECTION_FILE=${SECTION_NAME[INDEX]}_${MK_PKGNAME}.mkbuild + rm $SECTION_FILE 2>/dev/null + + STRING=$ITEM + # Save section status flag + SECTION_FLAG[INDEX]=`get_status "$STRING" $THIS_MODEL` + + # Create sections files + print_lines "$STRING" $THIS_MODEL > $SECTION_FILE + let INDEX++ + done < <( cat $THIS_MODEL | grep '^<[a-z_0-9]\+>' | sed 's/<\(.*\)>.*$/\1/' ) + + let INDEX-- + MAXSECTION=$INDEX + md5sum *.mkbuild > md5sum +} + +function get_source_dialog() +{ + if [ ! -e $MK_SOURCE ]; then + dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --title "$MK_TITLE" --yesno " Download $MK_SRCNAME? " 5 50 + if [ $? -eq 0 ]; then + download_url + else + select_source + [ $? -eq 100 ] && return 100 + fi + fi +} + + +function test_source() +{ + local TEST=1 + local ANS=0 + + while [ $TEST -ne 0 ]; do + dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --infobox "Test source with $MK_DECOMPRESSOR $MK_DECOMPRESSOR_TEST_FLAG $MK_SOURCE" 5 50 + $MK_DECOMPRESSOR $MK_DECOMPRESSOR_TEST_FLAG $MK_SOURCE + TEST=$? + if [ $TEST -ne 0 ]; then + dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --yesno "Source uncompress error. Download source again?" 6 50 + if [ $? -eq 0 ]; then + rm $MK_SOURCE + get_source_dialog + [ $? -eq 100 ] return 100 + else + TEST=0 + fi + fi + done +} + +# Configure test source variables +function set_source_test() +{ + MK_SOURCE=$MK_SOURCEDIR/$MK_PKGNAME/$MK_SRCNAME + if [ "$MK_EXTENSION" = "tar.gz" -o "$MK_EXTENSION" = "gz" -o "$MK_EXTENSION" = "tgz" ]; then + MK_DECOMPRESSOR=gunzip + MK_DECOMPRESSOR_TEST_FLAG="-t" + elif [ "$MK_EXTENSION" = "tar.bz2" -o "$MK_EXTENSION" = "bz2" ]; then + MK_DECOMPRESSOR=bunzip2 + MK_DECOMPRESSOR_TEST_FLAG="-t" + else + edit_decompress_arg + [ $? -eq 100 ] && return 100 + fi +} + +# Enable MD5 or GPG signature check +function edit_signature() +{ + # GPG and MD5 test + local ANS=0 + + ANS=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --title "$MK_TITLE" --menu "Select code validate type:" 0 0 0 \ + "1" "gpg signature" \ + "2" "md5sum" \ + "0" "none"` + + case $ANS in + 1) + edit_gpg + ;; + 2) + edit_md5sum + ;; + esac +} + +# Enable GPG signature check +function edit_gpg() +{ + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --title "$MK_TITLE" --msgbox "Enter with gpg minimized signing key." 5 50 + $EDITOR $MK_GPGFILEKEY +} + +# Enable MD5SUM signature check +function edit_md5sum() +{ + echo "none" +} + +#-------------------------------------------------------------------- +# Main functions +#-------------------------------------------------------------------- +# Create new SlackBuild +function create_slackbuild() +{ + # Config package URL + edit_url + [ $? -eq 100 ] && return 100 + + # Source Name + edit_source_name + [ $? -eq 100 ] && return 100 + + # Package name, version and extension + edit_pkgname + [ $? -eq 100 ] && return 100 + + # Compile arch + edit_arch + [ $? -eq 100 ] && return 100 + + # Set source test variables + set_source_test + [ $? -eq 100 ] && return 100 + + # Get source file + MK_SOURCE=$MK_SOURCEDIR/$MK_PKGNAME/$MK_SRCNAME + get_source_dialog + [ $? -eq 100 ] && return 100 + + # Test source + test_source + [ $? -eq 100 ] && return 100 + + # Uncompress source + unpkg_source + [ $? -eq 100 ] && return 100 + + # GPG and MD5 test +# edit_signature + + # Configure compiler options if exist + if [ -e $MK_TMPSRC/configure ]; then + edit_configure + fi + + # Edit documentation list + edit_docfiles + + # Create files sections + make_file_sections $SB_MODEL + + # SlackBuild script name + SLACKBUILD=$BASEDIR/$MK_PKGNAME.SlackBuild + + # mkSlackBuild script name + # FIXME: make an MODELDIR??? + MKSLACKBUILD=$BASEDIR/$MK_PKGNAME.mkslackbuild + + mk_slackdesc > slackdesc_$MK_PKGNAME.mkbuild + + # Edit builds sections + start_build + + # Main-Menu + edit_menu +} + +# Open mkslackbuild dialog input +function open_mkslackbuild_dialog() +{ + MKSLACKBUILD=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --title " Select source file name: " \ + --fselect "$BASEDIR/" 10 70` + [ $? -ne 0 ] && return 100 + + open_mkslackbuild + [ $? -eq 100 ] || return 100 +} + +# Open mkslackbuild +function open_mkslackbuild() +{ + if [ -f $MKSLACKBUILD ]; then + # Start defaults variables + source $MKSLACKBUILD + + # SlackBuild scrit name + SLACKBUILD=$BASEDIR/$MK_PKGNAME.SlackBuild + + # Create files sections + make_file_sections $MKSLACKBUILD + + [ -e $BASEDIR/slack-required ] && ( cp $BASEDIR/slack-required $DEPENDENCY_LIST ) + + else + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --title "$MK_TITLE" --msgbox "$MKSLACKBUILD most be a mkslackbuild file" 6 45 + return 100 + fi + + # CHECK: + # Set source test vadiables + set_source_test + [ $? -eq 100 ] && return 100 + + # Get source file + get_source_dialog + [ $? -eq 100 ] && return 100 + + # Test source + test_source + + # Uncompress source + unpkg_source +} + +# Save mkSlackBuild +function save_mkslackbuild() +{ + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --infobox "mkSlackBuild save in $MKSLACKBUILD" 5 30 + + rm $MKSLACKBUILD 2>/dev/null + echo '#!/bin/bash' > $MKSLACKBUILD + echo -e "# mkSlackBuild version $MK_VERSION\n" >> $MKSLACKBUILD + echo "MK_SRC_NAME=\"$MK_SRC_NAME\"" >> $MKSLACKBUILD + echo "MK_SRCNAME=\"$MK_SRCNAME\"" >> $MKSLACKBUILD + echo "MK_PKGNAME=\"$MK_PKGNAME\"" >> $MKSLACKBUILD + echo "MK_URL=\"$MK_URL\"" >> $MKSLACKBUILD + echo "MK_AUTHOR=\"$MK_AUTHOR\"" >> $MKSLACKBUILD + echo "MK_AUTHOR_INITIALS=\"$MK_AUTHOR_INITIALS\"" >> $MKSLACKBUILD + echo "MK_VERSION=\"$MK_VERSION\"" >> $MKSLACKBUILD + echo "MK_EXTENSION=\"$MK_EXTENSION\"" >> $MKSLACKBUILD + echo "MK_DECOMPRESSOR=\"$MK_DECOMPRESSOR\"" >> $MKSLACKBUILD + echo "MK_DECOMPRESSOR_TEST_FLAG=\"$MK_DECOMPRESSOR_TEST_FLAG\"" >> $MKSLACKBUILD + echo "MK_DOCFILES=\"$MK_DOCFILES\"" >> $MKSLACKBUILD + echo "MK_OPTIONS=\"$MK_OPTIONS\"" >> $MKSLACKBUILD + echo "MK_PREFIX=\"$MK_PREFIX\"" >> $MKSLACKBUILD + echo "MK_MD5SUM_EXT=\"$MK_MD5SUM_EXT\"" >> $MKSLACKBUILD + echo -e "return 0\n\n" >> $MKSLACKBUILD + + for i in `seq 0 $MAXSECTION`; do + echo "<${SECTION_NAME[i]}> ${SECTION_FLAG[i]}" >> $MKSLACKBUILD + cat ${SECTION_NAME[i]}_$MK_PKGNAME.mkbuild >> $MKSLACKBUILD + echo "</${SECTION_NAME[i]}>" >> $MKSLACKBUILD + echo "" >> $MKSLACKBUILD + done + + [ -s $DEPENDENCY_LIST ] && cp $DEPENDENCY_LIST $BASEDIR/slack-required +} + +# Edit Menu +function edit_menu() +{ + ANSE=0 + while [ $ANSE -ne 1 ]; do + # Create main-menu string + EDITMENU="" + for i in `seq 0 $MAXSECTION`; do + #echo "${SECTION_NAME[i]} ${SECTION_FLAG[i]} ${SECTION_FILE[i]}" + EDITMENU="$EDITMENU ${SECTION_NAME[i]} ${SECTION_FLAG[i]}" + done + + SELECT=`eval "dialog --stdout --backtitle \"Make SlackBuild $PROG_VERSION [$MK_PKGNAME]\" --ok-label \"Edit\" --cancel-label \"Main Menu\" --title \"$MK_TITLE\" --menu \"Select one section to edit\" 20 40 13 $EDITMENU"` + ANSE=$? + if [ $ANSE -ne 1 ]; then + STATUS=`mk_status $SELECT` + if [ $? -ne 0 ]; then + echo "Section name error..." + mk_exit 1 + fi + FLAG=`echo $STATUS | awk '{print $1}'` + INDEX=`echo $STATUS | awk '{print $2}'` + if [ "$FLAG" = "on" ]; then + SECTION_FLAG[$INDEX]=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --radiolist "Change $SELECT status?" 0 0 0 "on" "enable section" "on" "off" "desable section" "off"` + elif [ "$FLAG" = "off" ]; then + SECTION_FLAG[$INDEX]=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --radiolist "Change $SELECT status?" 0 0 0 "on" "enable section" "off" "off" "desable section" "on"` + fi + if [ $? -eq 0 ]; then + if [ "${SECTION_FLAG[$INDEX]}" = "on" -o "${SECTION_FLAG[$INDEX]}" = "all" ]; then + if [ "$SELECT" = "md5sum_download_and_check" ]; then + md5sum_edit ${SELECT}_${MK_PKGNAME}.mkbuild +# elif [ "$SELECT" = "gpg_signature_check" ]; then +# gpg_edit + else + $MK_EDITOR ${SELECT}_${MK_PKGNAME}.mkbuild + fi + fi + else + SECTION_FLAG[$INDEX]=$FLAG + fi + fi + done +} + +# Edit md5sum +function md5sum_edit() +{ + local SELECT=0 + local FILE=$1 + + if ( grep '\[\[MD5SUM EXTENSION\]\]' $FILE &>/dev/null ); then + SELECT=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --radiolist "Select one option" 0 0 0 "1" "$MK_SRC_NAME-$MK_VERSION.[[MD5SUM EXT]]" on "2" "$MK_SRCNAME.[[MD5SUM EXT]]" off "3" "MK5SUM CODE" off` + + case $SELECT in + 1) + MK_MD5SUM_EXT="md5sum" + MK_MD5SUM_EXT=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with md5sum extension:" 8 50 $MK_MD5SUM_EXT` + edit_file "MD5SUM EXTENSION" "$MK_MD5SUM_EXT" $FILE + ;; + 2) + MK_MD5SUM_EXT="md5" + MK_MD5SUM_EXT=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with md5sum extension:" 8 50 $MK_MD5SUM_EXT` + eval "sed 's/^MD5SUM_FILE.*$/MD5SUM_FILE=\$SRC.$MK_MD5SUM_EXT/' $FILE > $AUX_TMP" + cp $AUX_TMP $FILE + ;; + 3) + MK_MD5SUM_CODE=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter with md5sum extension:" 8 50 $MK_MD5SUM_CODE` + sed '1! d' $FILE > $AUX_TMP + sed -n '2, /^fi/ p' $FILE | while read LINE; do echo "#$LINE" >> $AUX_TMP; done + sed -n '/^fi/, $ { /^fi/ b; p; }' $FILE >> $AUX_TMP + eval "sed 's/^MD5SUM_SRC.*/MD5SUM_SRC=\"$MK_MD5SUM_CODE\"/' $AUX_TMP > $FILE" + ;; + esac + fi + + $MK_EDITOR $FILE +} + +# Test Menu +function test_menu() +{ + local ANST=0 + local SECTION=0 + local EDITMENU="" + + # Create main-menu string + for i in `seq 0 $MAXSECTION`; do + if [ "${SECTION_FLAG[i]}" = "all" -o "${SECTION_FLAG[i]}" = "on" ]; then + EDITMENU="$EDITMENU $i ${SECTION_NAME[i]}" + fi + done + + EDITMENU="all \"SlackBuild\" $EDITMENU" + + while [ "$ANST" != "1" ]; do + SECTION=`eval "dialog --stdout --backtitle \"Make SlackBuild $PROG_VERSION [$MK_PKGNAME]\" --cancel-label \"Exit\" --title \"$MK_TITLE\" --menu \"Select section to test end\" 20 40 13 $EDITMENU"` + ANST=$? + + if [ $ANST -ne 1 ]; then + [ "$SECTION" = "all" ] && SECTION=$MAXSECTION + mount_slackbuild_to $SECTION + + # FIXME: -> sintaxe check + clear + echo "---------------------------------------------------------" + echo " --= SINTAX CHECK =--" + sh -n $SLACKBUILD.test + if [ $? -eq 0 ]; then + echo " --= 0K =--" + DEBUG=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "no debug" --title "$MK_TITLE" \ + --menu "Select debug level" 10 35 3 \ + "-x" "Simple debug" \ + "-xv" "More information" \ + "none" "No debug"` + + [ $? -ne 0 -o "$DEBUG" = "none" ] && DEBUG="" + + clear + echo "---------------------------------------------------------" + echo " --= START BUILDING =--" + if [ "$USER" != "root" ]; then + su -c "( sh $DEBUG $SLACKBUILD.test )" + else + ( sh $DEBUG $SLACKBUILD.test ) + fi + echo "---------------------------------------------------------" + echo " --= END =--" + + echo -n "Enter 1 to end test: " + read ANST + else + echo "Script error..." + read ANST + fi + fi + done +} + +# Dependency Menu +function menu_dependency() +{ + local ANSD=11 + while [ $ANSD -ne 0 ]; do + ANSD=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Main Menu" --title "$MK_TITLE" --menu "Main Menu:" 0 0 0 \ + "1" "Edit dependency list" \ + "2" "Test dependency list"` + + [ $? -ne 0 ] && ANSD=0 + + case $ANSD in + 1) + edit_dependency + ;; + 2) + test_dependency + ;; + esac + done +} + +# Dependency list edit +function edit_dependency() +{ + if [ ! -s $DEPENDENCY_LIST ]; then + echo -e "# Dependency list to $MK_PKGNAME\n# \n# dependency [condition] [version]]\n" > $DEPENDENCY_LIST + fi + + $MK_EDITOR $DEPENDENCY_LIST +} + +# Check dependency and comment not found dependencies +function test_dependency() +{ + local DEP_LIST="" + + if [ -s $DEPENDENCY_LIST ]; then + for i in `grep '^[^#]' $DEPENDENCY_LIST | awk '{print $1}' | sort | uniq`; do + if [ `ls /var/log/packages/$i-[0-9]* 2>/dev/null` ]; then + DEP_LIST="$DEP_LIST $i \"intalled\" off" + else + DEP_LIST="$DEP_LIST $i \"unintalled\" on" + fi + done + + DEP_SELECT=`eval "dialog --stdout --separate-output --backtitle \"Make SlackBuild $PROG_VERSION [$MK_PKGNAME]\" --title \"$MK_TITLE\" --checklist \"Select packages to remove from dependency list:\" 0 0 0 $DEP_LIST"` + # 20 45 13 + + for i in $DEP_SELECT; do + eval "sed 's/$i$/#$i/' $DEPENDENCY_LIST > $AUX_TMP " + eval "sed 's/$i /#$i /' $AUX_TMP > $DEPENDENCY_LIST" + eval "sed 's/$i\t/#$i\t/' $DEPENDENCY_LIST > $AUX_TMP" + cp $AUX_TMP $DEPENDENCY_LIST + done + fi +} + +# Add/commit one SlackBuild +function commit_SlackBuild() +{ + # Mount SlackBuild + mount_slackbuild + MK_TITLE="Commit SlackBuild" + + # Find SlackBuild + SB_PATH=`find $MK_SLACKBUILD_DIR -iname $MK_PKGNAME` + + # Change to SlackBuild directory + cd $MK_SLACKBUILD_DIR + + # Check for new SlackBuild + if [ -z $SB_PATH ]; then + # New SlackBuild + AUX="" + while [ -z $AUX ]; do + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --infobox "lynx -dump http://gentoo-portage.com/Search?search=$MK_PKGNAME. Wait..." 0 0 + AUX=`lynx -dump http://gentoo-portage.com/Search?search=$MK_PKGNAME | sed -n '/Results:/,+1 { /Results:/ b ; p }' | head --lines=1 | tr -d " "` + # Default directory + if [ -z $AUX ]; then + dialog --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --yesno "Net search error. Try again?" 0 0 + if [ $? -ne 0 ]; then + AUX="/others/unclass" + SB_PATH=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter dir-name to SlackBuild from $MK_PKGNAME:" 8 60 "$AUX"` + fi + else + SB_PATH="`dirname $AUX | tr - /`/`basename $AUX`" + fi + done + # Make directory and add SlackBuild to svn + svn mkdir $SB_PATH + cp $BASEDIR/$MK_PKGNAME.SlackBuild $SB_PATH/ + svn add $SB_PATH/$MK_PKGNAME.SlackBuild + if [ -e $BASEDIR/slack-required ]; then + cp $BASEDIR/slack-required $SB_PATH/ + svn add $SB_PATH/slack-required + fi + else + echo "cp $BASEDIR/$MK_PKGNAME.SlackBuild $SB_PATH/" + if [ -e $BASEDIR/slack-required ]; then + cp $BASEDIR/slack-required $SB_PATH/ + fi + fi + + # Commit SlackBuild + MK_MSG=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" --title "$MK_TITLE" --inputbox "Enter message do commit command:" 8 60` + svn commit -m "$MK_PKGNAME: $MK_MSG" + + cd $BASEDIR + + echo -e "\nPress ENTER to continue." + read ANS1 +} + +# Compile SlackBuild and install +function compile_install() +{ + local ANS="" + # Mount SlackBuild + mount_slackbuild + + # Clean temporary file + echo " " > $AUX_TMP + + if [ "$USER" = "root" ]; then + # Root user + # Compile pid + PID=`exec-slackbuild $SLACKBUILD $AUX_TMP` + + # Tail messages + tail -s .1 --pid=$PID -f $AUX_TMP + + # Package name + PACKAGE=`tail -10 $AUX_TMP | grep "^Moving $MK_PKGNAME-[0-9].*\.\.\.$" | awk '{ print $2 }' | grep "$MK_PKGNAME-.*\.tgz$"` + + # Install package + if [ ! -z $PACKAGE ]; then + installpkg $MK_REPOS/$PACKAGE + else + echo -e "\nBuild error!" + fi + else + # Commum users + # Compile pid + PID=`su -c "exec-slackbuild $SLACKBUILD $AUX_TMP"` + + # Tail messages + tail -s .1 --pid=$PID -f $AUX_TMP + + # Package name + PACKAGE=`tail -10 $AUX_TMP | grep "^Moving $MK_PKGNAME-[0-9].*\.\.\.$" | awk '{ print $2 }' | grep "$MK_PKGNAME-.*\.tgz$"` + + # Install package + if [ ! -z $PACKAGE ]; then + su -c "installpkg $MK_REPOS/$PACKAGE" + else + echo -e "\nBuild error!" + fi + fi + + echo -e "\nPress ENTER to continue." + read ANS +} + +# +#-------------------------------------------------------------------- +# Start Program +#-------------------------------------------------------------------- +# +# Start variables +LANG=en_US +BASEDIR=`pwd` +AUX_TMP=`mktemp -p /tmp/ aux_tmp.XXXXXX` +SLACKDESC_TMP=`mktemp -p /tmp/ slackdesc_tmp.XXXXXX` +SLACKDESC_LEN=77 +DEPENDENCY_LIST=`mktemp -p /tmp/ slack-required.XXXXXX` +if [ -z $SB_MODEL ]; then + if [ -e ~/.generic.mkSlackBuild ]; then + SB_MODEL=~/.generic.mkSlackBuild + elif [ -e /etc/simplepkg/generic.mkSlackBuild ]; then + SB_MODEL=/etc/simplepkg/generic.mkSlackBuild + else + echo "SlackBuild model (generic.mkSlackBuild) not found" + mk_exit 0 + fi +fi +[ $# -ne 0 ] && MKSLACKBUILD=${1//.*}.mkslackbuild + +# Clear dialog +dialog --clear + +# Load/create personal definitions +if [ ! -e ~/.mkslackbuild ]; then + ( cat << EOF > ~/.mkslackbuild +#!/bin/bash +# mkslackbuild definitions +# +MK_AUTHOR="[[AUTHOR NAME]]" +MK_AUTHOR_INITIALS="[[AUTHOR INITIALS]]" +MK_EDITOR=[[EDITOR]] +MK_REPOS=[[REPOS DIR]] +MK_LIMITRATE=[[LIMIT RATE]] +MK_SOURCEDIR=[[SOURCE DIR]] +MK_ARCH=[[DEFAULT ARCH]] +MK_SLACKBUILD_DIR=[[SLACKBUILD DIR]] +#SB_MODEL="my_model" +EOF +) +fi +source ~/.mkslackbuild +MK_SOURCEDIR=${MK_SOURCEDIR:=$BASEDIR} +MK_ARCH=${MK_ARCH:="i486"} + +# Config Author +if [ "$MK_AUTHOR" = "[[AUTHOR NAME]]" ]; then + MK_TITLE=" Personal Config " + edit_author + MK_TITLE="" +fi + +if [ ! -z $MKSLACKBUILD ]; then + MK_TITLE=" Open mkSlackBuild " + open_mkslackbuild +fi + +MK_TITLE="" + +ANS0=11 +while [ $ANS0 -ne 0 ]; do + if [ -z $MK_PKGNAME ]; then + ANS0=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Exit" --menu "Main Menu:" 0 0 0 \ + "1" "Create New SlackBuild" \ + "2" "Open mkSlackBuild" \ + "0" "Exit"` + + if [ $? -ne 0 ]; then + ANS0=0 + fi + + case $ANS0 in + 1) + MK_TITLE=" Create SlackBuild " + create_slackbuild + [ $? -eq 100 ] && MK_PKGNAME="" + ;; + 2) + MK_TITLE=" Open mkSlackBuild " + open_mkslackbuild_dialog + [ $? -eq 100 ] && MK_PKGNAME="" + ;; + *) + echo "Exit..." + ANS0=0 + ;; + esac + MK_TITLE="" + else + ANS0=`dialog --stdout --backtitle "Make SlackBuild $PROG_VERSION [$MK_PKGNAME]" \ + --cancel-label "Exit" --menu "Main Menu:" 0 0 0 \ + "1" "Edit SlackBuild sections" \ + "2" "Edit dependency list" \ + "3" "Test SlackBuild script" \ + "4" "View Doc-Files" \ + "5" "Save SlackBuild and mkslackbuild" \ + "6" "Compile/install package" \ + "7" "Remove package" \ + "8" "Commit SlackBuild to Sarava"` + + if [ $? -ne 0 ]; then + ANS0=0 + fi + case $ANS0 in + 1) # Edit Sections + MK_TITLE=" Edit Menu " + edit_menu + ;; + 2) # Dependency Menu + MK_TITLE=" Dependency Menu " + menu_dependency + ;; + 3) # Test Script + MK_TITLE=" Test Menu " + test_menu + ;; + 4) # View Doc-Files + MK_TITLE=" View Docs " + view_docs + ;; + 5) # Save SlackBuild + save_mkslackbuild + mount_slackbuild + ;; + 6) # Compile/install package + compile_install + ;; + 7) # Remove package + if [ "$USER" = "root" ]; then + removepkg $MK_PKGNAME + else + su -c "( removepkg $MK_PKGNAME )" + fi + echo -e "\nPress ENTER to continue." + read ANS1 + ;; + 8) # Commit SlackBuild to Sarava + commit_SlackBuild + ;; + 0) # Exit + ANS0=0 + ;; + esac + MK_TITLE="" + fi +done + +# Check changes +if [ ! -z $MK_PKGNAME ]; then + md5sum -c md5sum + if [ $? -ne 0 ]; then + MKSLACKBUILD=$BASEDIR/$MK_PKGNAME.mkslackbuild + save_mkslackbuild + mount_slackbuild + fi +fi + +mk_exit 0 +# _________________________________END_______________________________ diff --git a/branches/0.6/src/mkjail b/branches/0.6/src/mkjail new file mode 100755 index 0000000..f6c935c --- /dev/null +++ b/branches/0.6/src/mkjail @@ -0,0 +1,113 @@ +#!/bin/bash +# +# mkjail v0.4: chroot jail maker +# +# feedback: rhatto at riseup.net | GPL +# +# Mkjail is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# Mkjail is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your `basename $0` installation" + exit 1 +fi + +function usage { + + echo "usage: [ARCH=arch] [VERSION=version] [ROOT=/otherroot] $BASENAME <jail-name> [template]" + exit 1 + +} + +function exec_post_install_scripts { + + # exec post installation scripts + # usage: exec_post_install_script <jail-root> <jail-name> + + local list + + if [ -z "$2" ]; then + return 1 + fi + + echo "$BASENAME: executing template scripts..." + if [ -d "$TEMPLATE_BASE.s" ]; then + for file in $TEMPLATE_BASE.s/*; do + if [ -x "$file" ]; then + $file $1 $2 + fi + done + fi + +} + +function jailist_update { + + # update the jail list file + # usage: jailist_update <jail-path> + + if [ "$ADD_TO_JAIL_LIST" == "1" ]; then + touch $JAIL_LIST + if ! grep -q -e "^$1\$" $JAIL_LIST; then + echo $1 >> $JAIL_LIST + fi + fi + +} + +if [ -z "$1" ]; then + usage +else + server="$1" + eval_config $BASENAME -u +fi + +if [ ! -z "$2" ]; then + search_template $2 + result="$?" +else + search_default_template + result="$?" +fi + +if [ "$result" != "0" ]; then + exit 1 +fi + +TEMPLATE="$TEMPLATE_BASE.template" + +if [ ! -d "$JAIL_ROOT/$server" ]; then + mkdir -p $JAIL_ROOT/$server +else + if [ ! -z "`ls $JAIL_ROOT/$server | grep -v 'lost+found'`" ]; then + echo $BASENAME: error: folder $JAIL_ROOT/$server already exists and seens to be not empty + echo $BASENAME: probably the jail $1 already exists + exit 1 + fi +fi + +echo "$BASENAME: instaling packages into $JAIL_ROOT/$server using $TEMPLATE..." + +install_packages +copy_template_files $JAIL_ROOT/$server +set_jail_perms $JAIL_ROOT/$server +jailist_update $JAIL_ROOT/$server +exec_post_install_scripts $JAIL_ROOT $server + +echo $BASENAME: done creating $server jail + diff --git a/branches/0.6/src/rebuildpkg b/branches/0.6/src/rebuildpkg new file mode 100755 index 0000000..6d3d10c --- /dev/null +++ b/branches/0.6/src/rebuildpkg @@ -0,0 +1,87 @@ +#!/bin/bash +# +# rebuildpkg: build a package from a /var/log/packages entry +# +# feedback: rhatto at riseup.net | gpl +# +# Rebuildpkg is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# Rebuildpkg is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +TMP="/tmp" + +function usage { + echo "usage: ROOT=/otherroot `basename $0` <package-name>" +} + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your `basename $0` installation" + exit 1 +fi + +if [ -z "$1" ]; then + usage + exit 1 +fi + +pack="$1" + +for file in `ls $ROOT/var/log/packages/$pack*`; do + if [[ "`package_name $file.tgz`" == "$pack" ]]; then + package_file="$file" + break + fi +done + +if [ -z "$package_file" ]; then + echo error: package $pack does not exist + exit 1 +fi + +if [ -d "$TMP/package-$pack" ]; then + rm -rf $TMP/package-$pack +fi + +mkdir $TMP/package-$pack +cd $TMP/package-$pack + +for file in `grep -v -e "^PACKAGE NAME:" -e "^UNCOMPRESSED PACKAGE SIZE:" \ + -e "^COMPRESSED PACKAGE SIZE:" -e "^PACKAGE LOCATION:" \ + -e "^PACKAGE DESCRIPTION:" -e "^$pack:" -e "^FILE LIST:" $package_file`; do + + if [ "$file" != "install" ] && [ "$file" != "install/slack-desc" ] && [ "$file" != "install/doinst,sh" ]; then + if [ -d /$file ]; then + mkdir -p $TMP/package-$pack/$file + elif [ -f /$file ]; then + cp /$file $TMP/package-$pack/$file + else + echo file /$file was not found, please add it manually, exploding and making the package again + fi + fi + +done + +mkdir $TMP/package-$pack/install +grep "^$pack:" $package_file > $TMP/package-$pack/install/slack-desc + +package_name="`grep "PACKAGE NAME:" $package_file | awk '{ print $3 }'`" + +if [ -f "$ROOT/var/log/scripts/$package_name" ]; then + cp $ROOT/var/log/scripts/$package_name $TMP/package-$pack/install/doinst.sh +fi + +makepkg $package_name.tgz +mv $package_name.tgz $TMP/ +echo "done: package rebuilt and stored at $TMP/$package_name.tgz" diff --git a/branches/0.6/src/repos b/branches/0.6/src/repos new file mode 100755 index 0000000..e4a17ee --- /dev/null +++ b/branches/0.6/src/repos @@ -0,0 +1,87 @@ +#!/bin/bash +# +# repos script got from +# http://software.jaos.org/BUILD/slapt-get/FAQ.html#slgFAQ17 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# any later version. +# +# Changes by rhatto at riseup.net to fit http://slack.sarava.org needs +# + +BASENAME="`basename $0`" +REPOS_CONF="/etc/simplepkg/repos.conf" +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo "`basename $0` [pkg [file]|all|new|svnmeta|PACKAGESTXT|FILELIST|MD5]" + +} + +function do_all { + + for pkg in `find . -type f -name '*.tgz' -print`; do + gen_meta $pkg + done + $0 PACKAGESTXT + $0 FILELIST + $0 MD5 + +} + +# --------------------------------- +# main +# --------------------------------- + +case "$1" in + pkg) + if [ -n "$2" ]; then + gen_meta $2 + else + usage + fi + ;; + all) + do_all + ;; + new) + for pkg in `find . -type f -name '*.tgz' -print`; do + if [ ! -f ${pkg%tgz}meta ]; then + gen_meta $pkg + fi + done + ;; + svnmeta) + svn_add_meta + ;; + PACKAGESTXT) + gen_packages_txt . + gen_packages_txt patches + ;; + FILELIST) + gen_filelist + gen_patches_filelist patches + ;; + MD5) + gen_md5_checksums . + gen_md5_checksums patches + ;; + usage) + usage + ;; + *) + do_all + svn_add_meta + ;; +esac + diff --git a/branches/0.6/src/simplaret b/branches/0.6/src/simplaret new file mode 100755 index 0000000..00b0c25 --- /dev/null +++ b/branches/0.6/src/simplaret @@ -0,0 +1,1045 @@ +#!/bin/bash +# +# simplaret v0.2: simplepkg's retrieval tool +# feedback: rhatto at riseup.net | gpl +# +# Simplaret is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# Simplaret is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +BASENAME="`basename $0`" +REPOS_CONF="/etc/simplepkg/repos.conf" +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function simplaret_usage { + + echo "usage: [ARCH=otherarch] [VERSION=otherversion] $BASENAME <OPTION> package-name" + echo -e "\t OPTIONS: --install, --update, --upgrade, --search, --get, --get-patches, --purge, --remove" + exit 1 + +} + +function simplaret_get_index { + + for file in `simplaret_metafiles`; do + simplaret_download $1 $file $2 --no-verbose + done + +} + +function simplaret_backup_index { + + for file in `simplaret_metafiles`; do + if [ -f "$1/$file" ]; then + mv $1/$file $1/$file.old + fi + done + +} + +function simplaret_check_index { + + for file in `simplaret_metafiles`; do + if [ ! -f "$1/$file" ] && [ -f "$1/$file" ]; then + echo restoring old $file to $1... + mv $1/$file.old $1/$file + else + rm -f $1/$file.old + fi + done + +} + +function simplaret_download { + + # download a file from a repo to a folder + # usage: simplaret <repository_url> <package> <destination-folder> [--no-verbose] + + local protocol file + local wget_timeout wget_passive_ftp wget_verbose + local curl_timeout curl_passive_ftp curl_verbose + local ncftpget_timeout ncftpget_passive_ftp + + protocol="`echo $1 | cut -d : -f 1`" + file="`basename $2`" + + if [ ! -d "$3" ]; then + mkdir -p $3 + fi + + if [ ! -z "$CONNECT_TIMEOUT" ] || [ "$CONNECT_TIMEOUT" != "0" ]; then + wget_timeout="--timeout $CONNECT_TIMEOUT" + ncftpget_timeout="-t $CONNECT_TIMEOUT" + curl_timeout="--connect-timeout $CONNECT_TIMEOUT" + fi + + if [ "$4" == "--no-verbose" ]; then + wget_verbose="--no-verbose" + curl_verbose="-#" + echo "" + fi + + if [ "$protocol" == "http" ]; then + + echo Getting $1/$file: + if [ "$HTTP_TOOL" == "wget" ]; then + wget $wget_timeout $wget_verbose $1/$2 -O $3/$file + elif [ "$HTTP_TOOL" == "curl" ]; then + curl $curl_timeout $curl_verbose $1/$2 > $3/$file + else + echo $BASENAME: error: invalid value for config variable HTTP_TOOL: $HTTP_TOOL + echo $BASENAME: please check your config file $CONF + exit 1 + fi + + elif [ "$protocol" == "ftp" ]; then + echo Getting $1/$file: + + if [ "$PASSIVE_FTP" == "1" ]; then + wget_passive_ftp="--passive-ftp" + ncftpget_passive_ftp="-F" + curl_passive_ftp="--ftp-pasv" + fi + + if [ "$FTP_TOOL" == "ncftpget" ]; then + ncftpget -c $ncftpget_timeout $ncftpget_passive_ftp $1/$2 > $3/$file + elif [ "$FTP_TOOL" == "wget" ]; then + wget $wget_timeout $wget_passive_ftp $wget_verbose $1/$2 -O $3/$file + elif [ "$FTP_TOOL" == "curl" ]; then + curl $curl_timeout $curl_passive_ftp $curl_verbose $1/$2 > $3/$file + else + echo $BASENAME: error: invalid value for config variable FTP_TOOL: $FTP_TOOL + echo $BASENAME: please check your config file $CONF + exit 1 + fi + + elif [ "$protocol" == "file" ]; then + + url="`echo $1 | sed -e 's/file:\/\///'`" + if [ -f "$3/$file" ]; then + rm -f $3/$file + fi + echo -n "Copying $url/$2..." + if [ -f "$url/$2" ]; then + cp $url/$2 $3/$file 2> /dev/null + fi + if [ -f "$3/$file" ]; then + echo " done." + else + echo " failed." + fi + + else + + echo $BASENAME error: invalid protocol $protocol + + fi + +} + +function simplaret_repository { + + # return a repository definition from $REPOS_CONF file + # usage: simplaret_repository [root|repos|noarch|patches] + + local definition + + if [ -z "$1" ]; then + definition="ROOT" + else + definition="`echo $1 | tr '[:lower:]' '[:upper:]'`" + fi + + if [ "$definition" == "REPOS" ] || [ "$definition" == "PATCHES" ]; then + definition="$definition-$ARCH-$VERSION" + elif [ "$definition" == "ROOT" ]; then + definition="$definition-$ARCH" + fi + + grep -e "^$definition=" $REPOS_CONF | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | cut -d "#" -f 1 + +} + +function simplaret_repository_name { + + # return a repository name according the value of $repository + + if [ -z "$repository" ]; then + false + elif echo $repository | grep -qe %; then + repository_name="`echo $repository | cut -d % -f 1`" + if [ -z "$repository_name" ]; then + echo $BASENAME: you should set a name for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + else + echo $BASENAME: you should set a name for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + +} + +function simplaret_repository_url { + + # return a repository url according the value of $repository + + if echo $repository | grep -qe %; then + repository_url="`echo $repository | cut -d % -f 2`" + if [ -z "$repository_url" ]; then + echo $BASENAME: you should set a url for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + else + echo $BASENAME: you should set a url for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + + if [ "$repos_type" == "root" ]; then + simplaret_distro_folder + repository_url="$repository_url/$DISTRO_FOLDER/$EXTRA_FOLDER" + fi + +} + +function simplaret_set_storage_folder { + + storage="$STORAGE/$ARCH/$VERSION/$repos_type" + if [ "$repos_type" == "noarch" ]; then + storage="$STORAGE/noarch" + elif [ "$repos_type" == "patches" ]; then + storage="$PATCHES_DIR/$ARCH/$VERSION" + fi + +} + +function simplaret_update { + + local storage + + echo Updating package information for arch $ARCH and version $VERSION... + + for repos_type in patches root repos noarch; do + + simplaret_set_storage_folder + + for repository in `simplaret_repository $repos_type`; do + + simplaret_repository_name + simplaret_repository_url + + if [ ! -d "$storage/$repository_name" ]; then + mkdir -p $storage/$repository_name + else + simplaret_backup_index $storage/$repository_name + fi + + simplaret_get_index $repository_url $storage/$repository_name + simplaret_check_index $storage/$repository_name + + unset repository_name repository_url repository_protocol + + done + done + +} + +function simplaret_find_package { + + # grep packages in a repository's file list + # usage: simplaret_find_package <package-name|-all> <repository-folder> + + if [ "$1" == "-all" ]; then + grep -e ".tgz$" $2/`simplaret_filelist` | awk '{ print $8 }' + else + grep $1 $2/`simplaret_filelist` | awk '{ print $8 }' | grep -e ".tgz$" + fi + +} + +function simplaret_show_package { + + # print a package result + # usage: simplaret_show_package <package-file-name> [--basename-only|--filename-only|--formatted] + + if [ "$2" == "--basename-only" ]; then + echo `basename $1` + elif [ "$2" == "--filename-only" ]; then + echo $1 + elif [ "$2" == "--formatted" ]; then + echo $1,$repos_type,$repository + else + if echo $1 | grep -q "/patches/"; then + patch="(patch)" + fi + if [ "$repos_type" == "noarch" ]; then + echo $name repository $repository_name: `basename $1` $patch + else + echo $name repository $repository_name, arch: $ARCH, version: $VERSION: `basename $1` $patch + fi + fi + unset patch + +} + +function simplaret_filelist { + + if [ "$repos_type" == "patches" ]; then + echo FILE_LIST + else + echo FILELIST.TXT + fi + +} + +function simplaret_metafiles { + + echo `simplaret_filelist` CHECKSUMS.md5 + +} + +function simplaret_search { + + # search packages + # usage: simplaret_search [package-name] [-display_mode] + # display_mode can be any accepted by simplaret_show_package + + local priority priority_match message pattern mode + + if [ ! -z "$1" ] && ! echo $1 | grep -q -e "^-"; then + pattern="$1" + mode="$2" + else + pattern="-all" + mode="$1" + fi + + for repos_type in patches root repos noarch; do + + name="`echo $repos_type | tr '[:lower:]' '[:upper:]'`" + simplaret_set_storage_folder + + for repository in `simplaret_repository $repos_type`; do + + simplaret_repository_name + + if [ ! -f "$storage/$repository_name/`simplaret_filelist`" ]; then + if [ "$WARNING" != "0" ] || [ ! -z "$SILENT" ]; then + if [ "$repos_type" == "noarch" ]; then + message="" + else + message="on arch $ARCH version $VERSION" + fi + echo warning: no file list for $repository_name repository $repository_name $message + echo please do a simplaret --update + fi + else + + if [ "$repos_type" == "root" ]; then + # root repositories has ROOT_PRIORITY + for priority in $ROOT_PRIORITY; do + for file in `simplaret_find_package $pattern $storage/$repository_name | grep "/$priority/"`; do + simplaret_show_package $file $mode + done + priority_match="$priority_match|/$priority/" + done + # now we should return all matches that are not part of ROOT_PRIORITY + priority_match="`echo $priority_match | sed -e 's/^|//'`" + for file in `simplaret_find_package $pattern $storage/$repository_name | egrep -v $priority_match`; do + simplaret_show_package $file $mode + done + priority_match="" + elif [ "$repos_type" == "repos" ]; then + # repos repositories has REPOS_PRIORITY + for priority in $REPOS_PRIORITY; do + for file in `simplaret_find_package $pattern $storage/$repository_name | grep "/$priority/"`; do + simplaret_show_package $file $mode + done + priority_match="$priority_match|/$priority/" + done + # now we should return all matches that are not part of REPOS_PRIORITY + priority_match="`echo $priority_match | sed -e 's/^|//'`" + for file in `simplaret_find_package $pattern $storage/$repository_name | egrep -v $priority_match`; do + simplaret_show_package $file $mode + done + priority_match="" + else + for file in `simplaret_find_package $pattern $storage/$repository_name`; do + simplaret_show_package $file $mode + done + fi + + fi + + done + done + +} + +function simplaret_purge { + + # purge simplaret package cache + # usage: simplaret_purge [-w N] + + local mtime mtime_message which and_patches + + if [ "$2" == "-w" ] && [ ! -z "$3" ]; then + mtime="-mtime +`echo "$3*7" | bc -l`" + mtime_message="older than $3 weeks" + elif [ "$SIMPLARET_PURGE_WEEKS" != "0" ]; then + mtime="-mtime +`echo "$SIMPLARET_PURGE_WEEKS*7" | bc -l`" + mtime_message="older than $SIMPLARET_PURGE_WEEKS weeks" + else + mtime="" + mtime_mesage="" + fi + + which="root repos noarch" + and_patches="" + + if [ "$SIMPLARET_PURGE_PATCHES" == "1" ]; then + which="patches $which" + and_patches="including patches" + fi + + if [ -z "$SILENT" ]; then + echo "$BASENAME: purging all packages $mtime_message for:" + echo -e "\t- Arch $ARCH and version $VERSION $and_patches" + echo -e "\t- Noarch folder" + fi + + for repos_type in $which; do + + simplaret_set_storage_folder + + for file in `find $storage/ $mtime 2> /dev/null`; do + for extension in tgz asc meta txt slack-required; do + if echo $file | grep -qe ".$extension$"; then + rm $file + fi + done + done + + done + + if [ -z "$SILENT" ]; then + echo $BASENAME: done purging simplaret cache + echo $BASENAME: please run $BASENAME --update to retrieve new package listings on this arch and version + fi + +} + +function simplaret_search_and_delete { + + local file candidate place basename + + for file in `find $2/ -name $1*tgz 2> /dev/null`; do + candidate="`basename $file`" + if [ "`package_name $candidate`" == "$1" ]; then + # check if has the same version and build number, otherwise erase the old one + for result in `simplaret_search $(package_name $candidate) --basename-only`; do + if [ "`package_name $candidate`" == "`package_name $result`" ]; then + if [ "`package_version $candidate`" == "`package_version $result`" ] && \ + [ "`package_build $candidate`" == "`package_build $result`" ]; then + LAST_DOWNLOADED_PACKAGE="$file" + if [ "$3" != "--silent" ]; then + echo Package $candidate already downloaded + # echo Package $candidate stored at `dirname $file` + else + true + # echo $file + fi + return 1 + else + place="`dirname $file`" + basename="`basename $file tgz`" + rm -f $file + rm -f $place/$candidate.slack-required + rm -f $file.asc $place/$basename.meta $place/$basename.txt + break + fi + fi + done + fi + done + +} + +function simplaret_get { + + # get a package + # usage: simplaret_get <package-name> [--silent] + + local silent generate_patches search search_results + + # prevent user to stay in $storage + cd + + # first search for an already downloaded package + for repos_type in patches root repos noarch; do + + simplaret_set_storage_folder + simplaret_search_and_delete $1 $storage $2 + + if [ "$?" == "1" ]; then + return 0 + fi + + done + + # then search for the package in the repositories + search="`simplaret_search $1 --formatted`" + search_results="`echo "$search" | wc -l`" + + for result in $search; do + + # remaining search results + let search_results-- + + file="`echo $result | cut -d , -f 1`" + repos_type="`echo $result | cut -d , -f 2`" + repository="`echo $result | cut -d , -f 3`" + + simplaret_set_storage_folder + simplaret_repository_name + + candidate="`basename $file`" + if [ "`package_name $candidate`" == "$1" ]; then + simplaret_repository_url + + # if repos_type == root, the package is a patch and + # STORE_ROOT_PATCHES_ON_PATCHES_DIR config parameter is enabled, then + # save it on $PATCHES_DIR/root-$repository_name, so all patches + # are placed in the same tree + if [ "$repos_type" == "root" ] && \ + [ "$STORE_ROOT_PATCHES_ON_PATCHES_DIR" == "1" ] && echo $file | grep -q "patches"; then + folder="$PATCHES_DIR/$ARCH/$VERSION/root-$repository_name" + generate_patches="1" + else + folder="$storage/$repository_name" + fi + + # download the package + simplaret_download $repository_url $file $folder + + if [ -f "$folder/$candidate.asc" ]; then + rm $folder/$candidate.asc + fi + + if [ -f "$folder/$1.slack-required" ]; then + rm $folder/$1.slack-required + fi + + # download the signature, if exist + if simplaret_check_url $repository_url/$file.asc; then + simplaret_download $repository_url $file.asc $folder + fi + + # download slack-required, if exist + if simplaret_check_url $repository_url/`dirname $file`/$1.slack-required; then + simplaret_download $repository_url `dirname $file`/$1.slack-required $folder + fi + + if [ ! -f "$folder/$candidate" ]; then + LAST_DOWNLOADED_PACKAGE="0" + if [ "$2" != "--silent" ]; then + echo Error downloading $candidate from $repos_type repository $repository_url, please check your settings + fi + # check if there's also more repositories to try + if [ "$SIMPLARET_DOWNLOAD_FROM_NEXT_REPO" != "1" ]; then + return 1 + else + if [ "$2" != "--silent" ]; then + echo Trying to fetch $candidate from the next repository... + fi + if (($search_results <= 0)); then + return 1 + fi + fi + else + LAST_DOWNLOADED_PACKAGE="$folder/$candidate" + if [ "$2" != "--silent" ]; then + silent="" + echo Package $candidate stored at $folder + else + # echo $folder/$candidate + silent="--silent" + fi + if [ -f "$folder/$candidate.asc" ] || [ "$SIGNATURE_CHECKING" == "1" ]; then + gpg --verify $folder/$candidate.asc $folder/$candidate + fi + # generate the patches FILE_LIST and PACKAGES.TXT if needed + if [ "$generate_patches" == "1" ]; then + gen_patches_filelst $folder + gen_packages_txt $folder + gen_md5_checksums $folder + fi + simplaret_checksum $storage/$repository_name/CHECKSUMS.md5 $folder/$candidate $silent + return $? + fi + + fi + + done + +} + +function simplaret_search_and_process_patch { + + local package_version package_build installed_version + local installed_build repos_type get is_patch package_match + + # get the repository type + repos_type="`echo $sugested | cut -d , -f 2`" + + # get just the file name + sugested="`echo $sugested | cut -d , -f 1`" + + if echo $sugested | grep -q "patches"; then + is_patch="yes" + else + is_patch="no" + fi + + # now split the file name into pieces + package_version="`package_version $sugested`" + package_build="`package_build $sugested`" + sugested="`package_name $sugested`" + + # check if the patch was already downloaded + if echo "$DOWNLOADED_PATCHES" | grep -q " $ARCH:$VERSION:$sugested "; then + if [ "$IS_UPGRADE" != "1" ]; then + echo Package $sugested already downloaded + # echo "Jail $root needs package $sugested (already downloaded, skipping)" + return + fi + fi + + # search if its installed in the jail + installed_packs="`ls /$root/var/log/packages/$sugested* 2> /dev/null`" + if [ ! -z "$installed_packs" ]; then + + for installed in $installed_packs; do + if [[ "$sugested" == "`package_name $installed.tgz`" ]]; then + package_installed="1" + installed_version="`package_version $installed.tgz`" + installed_build="`package_build $installed.tgz`" + break + fi + done + + get="no" + + # if the package is installed, download the patch + if [ "$package_installed" == "1" ]; then + if [ "$repos_type" == "patches" ]; then + + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + elif [ "$DOWNLOAD_EVEN_APPLIED_PATCHES" == "1" ]; then + get="yes" + fi + + elif [ "$repos_type" == "root" ] && [ "$is_patch" == "yes" ]; then + + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + elif [ "$DOWNLOAD_EVEN_APPLIED_PATCHES" == "1" ]; then + get="yes" + fi + + else + # here, we're dealing with repositories other than ROOT and REPOS, + # so we need to check if either version or build number are different, + # otherwise all installed packages would be downloaded + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + fi + fi + fi + + # finally, get the package + if [ "$get" == "yes" ]; then + if [ "$IS_UPGRADE" == "1" ]; then + if [ "$package_match" == "no" ]; then + simplaret_install $sugested + else + simplaret_get $sugested + fi + else + simplaret_get $sugested + fi + if [ "$?" == "0" ]; then + DOWNLOADED_PATCHES="$DOWNLOADED_PATCHES $ARCH:$VERSION:$sugested " # the ending space is important + fi + fi + + fi + + unset package_installed get + +} + +function simplaret_get_jail_patches { + + # get patches from a jail + # usage: simplaret_get_jail_patches <jail-folder> + + local oldarch oldversion + + if [ ! -z "$1" ]; then + root="$1" + else + root="/" + fi + + # save current arch and version + oldarch="$ARCH" + oldversion="$VERSION" + + ARCH="`default_arch $root`" + VERSION="`default_version $root`" + + # in case there's something wrong with the jail, abort + if [ -z "$VERSION" ] || [ -z "$ARCH" ]; then + return + fi + + # we need to do that for each arch/version pairs, but just once for each pair + if ! echo "$DISTRO_UPDATED" | grep -q " $ARCH:$VERSION "; then + simplaret_update + DISTRO_UPDATED="$DISTRO_UPDATED $ARCH:$VERSION " # the ending space is important + echo "" + fi + + echo Fetching patches for arch $ARCH and version $VERSION for jail $root + + # list all available patches from PATCHES and ROOT repositories + for sugested in `simplaret_search --formatted | grep patches | grep -v ",repos," | grep -v ",noarch,"`; do + simplaret_search_and_process_patch + done + + # grab patches from every other places + if [ "$CONSIDER_ALL_PACKAGES_AS_PATCHES" == "1" ]; then + + for sugested in `simplaret_search --formatted | grep patches | grep ",repos," | grep ",noarch,"`; do + simplaret_search_and_process_patch + done + + for sugested in `simplaret_search --formatted | grep -v patches`; do + simplaret_search_and_process_patch + done + + fi + + # restore arch and version + ARCH="$oldarch" + VERSION="$oldversion" + +} + +function simplaret_get_patches { + + local jailpath + + if [ "$1" == "--upgrade" ]; then + IS_UPGRADE="1" + fi + + if [ ! -z "$ROOT" ]; then + simplaret_get_jail_patches $ROOT + return $? + fi + + # first get patches from the root system + simplaret_get_jail_patches + + # then get the needed patches for each installed jail + if [ -s "$JAIL_LIST" ]; then + for jailpath in `cat $JAIL_LIST`; do + if [ -d "$jailpath/var/log/packages" ]; then + ROOT="$jailpath" + simplaret_get_jail_patches $jailpath + fi + done + fi + + ROOT="" + +} + +function simplaret_checksum { + + # simplaret_checksum <md5file> <file-name> [--silent] + + if [ ! -f "$1" ] || [ ! -f "$2" ]; then + if [ "$3" != "--silent" ]; then + echo Checksum error: file not found + fi + return 1 + fi + + pack="`basename $2`" + checksum="`grep -e "$pack\$" $1 | awk '{ print $1 }'`" + + if [ -z "$checksum" ]; then + echo file $2 not in checksum $1 + return 1 + elif [ "$checksum" != "`md5sum $2 | awk '{ print $1 }'`" ]; then + if [ "$3" != "--silent" ]; then + echo Checksum mismatch for file `basename $file` + fi + return 1 + else + if [ "$3" != "--silent" ]; then + echo Checksum ok for file `basename $file` + fi + return 0 + fi + +} + +function simplaret_install { + + # download and install a package + # usage: simplaret_install <package-name> [--skip-checks] + + local package root jail_arch jail_version slack_required dep dependency tmp + + root="/$ROOT" + mkdir -p $root/var/log/setup/tmp + + if [ "`echo $1 | sed -e 's/\(..\).*/\1/g'`" == "--" ]; then + echo $BASENAME: install: syntax error: expected package name + return 1 + fi + + # now we check if ARCH and VERSION from the + # repository are the same of the jail + if [ "$2" != "--skip-checks" ]; then + jail_arch="`default_arch $root`" + jail_version="`default_version $root`" + if [ "$ARCH" != "$jail_arch" ]; then + echo "$BASENAME: requested repository arch ($ARCH) doesn't match jail arch ($jail_arch)" + echo "$BASENAME: please use \"$BASENAME --get $1 --skip-checks\" to ignore this warning and install anyway" + return + elif [ "$VERSION" != "$jail_version" ]; then + echo "$BASENAME: requested repository version ($VERSION) doesn't match jail version ($jail_version)" + echo "$BASENAME: please use \"$BASENAME --get $1 --skip-checks\" to ignore this warning and install anyway" + return 1 + fi + fi + + # package="`simplaret_get $1 --silent`" + simplaret_get $1 --silent + package="$LAST_DOWNLOADED_PACKAGE" + + if [ "$package" != "0" ] && [ ! -z "$package" ]; then + slack_required="`dirname $package`/$1.slack-required" + if [ -f "$package" ]; then + + if [ -f "$slack_required" ] && [ "$DEPENDENCY_CHECKING" == "1" ]; then + # this routine checks for dependencies in package's slack-required + # procedure adapted from createpkg script + ( cat $slack_required | while read dep; do + if [ ! -z "$dep" ]; then + dependency="`echo $dep | awk '{ print $1 }'`" + simplaret_solve_dep $1 $dependency $root + fi + true + done ) + fi + + ROOT=$root upgradepkg --install-new $package + LAST_DOWNLOADED_PACKAGE="0" + + else + echo "Error: could not install package $1: file not found" + LAST_DOWNLOADED_PACKAGE="0" + return 1 + fi + else + echo "Error: could not install package $1" + LAST_DOWNLOADED_PACKAGE="0" + return 1 + fi + +} + +function simplaret_distro_folder { + + # first we point to the correct arch + simplaret_set_arch + + # then we set the distro folder + if [ "$ARCH" == "i386" ]; then + DISTRO="slackware" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "x86_64" ]; then + # EXTRA_FOLDER="tree" + DISTRO="slamd64" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "s390" ]; then + DISTRO="slack390" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "x86_uclibc" ]; then + DISTRO="ucslack" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "arm" ]; then + DISTRO="armedslack" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "powerpc" ]; then + DISTRO="slackintosh" + DISTRO_FOLDER="$VERSION" + elif [ "$ARCH" == "sparc" ]; then + DISTRO="splack" + DISTRO_FOLDER="tree-$VERSION" + else + DISTRO="$ARCH" + DISTRO_FOLDER="$DISTRO-$VERSION" + fi + +} + +function simplaret_set_arch { + + # set correct value for ARCH + + local repos_type new_arch + + # any arch defined in ARCH_i386 that hasn't an entry + # on $REPOS_CONF will be mapped to i386 + + ARCH_i386=" nocona prescott pentium4m pentium4 pentium-m pentium3m pentium3 " + ARCH_i386="$ARCH_i386 pentium2 i686 pentium-pro i586 pentium-mmx pentium i486 " + ARCH_i386="$ARCH_i386 athlon-mp athlon-xp athlon4 athlon-tbird athlon k6 k6-2 " + ARCH_i386="$ARCH_i386 k6-3 winchip-c6 winchip2 c3 c3-2 i386 " + + # any arch defined in ARCH_x86_64 that hasn't an entry + # on $REPOS_CONF will be mapped to x86_64 + + ARCH_x86_64=" k8 opteron athlon64 athlon-fx x86_64 " + + for repos_type in patches root repos noarch; do + if [ -z "`simplaret_repository $repos_type`" ]; then + # there's no repository definition for that arch + if echo "$ARCH_i386" | grep -q " $ARCH "; then + new_arch="i386" + elif echo "$ARCH_x86_64" | grep -q " $ARCH "; then + new_arch="x86_64" + else + echo "$BASENAME: error: no repository definition for arch $ARCH" + echo "$BASENAME: please check your $CONF and $REPOS_CONF config files" + exit 1 + fi + else + return + fi + done + + echo "$BASENAME: changing arch from $ARCH to $new_arch" + + ARCH="$new_arch" + +} + +function simplaret_check_url { + + # check if a given url exist, use just with small files + # usage: simplaret_check_url <url> + + if [ -z "$1" ]; then + return 1 + fi + + if [ ! -z "$CONNECT_TIMEOUT" ] || [ "$CONNECT_TIMEOUT" != "0" ]; then + curl_timeout="--connect-timeout $CONNECT_TIMEOUT" + fi + + if [ "`curl $curl_timeout -I $1 2> /dev/null | head -n 1 | awk '{ print $2 }'`" == "200" ]; then + # server gave a 200 response, so the url exist + return 0 + else + # the url is missing + return 1 + fi + +} + +function simplaret_solve_dep { + + # solve dependency for a package + # this function was adapted from createpkg script + # usage: simplaret_solve_dep <package-name> <package-depencency-name> [root-folder] + + local installed check exit_code + + local package="$1" + local pack="$2" + local root="/$3" + + pack="`echo $pack| sed -e 's/\+/\\\+/'`" + installed=`eval "ls $root/var/log/packages/ | egrep -E '^$pack-[^-]+-[^-]+-[^-]+$'"` + check=$? + + if [ -z "$installed" ]; then + if [ $check -ne 0 ]; then + echo "$BASENAME: processing $1 dependency $pack" + # simplaret_install $pack + SIMPLARET_CHILD=$SIMPLARET_CHILD ROOT=$root ARCH=$ARCH VERSION=$VERSION \ + simplaret --install $pack + fi + fi + +} + +if [ -z "$1" ]; then + simplaret_usage + exit 1 +else + eval_config $BASENAME +fi + +# This is used to show how many children process we have +if [ -z "$SIMPLARET_CHILD" ]; then + SIMPLARET_CHILD="1" +else + let SIMPLARET_CHILD++ +fi + +BASENAME="`basename $0`[$SIMPLARET_CHILD]" + +case $1 in + "--update" | "update") simplaret_update ;; + "--search" | "search") shift ; simplaret_search $* ;; + "--get" | "get") shift ; simplaret_get $* ;; + "--get-patches" | "get-patches") simplaret_get_patches ;; + "--purge" | "purge") shift ; simplaret_purge $* ;; + "--install" | "install") shift ; simplaret_install $* ;; + "--upgrade" | "upgrade") simplaret_get_patches --upgrade ;; + "--remove" | "remove") ROOT=/$ROOT removepkg $2 ;; + *) simplaret_usage ;; +esac + diff --git a/branches/0.6/src/templatepkg b/branches/0.6/src/templatepkg new file mode 100755 index 0000000..048ac22 --- /dev/null +++ b/branches/0.6/src/templatepkg @@ -0,0 +1,959 @@ +#!/bin/bash +# +# templatepkg v0.3: template maintenance script from simplepkg suite +# +# feedback: rhatto at riseup.net | gpl +# +# Templatepkg is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# Templatepkg is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage_summary { + + echo "options are:" + echo "" + echo " -c | --create: create a template from a jail or existing template" + echo " -u | --update: update a template from a jail" + echo " -a | --add: add files into a template" + echo " -d | --delete: delete files or folders from a template" + echo " -s | --sync: sync $TEMPLATE_FOLDER working copy" + echo " -e | --export: export $TEMPLATE_FOLDER to a svn repository" + echo " -i | --import: grab $TEMPLATE_FOLDER from a svn repository" + echo " -r | --remove: remove a template" + echo " -l | --list: list templates" + echo " -b | --batch-edit: add or edit post-installation scripts" + echo " -p | --pack: create a package from a template" + echo " -t | --template-edit: edit template package list" + echo " -h | --help: display this summary" + echo "" + +} + +function display_help { + + # display help + # usage: help [help-topic] + + local option + + if [ -z "$1" ]; then + echo "type $BASENAME --help <option> for aditional help" + usage_summary + exit + fi + + option="$1" + + if ! echo $option | grep -q -e "^-"; then + option="-`echo $option | sed -e 's/--/-/' -e 's/\(.\).*/\1/'`" + else + option="`echo $option | sed -e 's/--/-/' -e 's/\(..\).*/\1/'`" + fi + + usage_summary | grep -e "^ $option" + + echo "" + case $option in + + "-c" | "--create") + echo " $BASENAME $option <template> [jail-root|template-name]" + ;; + "-u" | "--update") + echo " $BASENAME $option <template> [jail-root]" + ;; + "-a" | "--add") + echo " $BASENAME $option <template> <file-name> [jail-root]" + echo "" + echo " file-name: the file or directory to be added" + echo " jail-root: the jail under file-name is located" + ;; + "-d" | "--delete") + echo " $BASENAME $option <template> <file-name>" + ;; + "-s" | "--sync") + echo " $BASENAME $option" + ;; + "-e" | "--export") + echo " $BASENAME $option <svn-repository>" + ;; + "-i" | "--import") + echo " $BASENAME $option <svn-repository>" + ;; + "-r" | "--remove") + echo " $BASENAME $option <template-name>" + ;; + "-l" | "--list") + echo " $BASENAME $option [template-name]" + ;; + "-b" | "--batch-edit") + echo " $BASENAME $option <template-name> <script-name>" + ;; + "-p" | "--pack") + echo " $BASENAME $option <template-name> [version] [build] [arch]" + ;; + "-t" | "--template-edit") + echo " $BASENAME $option <template-name>" + ;; + "-h" | "--help") + echo " -h | --help: display this help." + ;; + *) + echo $BASENAME: invalid help option $option + esac + + case $option in + "-c" | "-u" | "-a") + echo "" + echo " if ommited, jail-root defaults to /" + ;; + esac + + echo "" + +} + +function usage { + + echo "usage: $BASENAME <option> [<template> [arguments]]" + usage_summary + exit + +} + +function check_svn_repo { + + # check a svn repository URL + # usage: set_svn_repo <repository> + + if [ ! -z "$1" ]; then + if echo $1 | grep -q -v -e "^svn://"; then + if echo $1 | grep -q -v -e "^svn+ssh://"; then + if echo $1 | grep -q -v -e "^file://"; then + echo $BASENAME: invalid repository URL $1 + return 1 + fi + fi + fi + else + echo $BASENAME: no repository defined + return 1 + fi + +} + +function import_export_templates { + + # import from or export to $TEMPLATE_FOLDER in a svn repository + # usage: template_export <import|export> <repository> + + local templates templates_folder basedir repository mode preposition + + if [ "$?" != 0 ]; then + usage + exit 1 + elif ! use_svn; then + echo $BASENAME: simplepkg not configured to use svn + exit 1 + fi + + templates_folder="$TEMPLATE_FOLDER" + templates="`basename $TEMPLATE_FOLDER`" + basedir="`dirname $templates_folder`" + mode="$1" + repository="$2" + preposition="from" + + check_svn_repo $repository + + if [ ! -z "$2" ]; then + + if [ ! -d "$templates_folder/.svn" ]; then + + cd $basedir + + if [ "$mode" == "export" ]; then + preposition="to" + echo Exporting templates to $repository... + svn import $templates/ $repository/ -m "initial import" + if [ "$?" != "0" ]; then + echo $BASENAME: export failed + exit 1 + fi + fi + + if [ -d "templates" ]; then + mv $templates $templates.old + fi + + echo Checking out templates from $repository... + svn checkout $repository $templates + + if [ "$?" == "0" ]; then + rm -rf $templates.old + else + rm -rf $templates + mv $templates.old $templates + echo $BASENAME: $mode failed + exit 1 + fi + + else + echo "$BASENAME: $templates_folder seens to be already $mode""ed $preposition $repository" + exit 1 + fi + + fi + +} + +function template_create { + + # create a new template + + local template_base info_commit orig_template list + + if [ ! -d "`dirname $TEMPLATE_BASE`" ]; then + + echo Creating template `basename $TEMPLATE_BASE`... + + if use_svn && [ -d "`dirname $TEMPLATE_BASE`/.svn" ]; then + cd `dirname $TEMPLATE_BASE` + svn mkdir `dirname $TEMPLATE_BASE` + else + mkdir -p `dirname $TEMPLATE_BASE` + fi + + else + echo $BASENAME: template `basename $TEMPLATE_BASE` already exists + exit 1 + fi + + touch $TEMPLATE_BASE.perms + touch $TEMPLATE_BASE.template + + if use_svn && [ -d "`dirname $TEMPLATE_BASE`/.svn" ]; then + + cd `dirname $TEMPLATE_BASE` + + if ! svn_check $TEMPLATE_BASE.d; then + svn mkdir $TEMPLATE_BASE.d + info_commit="yes" + else + mkdir -p $TEMPLATE_BASE.d + fi + + if ! svn_check $TEMPLATE_BASE.s; then + svn mkdir $TEMPLATE_BASE.s + info_commit="yes" + else + mkdir -p $TEMPLATE_BASE.s + fi + + if ! svn_check $TEMPLATE_BASE.template; then + svn add $TEMPLATE_BASE.template + info_commit="yes" + fi + + if ! svn_check $TEMPLATE_BASE.perms; then + svn add $TEMPLATE_BASE.perms + info_commit="yes" + fi + + elif use_svn && [ -d "$TEMPLATE_FOLDER/.svn" ]; then + + mkdir $TEMPLATE_BASE.{d,s} + cd $TEMPLATE_FOLDER + svn add `basename $TEMPLATE_BASE` + info_commit="yes" + + else + mkdir $TEMPLATE_BASE.{d,s} + fi + + if [ -d "/$ROOT" ]; then + template_update + elif [ ! -z "$ROOT" ]; then + + # copy from an existing template + + if [ -d "$TEMPLATE_FOLDER/$ROOT" ]; then + orig_template="$TEMPLATE_FOLDER/$ROOT" + elif [ -d "$BASE_CONF/templates/$ROOT" ]; then + orig_template="$BASE_CONF/templates/$ROOT" + elif [ -d "$BASE_CONF/defaults/templates/$ROOT" ]; then + orig_template="$BASE_CONF/defaults/templates/$ROOT" + else + return 1 + fi + + if [ -f "$orig_template/$ROOT.perms" ]; then + cat $orig_template/$ROOT.perms > $TEMPLATE_BASE.perms + fi + + if [ -f "$orig_template/$ROOT.template" ]; then + cat $orig_template/$ROOT.template > $TEMPLATE_BASE.template + fi + + if use_svn && [ -d "$orig_template/.svn" ]; then + + cd `dirname $TEMPLATE_BASE` + + list="`ls $orig_template/$ROOT.d/ 2> /dev/null`" + if [ ! -z "$list" ]; then + echo Copying files to the new template... + rsync -av --exclude=.svn $orig_template/$ROOT.d/ $TEMPLATE_BASE.d/ + svn add `basename $TEMPLATE_BASE`.d/* + info_commit="yes" + fi + + list="`ls $orig_template/$ROOT.s/ 2> /dev/null`" + if [ ! -z "$list" ]; then + echo Copying scripts to the new template... + rsync -av --exclude=.svn $orig_template/$ROOT.s/ $TEMPLATE_BASE.s/ + svn add `basename $TEMPLATE_BASE`.s/* + info_commit="yes" + fi + + else + + list="`ls $orig_template/$ROOT.d/ 2> /dev/null`" + if [ ! -z "$list" ]; then + echo Copying files to the new template... + rsync -av $orig_template/$ROOT.d/ $TEMPLATE_BASE.d/ + fi + + list="`ls $orig_template/$ROOT.s/ 2> /dev/null`" + if [ ! -z "$list" ]; then + echo Copying scripts to the new template... + rsync -av $orig_template/$ROOT.s/ $TEMPLATE_BASE.s/ + fi + + fi + + else + echo $BASENAME: warning: no root directory defined + fi + + if [ "$info_commit" == "yes" ] && [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to add files under $file into the svn repository" + fi + +} + +function template_update { + + # update the template package list + + check_template_exist + + if [ ! -d "$ROOT/var/log/packages" ]; then + echo $ROOT/var/log/packages: directory not found + exit 1 + fi + + echo Checking package list for template `basename $TEMPLATE_BASE`... + + for package in `ls -1 $ROOT/var/log/packages/`; do + pack=`package_name $package` + if [ -f $TEMPLATE ]; then + if ! `grep -v -e "^#" $TEMPLATE | cut -d : -f 1 | awk '{ print $1 }' | grep -q -e "^$pack\$"`; then + echo $pack >> $TEMPLATE + echo Added $pack # on $TEMPLATE + fi + else + echo $pack >> $TEMPLATE + echo Added $pack # on $TEMPLATE + fi + done + + # check if each package from the template is installed + grep -v -e "^#" $TEMPLATE | cut -d : -f 1 | awk '{ print $1 }' | while read pack; do + + if [ ! -z "$pack" ]; then + unset found + for candidate in `ls $ROOT/var/log/packages/$pack* 2> /dev/null`; do + candidate="`package_name $candidate`" + if [ "$pack" == "$candidate" ]; then + found="1" + break + fi + done + if [ "$found" != "1" ]; then + # remove a non-installed package from the template + sed "/^$pack$/d" $TEMPLATE | sed "/^$pack $/d" | sed "/^$pack:*/d" | sed "/^$pack */d" > $TEMPLATE.tmp + cat $TEMPLATE.tmp > $TEMPLATE + rm -f $TEMPLATE.tmp + echo Removed $pack # from $TEMPLATE + fi + fi + + done + + if ! svn_check $TEMPLATE_BASE.template && [ -d "`dirname $TEMPLATE_BASE`/.svn" ]; then + cd `dirname $TEMPLATE_BASE` + svn add `basedir $TEMPLATE_BASE`.template + fi + +} + +function template_add { + + # add a file in a template + # usage: template_add <jail-root> <file> + + local info_commit cwd + + if [ -z "$1" ] || [ -z "$2" ]; then + return 1 + fi + + check_template_exist + + jail="/$1" + file="$2" + + if [ -a "$TEMPLATE_BASE.d/$file" ]; then + if [ -d "$TEMPLATE_BASE.d/$file" ]; then + + echo $BASENAME: folder `slash $file` already on $TEMPLATE_BASE.d, checking for contents + + cd $jail + for candidate in `find $file`; do + if [ ! -a "$TEMPLATE_BASE.d/$candidate" ]; then + mkdir -p $TEMPLATE_BASE.d/`dirname $candidate` + cp -a $jail/$candidate $TEMPLATE_BASE.d/$candidate + if use_svn && [ -d "$TEMPLATE_BASE.d/.svn" ]; then + cwd="`pwd`" + cd $TEMPLATE_BASE.d + svn add ./$candidate + if [ "$?" != "0" ]; then + echo $BASENAME: error adding `slash $candidate` into the revision system + fi + cd $cwd + info_commit="yes" + else + echo Added `slash $jail/$candidate` on `slash $TEMPLATE_BASE.d/$candidate` + fi + fi + done + + if [ "$info_commit" == "yes" ] && [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to add files under `slash $file` into the svn repository" + fi + + else + echo $BASENAME: file `slash $file` already on $TEMPLATE_BASE.d + exit 1 + fi + else + + if [ -a "$jail/$file" ]; then + + destination="`echo $TEMPLATE_BASE.d/$file | sed -e 's/\/$//'`" + + if use_svn && [ -d "$TEMPLATE_BASE.d/.svn" ]; then + + if [ ! -d "$TEMPLATE_BASE.d/`dirname $file`/.svn" ]; then + mkdir -p $TEMPLATE_BASE.d/`dirname $file`/ + svn add $TEMPLATE_BASE.d/`dirname $file`/ + fi + + cp -a $jail/$file $destination + + cwd="`pwd`" + cd $TEMPLATE_BASE.d + svn add ./$file + + if [ "$?" != "0" ]; then + echo $BASENAME: error adding `slash $candidate` into the revision system + else + if [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to add `slash $file` into the svn repository" + fi + fi + + cd $cwd + + else + + mkdir -p $TEMPLATE_BASE.d/`dirname $file`/ + cp -a $jail/$file $destination + echo Added `slash $jail/$file` on `slash $destination` + + fi + + else + echo $BASENAME: `slash $jail/$file`: file not found + exit 1 + fi + fi + +} + +function check_template_exist { + + # check if a template exists + # and create missing components + + local components + + components="template perms d s" + + if [ ! -d "`dirname $TEMPLATE_BASE`" ]; then + echo $BASENAME: template not found + exit 1 + fi + + for component in $components; do + + if [ ! -e "$TEMPLATE_BASE.$component" ]; then + + echo "$BASENAME: template component not found: $TEMPLATE_BASE.$component; creating..." + + cd `dirname $TEMPLATE_BASE` + + if [ "$component" == "perms" ] || [ "$component" == "template" ]; then + touch $TEMPLATE_BASE.$component + else + mkdir $TEMPLATE_BASE.$component + fi + + if use_svn && [ -d "`dirname $TEMPLATE_BASE`/.svn" ]; then + svn add $TEMPLATE_BASE.$component + info_commit="yes" + fi + + elif use_svn && [ -d "`dirname $TEMPLATE_BASE`/.svn" ] && \ + ! svn_check $TEMPLATE_BASE.$component; then + + cd `dirname $TEMPLATE_BASE` + svn add $TEMPLATE_BASE.$component + info_commit="yes" + + fi + + done + + if [ "$info_commit" == "yes" ] && [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to add new files in the svn repository" + fi + +} + +function template_delete { + + # delete a file from a template + # usage: template_delete <file> + + if [ -e "$TEMPLATE_BASE.d/$1" ]; then + if use_svn && [ -d "$TEMPLATE_BASE.d/.svn" ]; then + cd $TEMPLATE_BASE.d + svn del --force ./$1 || rm -rf ./$1 + if [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to del $1 in the svn repository" + fi + else + rm -rf $TEMPLATE_BASE.d/$1 + echo Removed $1 from $TEMPLATE_BASE.d + fi + elif [ -e "$TEMPLATE_BASE.s/$1" ]; then + if use_svn && [ -d "$TEMPLATE_BASE.s/.svn" ]; then + cd $TEMPLATE_BASE.s + svn del --force ./$1 || rm -rf ./$1 + if [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to del $1 in the svn repository" + fi + else + rm -rf $TEMPLATE_BASE.s/$1 + echo Removed $1 from $TEMPLATE_BASE.s + fi + else + if [ ! -d "$TEMPLATE_BASE.d" ]; then + echo $BASENAME: template folder $TEMPLATE_BASE.d not found + else + echo $BASENAME: file $1 not found at $TEMPLATE_BASE.d + fi + exit 1 + fi + +} + +function template_remove { + + # remove a template + # usage: template_remove + + local basedir template + + basedir="`dirname $TEMPLATE_BASE`" + template="`basename $basedir`" + + if [ ! -d "$basedir" ]; then + echo $BASENAME: template $template does not exist + exit 1 + fi + + if use_svn && [ -d "$basedir/.svn" ]; then + cd $TEMPLATE_FOLDER + svn update + svn del --force $template + if [ "$?" != "0" ]; then + echo $BASENAME: error deleting template $template + else + svn commit -m "deleted $template" + if [ "$?" != "0" ]; then + echo $BASENAME: error commiting to svn repository + fi + fi + else + rm -rf $basedir + fi + +} + +function template_list { + + # list templates + # usage: template_list [template_name] + + local list basedir template + + if [ "$TEMPLATE_STORAGE_STYLE" != "own-folder" ]; then + echo "$BASENAME: option only available if TEMPLATE_STORAGE_STYLE configured as 'own-folder'" + return 1 + fi + + if echo $1 | grep -q "/" || [ ! -z "$1" ]; then + + template="`echo $1 | cut -d "/" -f 1`" + + if [ -e "$BASE_CONF/defaults/templates/$1" ]; then + list="`ls $BASE_CONF/defaults/templates/$1 2> /dev/null`" + if [ "$?" == "0" ]; then + list="`echo $list | xargs`" + echo "In the default template $template: $list" + fi + fi + + if [ -e "$TEMPLATE_FOLDER/$1" ]; then + list="`ls $TEMPLATE_FOLDER/$1 2> /dev/null`" + if [ "$?" == "0" ]; then + list="`echo $list | xargs`" + echo "In the custom template $template: $list" + fi + fi + + else + + list="`ls $BASE_CONF/defaults/templates/$1 2> /dev/null`" + if [ "$?" == "0" ]; then + list="`echo $list | xargs`" + echo "Default templates: $list" + fi + + list="`ls $TEMPLATE_FOLDER/$1 2> /dev/null`" + if [ "$?" == "0" ]; then + list="`echo $list | xargs`" + echo "Custom templates: $list" + fi + + fi + +} + +function template_post_install_edit { + + # add or edit a post-installation script + # usage: template_post_install_edit <script-name> + + if [ -z "$1" ]; then + echo $BASENAME: no template specified + exit 1 + elif echo $1 | grep -q "/"; then + echo $BASENAME: error: invalid script name $1 + fi + + if [ -f "$TEMPLATE_BASE.s/$1" ]; then + sha1sum="`sha1sum $TEMPLATE_BASE.s/$1`" + if [ ! -z "$EDITOR" ]; then + $EDITOR $TEMPLATE_BASE.s/$1 + else + vi $TEMPLATE_BASE.s/$1 + fi + if [ "$sha1sum" != "`sha1sum $TEMPLATE_BASE.s/$1`" ] && \ + [ -d "`dirname $TEMPLATE_BASE`/.svn" ] && [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to send changes to the repository" + fi + else + + if [ -e "$TEMPLATE_BASE.s/$1" ]; then + + echo $BASENAME: file $TEMPLATE_BASE.s/$1 not a regular file + + elif [ -d "$TEMPLATE_BASE.s" ]; then + + touch $TEMPLATE_BASE.s/$1 + chmod +x $TEMPLATE_BASE.s/$1 + + if [ -d "$TEMPLATE_BASE.s/.svn" ]; then + cd $TEMPLATE_BASE.s + svn add $1 + if [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to send the script to the repository" + fi + fi + + echo "$BASENAME: script created; run templatepkg -p `basename $TEMPLATE_BASE` $1 again to edit it" + + else + echo $BASENAME: folder not found: $TEMPLATE_BASE.s + fi + + fi + +} + +function template_edit { + + # edit a template package list + # usage: template_edit + + if [ -f "$TEMPLATE_BASE.template" ]; then + sha1sum="`sha1sum $TEMPLATE_BASE.template`" + if [ ! -z "$EDITOR" ]; then + $EDITOR $TEMPLATE_BASE.template + else + vi $TEMPLATE_BASE.template + fi + if [ "$sha1sum" != "`sha1sum $TEMPLATE_BASE.template`" ] && \ + [ -d "`dirname $TEMPLATE_BASE`/.svn" ] && [ -z "$SILENT" ]; then + echo "$BASENAME: please run 'jail-commit --all' to send changes to the repository" + fi + elif [ -e "$TEMPLATE_BASE.template" ]; then + echo $BASENAME: file $TEMPLATE_BASE.template not a regular file + else + echo $BASENAME: file not found: $TEMPLATE_BASE.template + fi + +} + +function require { + + # requires a string + # usage: require [string] + + if [ -z "$1" ]; then + usage + fi + +} + +function setroot { + + # set ROOT variable + # usage: setroot <value1> <value2> + + if [ -z "$1" ]; then + ROOT="/" + else + ROOT="$1" + fi + +} + +function create_doinst { + + # create a doinst.sh from a template.perms file + # usage: create_doinst <doinst-path> + + rm -f $1/doinst.sh + + if [ -s "$TEMPLATE_BASE.perms" ]; then + echo Creating doinst.sh... + cat $TEMPLATE_BASE.perms | while read entry; do + file="`echo $entry | cut -d ";" -f 1`" + if [ -e "$TEMPLATE_BASE.d/$file" ]; then + owner="`echo $entry | cut -d ";" -f 2`" + group="`echo $entry | cut -d ";" -f 3`" + perms="`echo $entry | cut -d ";" -f 4`" + echo "( chmod $perms /$file )" >> $1/doinst.sh + echo "( chown $owner:$group /$file )" >> $1/doinst.sh + fi + done + fi + +} + +function package_template { + + # make a package from a template + # usage: package_template [version] [build] [arch] + + local template version build arch + + template="`basename $TEMPLATE_BASE`" + + if [ ! -d "$TEMPLATE_BASE.d" ]; then + $BASENAME: folder not found: $TEMPLATE.base.d + return 1 + fi + + echo Buiding package for template $template... + + if [ -z "$1" ]; then + version="1" + else + version="$1" + fi + + if [ -z "$2" ]; then + build="1" + else + build="$2" + fi + + if [ -z "$3" ]; then + arch="noarch" + else + arch="$3" + fi + + TMP=${TMP:=/tmp} + rm -rf $TMP/templatepkg + mkdir -p $TMP/templatepkg + + rsync -av --exclude=.svn $TEMPLATE_BASE.d/ $TMP/templatepkg/ + mkdir $TMP/templatepkg/install + create_doinst $TMP/templatepkg/install + + echo "template-$template: template-$template" > $TMP/templatepkg/install/slack-desc + echo "template-$template: " >> $TMP/templatepkg/install/slack-desc + echo "template-$template: simplepkg template $template" >> $TMP/templatepkg/install/slack-desc + + for ((n=1;n<=8;n++)); do + echo "template-$template: " >> $TMP/templatepkg/install/slack-desc + done + + cd $TMP/templatepkg + + makepkg -c n -l y $TMP/template-$template-$version-noarch-$build.tgz + + cd $TMP + rm -rf templatepkg + +} + +# ----------------------------------------------------- +# main +# ----------------------------------------------------- + +if [ ! -z "$2" ]; then + search_template $2 --new +fi + +TEMPLATE="$TEMPLATE_BASE.template" + +if [ "$1" == "-u" ] || [ "$1" == "--update" ]; then + + require $2 + setroot $3 + template_update + +elif [ "$1" == "-c" ] || [ "$1" == "--create" ]; then + + require $2 + setroot $3 + template_create + +elif [ "$1" == "-a" ] || [ "$1" == "--add" ]; then + + require $2 + + if [ -z "$3" ]; then + usage + else + setroot $4 + fi + + template_add $ROOT $3 + +elif [ "$1" == "-d" ] || [ "$1" == "--delete" ]; then + + require $2 + + if [ -z "$3" ]; then + usage + else + template_delete $3 + fi + +elif [ "$1" == "-s" ] || [ "$1" == "--sync" ]; then + + if use_svn && [ -d "$TEMPLATE_FOLDER/.svn" ]; then + ( cd $TEMPLATE_FOLDER && svn update ) + true + fi + +elif [ "$1" == "-e" ] || [ "$1" == "--export" ]; then + + require $2 + import_export_templates export $2 + +elif [ "$1" == "-i" ] || [ "$1" == "--import" ]; then + + require $2 + import_export_templates import $2 + +elif [ "$1" == "-r" ] || [ "$1" == "--remove" ]; then + + require $2 + template_remove + +elif [ "$1" == "-l" ] || [ "$1" == "--list" ]; then + + template_list $2 + +elif [ "$1" == "-b" ] || [ "$1" == "--batch-edit" ]; then + + require $3 + template_post_install_edit $3 + +elif [ "$1" == "-t" ] || [ "$1" == "--template-edit" ]; then + + require $2 + template_edit + +elif [ "$1" == "-p" ] || [ "$1" == "--pack" ]; then + + require $2 + shift ; shift + package_template $* + +elif [ "$1" == "-h" ] || [ "$1" == "--help" ]; then + + display_help $2 + +else + usage +fi + |