diff options
Diffstat (limited to 'src/templatepkg')
-rwxr-xr-x | src/templatepkg | 987 |
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 + |