aboutsummaryrefslogtreecommitdiff
path: root/src/templatepkg
diff options
context:
space:
mode:
Diffstat (limited to 'src/templatepkg')
-rwxr-xr-xsrc/templatepkg987
1 files changed, 987 insertions, 0 deletions
diff --git a/src/templatepkg b/src/templatepkg
new file mode 100755
index 0000000..c107bd8
--- /dev/null
+++ b/src/templatepkg
@@ -0,0 +1,987 @@
+#!/bin/bash
+#
+# templatepkg: 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
+#
+# $Rev$ - $Author$
+#
+
+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
+
+ echo "$BASENAME: help for option $option:"
+ echo ""
+
+ 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> [jail-root]"
+ echo ""
+ echo " file-name: the file or directory to be removed"
+ echo " jail-root: if specified, the file is also removed from the jail"
+ ;;
+ "-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 [path]"
+ ;;
+ "-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 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
+ local repository_type repository_path
+
+ if [ "$?" != 0 ]; then
+ usage
+ exit 1
+ elif ! templates_under_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"
+
+ valid_svn_repo $repository
+
+ if [ ! -z "$2" ]; then
+
+ if ! svn_folder $templates_folder; then
+
+ cd $basedir
+
+ if [ "$mode" == "export" ]; then
+ preposition="to"
+ check_and_create_svn_repo $repository
+ 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
+ local orig_packages orig_perms orig_scripts orig_files
+
+ if [ ! -d "`dirname $TEMPLATE_BASE`" ]; then
+
+ echo Creating template `basename $TEMPLATE_BASE`...
+
+ if templates_under_svn && svn_folder `dirname $TEMPLATE_BASE`; 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_perms`
+ touch `template_packages`
+
+ if templates_under_svn && svn_folder `dirname $TEMPLATE_BASE`; then
+
+ cd `dirname $TEMPLATE_BASE`
+
+ if ! svn_check `template_files`; then
+ svn mkdir `template_files`
+ info_commit="yes"
+ else
+ mkdir -p `template_files`
+ fi
+
+ if ! svn_check `template_scripts`; then
+ svn mkdir `template_scripts`
+ info_commit="yes"
+ else
+ mkdir -p `template_scripts`
+ fi
+
+ if ! svn_check `template_packages`; then
+ svn add `template_packages`
+ info_commit="yes"
+ fi
+
+ if ! svn_check `template_perms`; then
+ svn add `template_perms`
+ info_commit="yes"
+ fi
+
+ elif templates_under_svn && svn_folder "$TEMPLATE_FOLDER"; then
+
+ mkdir `template_files` `template_scripts`
+ cd $TEMPLATE_FOLDER
+ svn add `basename $TEMPLATE_BASE`
+ info_commit="yes"
+
+ else
+ mkdir `template_files` `template_scripts`
+ 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 [ -e "$orig_template/$ROOT/packages" ]; then
+ orig_packages="$orig_template/$ROOT/packages"
+ orig_perms="$orig_template/$ROOT/perms"
+ orig_scripts="$orig_template/$ROOT/scripts"
+ orig_files="$orig_template/$ROOT/files"
+ else
+ orig_packages="$orig_template/$ROOT.template"
+ orig_perms="$orig_template/$ROOT.perms"
+ orig_scripts="$orig_template/$ROOT.s"
+ orig_files="$orig_template/$ROOT.d"
+ fi
+
+ if [ -f "$orig_perms" ]; then
+ cat $orig_perms > `template_perms`
+ fi
+
+ if [ -f "$orig_packages" ]; then
+ cat $orig_packages > `template_packages`
+ fi
+
+ if templates_under_svn && svn_folder $orig_template; then
+
+ cd `dirname $TEMPLATE_BASE`
+
+ list="`ls $orig_files/ 2> /dev/null`"
+ if [ ! -z "$list" ]; then
+ echo Copying files to the new template...
+ rsync -av --exclude=.svn $orig_files/ `template_files`/
+ svn add `basename $(template_files)`/*
+ info_commit="yes"
+ fi
+
+ list="`ls $orig_scripts/ 2> /dev/null`"
+ if [ ! -z "$list" ]; then
+ echo Copying scripts to the new template...
+ rsync -av --exclude=.svn $orig_scripts/ `template_scripts`/
+ svn add `basename $(template_scripts)`/*
+ info_commit="yes"
+ fi
+
+ else
+
+ list="`ls $orig_files/ 2> /dev/null`"
+ if [ ! -z "$list" ]; then
+ echo Copying files to the new template...
+ rsync -av $orig_files/ `template_files`/
+ fi
+
+ list="`ls $orig_scripts/ 2> /dev/null`"
+ if [ ! -z "$list" ]; then
+ echo Copying scripts to the new template...
+ rsync -av $orig_scripts/ `template_scripts`/
+ fi
+
+ fi
+
+ else
+ echo $BASENAME: warning: no root directory defined
+ fi
+
+ if [ "$info_commit" == "yes" ] && [ -z "$SILENT" ]; then
+ echo "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 Adding $pack # on $TEMPLATE
+ fi
+ else
+ echo $pack >> $TEMPLATE
+ echo Adding $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 Removing $pack # from $TEMPLATE
+ fi
+ fi
+
+ done
+
+ if ! svn_check `template_packages` && svn_folder `dirname $TEMPLATE_BASE`; then
+ cd `dirname $TEMPLATE_BASE`
+ svn add `basedir $(template_packages)`
+ 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_files`/$file" ]; then
+ if [ -d "`template_files`/$file" ]; then
+
+ echo $BASENAME: folder `slash $file` already on `template_files`, checking for contents
+
+ cd $jail
+ for candidate in `find $file`; do
+ if [ ! -a "`template_files`/$candidate" ]; then
+ mkdir -p `template_files`/`dirname $candidate`
+ cp -a $jail/$candidate `template_files`/$candidate
+ if templates_under_svn && svn_folder `template_files`; then
+ cwd="`pwd`"
+ cd `template_files`
+ 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_files)/$candidate`
+ fi
+ fi
+ done
+
+ if [ "$info_commit" == "yes" ] && [ -z "$SILENT" ]; then
+ echo "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_files`
+ exit 1
+ fi
+ else
+
+ if [ -a "$jail/$file" ]; then
+
+ destination="`echo $(template_files)/$file | sed -e 's/\/$//'`"
+
+ if templates_under_svn && svn_folder `template_files`; then
+
+ candidate="./`dirname $file`"
+
+ if ! svn_folder `template_files`/$candidate; then
+ mkdir -p `template_files`/$candidate
+ cd `template_files`/`dirname $candidate`
+ while true; do
+ if svn_folder $(pwd); then
+ svn add `basename $candidate`
+ break
+ else
+ candidate="`basename $(pwd)`"
+ cd ..
+ fi
+ done
+ fi
+
+ cp -a $jail/$file $destination
+
+ cwd="`pwd`"
+ cd `template_files`
+ svn add ./$file
+
+ if [ "$?" != "0" ]; then
+ echo $BASENAME: error adding `slash $candidate` into the revision system
+ else
+ if [ -z "$SILENT" ]; then
+ echo "Please run 'jail-commit --all' to add `slash $file` into the svn repository"
+ fi
+ fi
+
+ cd $cwd
+
+ else
+
+ mkdir -p `template_files`/`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_packages` `template_perms` `template_files` `template_scripts`"
+
+ if [ ! -d "`dirname $TEMPLATE_BASE`" ]; then
+ echo $BASENAME: template not found
+ exit 1
+ fi
+
+ for component in $components; do
+
+ if [ ! -e "$component" ]; then
+
+ echo "$BASENAME: template component not found: $component; creating..."
+
+ cd `dirname $TEMPLATE_BASE`
+
+ if [ "$component" == "perms" ] || [ "$component" == "template" ]; then
+ touch $component
+ else
+ mkdir $component
+ fi
+
+ if templates_under_svn && svn_folder `dirname $TEMPLATE_BASE`; then
+ svn add $component
+ info_commit="yes"
+ fi
+
+ elif templates_under_svn && svn_folder `dirname $TEMPLATE_BASE` && \
+ ! svn_check $component; then
+
+ cd `dirname $TEMPLATE_BASE`
+ svn add $component
+ info_commit="yes"
+
+ fi
+
+ done
+
+ if [ "$info_commit" == "yes" ] && [ -z "$SILENT" ]; then
+ echo "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> [jail-root]
+
+ if [ -e "`template_files`/$1" ]; then
+
+ # first try to remove the file from the template
+ if templates_under_svn && svn_folder `template_files`; then
+ cd `template_files`
+ svn del --force ./$1 || rm -rf ./$1
+ if [ -z "$SILENT" ]; then
+ echo "Please run 'jail-commit --all' to del $1 in the svn repository"
+ fi
+ else
+ rm -rf `template_files`/$1
+ echo Removed $1 from `template_files`
+ fi
+
+ # then, if requested, remove the file from the jail
+ if [ ! -z "$2" ]; then
+ if [ ! -d "$2" ]; then
+ echo $BASENAME: jail not found: $2
+ elif [ -e "$2/$1" ]; then
+ rm -rf $2/$1
+ echo Removed $1 from jail $2
+ else
+ echo $BASENAME: file not found: $2/$1
+ fi
+ fi
+
+ elif [ -e "`template_scripts`/$1" ]; then
+ if templates_under_svn && svn_folder `template_scripts`; then
+ cd `template_scripts`
+ svn del --force ./$1 || rm -rf ./$1
+ if [ -z "$SILENT" ]; then
+ echo "Please run 'jail-commit --all' to del $1 in the svn repository"
+ fi
+ else
+ rm -rf `template_scripts`/$1
+ echo Removed $1 from `template_scripts`
+ fi
+ else
+ if [ ! -d "`template_files`" ]; then
+ echo $BASENAME: template folder `template_files` not found
+ else
+ echo $BASENAME: file $1 not found at `template_files`
+ 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 templates_under_svn && svn_folder $basedir; 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 [path]
+
+ local list basedir template
+
+ if [ "$TEMPLATE_STORAGE_STYLE" != "own-folder" ] && \
+ [ "$TEMPLATE_STORAGE_STYLE" != "compact" ]; then
+ echo "$BASENAME: option only available if TEMPLATE_STORAGE_STYLE configured as 'own-folder' or 'compact'"
+ 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_scripts`/$1" ]; then
+ sha1sum="`sha1sum $(template_scripts)/$1`"
+ if [ ! -z "$EDITOR" ]; then
+ $EDITOR `template_scripts`/$1
+ else
+ vi `template_scripts`/$1
+ fi
+ if [ "$sha1sum" != "`sha1sum $(template_scripts)/$1`" ] && \
+ svn_folder `dirname $TEMPLATE_BASE` && [ -z "$SILENT" ]; then
+ echo "Please run 'jail-commit --all' to send changes to the repository"
+ fi
+ else
+
+ if [ -e "`template_scripts`/$1" ]; then
+
+ echo $BASENAME: file `template_scripts`/$1 not a regular file
+
+ elif [ -d "`template_scripts`" ]; then
+
+ touch `template_scripts`/$1
+ chmod +x `template_scripts`/$1
+
+ if svn_folder `template_scripts`; then
+ cd `template_scripts`
+ svn add $1
+ if [ -z "$SILENT" ]; then
+ echo "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_scripts`
+ fi
+
+ fi
+
+}
+
+function template_edit {
+
+ # edit a template package list
+ # usage: template_edit
+
+ if [ -f "`template_packages`" ]; then
+ sha1sum="`sha1sum $(template_packages)`"
+ if [ ! -z "$EDITOR" ]; then
+ $EDITOR `template_packages`
+ else
+ vi `template_packages`
+ fi
+ if [ "$sha1sum" != "`sha1sum $(template_packages)`" ] && \
+ svn_folder `dirname $TEMPLATE_BASE` && [ -z "$SILENT" ]; then
+ echo "Please run 'jail-commit --all' to send changes to the repository"
+ fi
+ elif [ -e "`template_packages`" ]; then
+ echo $BASENAME: file `template_packages` not a regular file
+ else
+ echo $BASENAME: file not found: `template_packages`
+ 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_perms`" ]; then
+ echo Creating doinst.sh...
+ cat `template_perms` | while read entry; do
+ file="`echo $entry | cut -d ";" -f 1`"
+ if [ -e "`template_files`/$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_files`" ]; then
+ $BASENAME: folder not found: `template_files`
+ 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_files`/ $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.$MKBUILD_COMPRESS
+
+ cd $TMP
+ rm -rf templatepkg
+
+}
+
+# -----------------------------------------------------
+# main
+# -----------------------------------------------------
+
+if [ ! -z "$2" ]; then
+ search_template $2 --new
+fi
+
+TEMPLATE="`template_packages`"
+
+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 $4
+ fi
+
+elif [ "$1" == "-s" ] || [ "$1" == "--sync" ]; then
+
+ if templates_under_svn && svn_folder $TEMPLATE_FOLDER; 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
+