diff options
| author | Silvio Rhatto <rhatto@riseup.net> | 2017-10-07 19:32:06 -0300 | 
|---|---|---|
| committer | Silvio Rhatto <rhatto@riseup.net> | 2017-10-07 19:32:06 -0300 | 
| commit | 0d6bcb2b7d08e3a41481372c1ae0d11868d88b1b (patch) | |
| tree | d4429ce3a62e9cb5d095ad567b5f821d99a7b9f5 /src | |
| parent | 5bfb15bdbedbc7273a283d611c84ed1cf401011b (diff) | |
| download | simplepkg-0d6bcb2b7d08e3a41481372c1ae0d11868d88b1b.tar.gz simplepkg-0d6bcb2b7d08e3a41481372c1ae0d11868d88b1b.tar.bz2  | |
New repo layout with git migration
Diffstat (limited to 'src')
| -rw-r--r-- | src/createpkg | 1096 | ||||
| -rwxr-xr-x | src/jail-commit | 175 | ||||
| -rwxr-xr-x | src/jail-update | 62 | ||||
| -rwxr-xr-x | src/lspkg | 148 | ||||
| -rwxr-xr-x | src/mkbuild | 1904 | ||||
| -rwxr-xr-x | src/mkjail | 115 | ||||
| -rw-r--r-- | src/mkpatch | 145 | ||||
| -rwxr-xr-x | src/mkpatch.new | 145 | ||||
| -rwxr-xr-x | src/rebuildpkg | 86 | ||||
| -rwxr-xr-x | src/simplaret | 1194 | ||||
| -rwxr-xr-x | src/simpletrack | 66 | ||||
| -rwxr-xr-x | src/templatepkg | 987 | 
12 files changed, 6123 insertions, 0 deletions
diff --git a/src/createpkg b/src/createpkg new file mode 100644 index 0000000..10daf0b --- /dev/null +++ b/src/createpkg @@ -0,0 +1,1096 @@ +#!/bin/bash +# +# createpkg: package builder using http://slack.sarava.org/slackbuilds scripts +# feedback: rhatto at riseup.net / rudsonalves at yahoo.com.br +# +#  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 +# +# Version $Rev$ - $Author$ +# + +#--------------------------------------------------- +#               Createpkg functions +#--------------------------------------------------- + +function usage { + +  # Help message +  echo -e "${red}NAME${normal} +        createpkg - create Slackware packages from SlackBuilds in Sarava repository + +${red}SYNOPSIS +        createpkg${normal} [${green}OPTIONS${normal}] [${green}program1${normal} ... ${green}programN${normal}] + +${red}DESCRIPTION${normal} +        [${green}program${normal}] name to build/search (some options support more than one program) + +        Input ${green}OPTIONS${normal}: +            ${red}-i${normal}, ${red}--install${normal} ${green}<program1>${normal} +                create the package ${green}<program>${normal} and install +            ${red}-a${normal}, ${red}--all${normal} +                create all packages and install +            ${red}-np${normal}, ${red}--no-deps${normal} +                does not solve dependences +            ${red}-d${normal}, ${red}--debug${normal} ${green}<program>${normal} +                enable SlackBuild debug (sh -x ...) +            ${red}-s${normal}, ${red}--search${normal} ${green}<program${normal}> +                search for a ${green}<program>${normal} +            ${red}-f${normal}, ${red}--info${normal} ${green}<program>${normal} +                show description and dependences of the program +            ${red}-l${normal}, ${red}--list${normal} +                list all the SlackBuilds +            ${red}--list-packages ${green}[repository]${normal} +                list all packages in binary repositories +            ${red}--sign${green}<package_name>${normal} +                sign a binary package +            ${red}--remove${green}<package_name>${normal} +                remove a binary package +            ${red}--sync${normal} +                synchronize SlackBuilds repository +            ${red}--update${normal} +                synchronize packages repository +            ${red}--commit${normal} ${green}["message"]${normal} +                commit changes to binary packages' repository +            ${red}--status${normal} +                check binary packages' svn repository status +            ${red}--import${normal} +                import packages into a svn repository +            ${red}--checkout${normal} +                checkout binary packages from a svn repository +            ${red}--update-keyring${normal} +                update GPG-KEY from binary repositories +            ${red}-h${normal}, ${red}--help${normal} +                show this help + +${red}EXAMPLES${normal} +        ${red}createpkg -i scilab${normal} +            build and install scilab package +        ${red}createpkg -s at*${normal} +            search for all at* SlackBuilds scripts (at-spi, atk, ...) +        ${red}createpkg --info pyrex${normal} +            show pyrex description and dependences +        $SYNC=yes {red}createpkg -i scilab${normal} +            sync repository first, then build and install scilab package + +${red}AUTHOR${normal} +        Written by ${blue}Rudson R. Alves${normal} and ${blue}Silvio Rhatto${normal}  + +${red}AVAILABILITY${normal} +        by svn: ${yellow}svn checkout http://slack.sarava.org/simplepkg${normal} + +${red}REPORTING BUGS${normal} +        Report bugs to <${blue}rudsonalves[at]rra.etc.br${normal}> + +${red}COPYRIGHT${normal} +        Copyright © 2006 Free Software Foundation, Inc. +        This is free software. You may redistribute copies of it under the +        terms of the GNU General Public License +        <${yellow}http://www.gnu.org/licenses/gpl.html${normal}>. There is NO WARRANTY, +        to the extent permitted by law." +} + +function build_all_slackbuilds { + +  # Build all SlackBuilds in repository +  createpkg --sync + +  cd $SLACKBUILDS_DIR +  LIST=`find . -name *.SlackBuild | sed 's/.*\/\(.*\)\.SlackBuild$/\1/' | sort | uniq` +  for i in $LIST; do +    [ ! lspkg $i >/dev/null ] && createpkg -i $i +  done + +} + +function check_config { + +  # Check the configuration +  TMP=${TMP:=/tmp} + +  if [ ! -z "$REPOS" ]; then +    PACKAGES_DIR="$REPOS" +  else +    REPOS=$PACKAGES_DIR +  fi + +  # Nested folders, if configured +  if [ ! -z "$PACKAGES_REPOS_STYLE" ]; then +    PACKAGES_REPOS_STYLE=$(echo $PACKAGES_REPOS_STYLE | sed -e "s/none//g" -e "s/distro/`default_distro`/g" \ +                                                            -e "s/arch/`default_arch`/g" -e "s/version/`default_version`/g") +    PACKAGES_DIR="$PACKAGES_DIR/$PACKAGES_REPOS_STYLE" +    REPOS="$REPOS/$PACKAGES_REPOS_STYLE" +  fi + +  # Create $TMP and $REPOS if need +  [ ! -e $TMP ] && mkdir -p $TMP +  [ ! -e $PACKAGES_DIR ] && create_repo_folder $PACKAGES_DIR +  # +  SLACKBUILDS_DIR=${SLACKBUILDS_DIR:=/var/simplepkg/slackbuilds} +  # +  SYNC=${SYNC:=$no} +  SYNC=`convert_boolean $SYNC` +  BASEDIR="`dirname $SLACKBUILDS_DIR`" + +} + +function solve_dep { + +  # Solve dependency +  [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER +  local PACK="$1" +  local COND="$2" +  local VER="$3" + +  # Check package in local system +  PACK="`echo $PACK | sed -e 's/\+/\\\+/'`" +  INSTALLED="`check_installed $PACK`" +  CHECK=$? + +  # TODO: check dependency versions +  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 -eq $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND ]; then +        # Try to use simplaret +        ARCH=$CREATEPKG_ARCH simplaret --update +        ARCH=$CREATEPKG_ARCH simplaret --install $PACK +        [ $? -ne 0 ] && handle_error $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND $PACK +      elif [ $EXIT_CODE -ne 0 ]; then +        handle_error $EXIT_CODE $PACK +      fi + +    fi +  fi + +} + +function find_slackbuild { + +  # Find SlackBuild script in the repository +  [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER +  OUTPUT=`find $SLACKBUILDS_DIR -iname $1.SlackBuild` +  [ "$OUTPUT" != "" ] && EXIT_CODE=0 || EXIT_CODE=1 +  echo $OUTPUT + +} + +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]` +      ID_VERSION=`grep '^SRC_VERSION' $i | cut -f2- -d":" | cut -f2 -d= | cut -f1 -d}` +      eecho $commun "$NAME_UP: " +      eecho Version: "$ID_VERSION" +      eecho + +      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_slackbuilds { + +  # list all available slackbuilds +  # usage: list_slackbuilds + +  list_builds $SLACKBUILDS_DIR SlackBuild + +} + +function load_parameters { + +  # Load Createpkg parameters +  PACKAGES_DIR="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`" +  PACKAGES_SVN="`eval_parameter PACKAGES_SVN http://slack.sarava.org/packages`" +  PACKAGES_REPOS_STYLE="`eval_parameter PACKAGES_REPOS_STYLE none`" +  NOARCH_DIR="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`/noarch" +  SOURCE_DIR="`eval_parameter SOURCE_DIR /var/simplepkg/sources`" +  SLACKBUILDS_DIR="`eval_parameter SLACKBUILDS_DIR /var/simplepkg/slackbuilds`" +  SLACKBUILDS_SVN="`eval_parameter SLACKBUILDS_SVN http://slack.sarava.org/slackbuilds`" +  SVN_USER="`eval_parameter PACKAGES_SVN_USER`" +  SVN_GROUP="`eval_parameter PACKAGES_SVN_GROUP`" +  SOURCE_DIR_USER="`eval_parameter SOURCE_DIR_USER`" +  SOURCE_DIR_GROUP="`eval_parameter SOURCE_DIR_GROUP`" + +  COLOR_MODE="`eval_parameter COLOR_MODE none`" +  CREATEPKG_ARCH="`eval_parameter CREATEPKG_ARCH $(default_arch)`" +  CREATEPKG_CLEANUP="`eval_parameter CREATEPKG_CLEANUP yes`" +  CREATEPKG_AUTHOR="`eval_parameter CREATEPKG_AUTHOR`" + +  TMP="`eval_parameter TMP /tmp`" +  TMP_USER="`eval_parameter TMP_USER`" +  TMP_GROUP="`eval_parameter TMP_GROUP`" + +  SIGN_PACKAGES="`eval_boolean_parameter SIGN_PACKAGES $off`" +  SIGN_PACKAGES_USER="`eval_parameter SIGN_PACKAGES_USER`" +  SIGN_PACKAGES_KEYID="`eval_parameter SIGN_PACKAGES_KEYID`" +  SIGN_PACKAGES_WITH_GPG_AGENT="`eval_boolean_parameter SIGN_PACKAGES_WITH_GPG_AGENT $off`" + +  if [ ! -z "$SIGN_PACKAGES_KEYID" ]; then +    SIGN_PACKAGES_KEYID="`echo $SIGN_PACKAGES_KEYID | tr '[:lower:]' '[:upper:]'`" +  fi + +  if [ "$SIGN_PACKAGES_WITH_GPG_AGENT" -eq $on ]; then +    GPG_AGENT_OPTION="--use-agent" +  else +    GPG_AGENT_OPTION="" +  fi + +  # For use at common.sh functions +  SIGN="$SIGN_PACKAGES" +  SIGN_KEYID="$SIGN_PACKAGES_KEYID" +  SIGN_USER="$SIGN_PACKAGES_USER" + +  REMOVE_OLD_PACKAGE="`eval_boolean_parameter REMOVE_OLD_PACKAGE $off`" +  MOVE_BIN_PACKAGE="`eval_boolean_parameter MOVE_BIN_PACKAGE $off`" +  MOVE_SLACK_REQUIRED="`eval_boolean_parameter MOVE_SLACK_REQUIRED $off`" +  PACKAGES_REPOS_NOARCH="`eval_boolean_parameter PACKAGES_REPOS_NOARCH $on`" +  FORCE_MANIFEST_CHECK="`eval_boolean_parameter FORCE_MANIFEST_CHECK $off`" +  FORCE_MANIFEST_CHECK_SIGNATURE="`eval_boolean_parameter FORCE_MANIFEST_CHECK_SIGNATURE $off`" + +} + +function repository_checkout { + +  # checkout a binary repository +  # usage: repository_checkout [repository-adress] + +  local svn oldfolder + +  if [ -d "$PACKAGES_DIR" ]; then +    oldfolder="$(mktemp -d $(echo $PACKAGES_DIR | sed -e 's/\/*$//g').XXXXXX)" +    echo "Backing up old $folder at $oldfolder..." +    mv $PACKAGES_DIR $oldfolder +  fi + +  if [ -z "$1" ]; then +    svn="$1" +  else +    svn="$PACKAGES_SVN" +  fi + +  if valid_svn_repo $svn; then +    svn checkout $svn $PACKAGES_DIR +    chown_svn $PACKAGES_DIR && chgrp_svn $PACKAGES_DIR +    if [ "$svn" != "$PACKAGES_SVN" ]; then +      echo "Using svn repository different from the one pointed at $CONF." +    fi +  else +    echo "Invalid repository $repository, aborting." +    EXIT_CODE="1" +  fi + +} + +function repository_update { + +  if [ ! -z "$1" ] && svn_folder $1; then +    echo "Fetching changes from svn repository for $1..." +    cwd="`pwd`" +    chown_svn $1 && chgrp_svn $1 +    cd $1 && su_svn update +    cd $cwd +  fi + +} + +function repository_status { + +  local cwd + +  if svn_folder $PACKAGES_DIR; then +    echo "Status of $PACKAGES_DIR." +    cwd="`pwd`" +    cd $PACKAGES_DIR && su_svn status +    cd $cwd +  fi + +  if svn_folder $NOARCH_DIR; then +    cwd="`pwd`" +    echo "Status of $NOARCH_DIR." +    cd $NOARCH_DIR && su_svn status +    cd $cwd +  fi + +  exit 0 + +} + +function binary_repository_import { + +  # import packages into a subversion repository +  # usage: binary_repository_import [repository] + +  local repository="$1" folder + +  if [ -z "$repository" ]; then +    repository="file:////var/svn/packages" +  fi + +  # eval again so it doesn't include repository style information +  folder="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`" + +  repository_import $folder $repository + +} + +function create_repo_folder { + +  # Create repository directory +  # usage: create_repo_folder <repository_folder> + +  local folder="$1" basedir + +  if [ ! -d "$folder" ]; then +    echo "Creating packages folder $folder..." +    basedir="`dirname $folder`" +    if svn_folder $basedir && ! svn_check $folder; then +      ( +        cd $basedir +        chown_svn $basedir && chgrp_svn $basedir +        svn_mkdir `basename $folder`/$SUBFOLDER +      ) +    else +      mkdir -p $folder/$SUBFOLDER +    fi +  elif [ ! -e $folder/$SUBFOLDER ]; then +    if svn_folder $folder && ! svn_check $folder/$SUBFOLDER; then +      ( +        cd $folder +        chown_svn $folder && chgrp_svn $folder +        svn_mkdir $SUBFOLDER +      ) +    else +      mkdir -p $folder/$SUBFOLDER +    fi +  fi + +} + +function remove_old_package_data { + +  # Remove old packages from repository tree +  # usage: remove_old_package_data <repository_folder> + +  if [ ! -d "$1" ]; then +    return 1 +  fi + +  local makepkg_repos="$1" + +  # Remove old PACKAGEs from repository tree +  if [ $REMOVE_OLD_PACKAGE -eq $on ]; then + +    # first remove entries from CHECKSUMS.md5 +    if [ -f "$makepkg_repos/CHECKSUMS.md5" ]; then +      sed -i "/$PACKAGE-.*-.*-.*.*$/d" $makepkg_repos/CHECKSUMS.md5 +    fi + +    # then remove entries from patches/CHECKSUMS.md5 +    if [ -f "$makepkg_repos/patches/CHECKSUMS.md5" ]; then +      sed -i "/$PACKAGE-.*-.*-.*.*$/d" $makepkg_repos/patches/CHECKSUMS.md5 +    fi + +    # Using subversion +    if svn_folder $makepkg_repos; then + +      ( + +      cd $makepkg_repos + +      # Using -mindepth 2 so it doesn't delete the new PACKAGE +      for file in `find . -mindepth 2 -name "$PACKAGE-*-*-*.*"`; do +        candidate="`echo $file | sed -e 's/\.meta$/\.tgz/'`" # otherwise PACKAGE info functions can fail +        candidate="`echo $candidate | sed -e 's/\.asc$//'`" # otherwise PACKAGE info functions can fail +        # Just delete packages with different arch, version, build number or folder +        if [ "`package_name $candidate`" == "$PACKAGE" ]; then +          if [ "`package_version $candidate`" != "$PACKAGE_VERSION" ] || \ +             [ "`package_arch $candidate`" != "$PACKAGE_ARCH" ] || \ +             [ "`package_build $candidate`" != "$PACKAGE_BUILD" ] || \ +             [ "`package_ext $candidate`" != "$PACKAGE_EXT" ] || \ +             [ "`dirname $candidate | sed -e 's/^\.\///'`" != "`dirname $SUBFOLDER/$PKG_NAME | sed -e 's/^\.\///'`" ]; then +            svn_del $file +          fi +        fi +      done + +      for file in `find $makepkg_repos -name "$PACKAGE.slack-required"`; do +        if [ $MOVE_SLACK_REQUIRED -eq $off ]; then +          svn_del $file +        elif [ ! -z "$SLACK_REQUIRED" ] && [ "$makepkg_repos/$SUBFOLDER/$PACKAGE.slack-required" != "$file" ]; then +          svn_del $file +        fi +      done + +      ) + +    else +      # Using -mindepth 2 so it doesn't delete the new package +      eval find $makepkg_repos -mindepth 2 $(pkg_ext_find $PACKAGE-*-*-*) -exec rm {} 2>/dev/null \; +      find $makepkg_repos -mindepth 2 -name "$PACKAGE-*-*-*.meta" -exec rm {} 2>/dev/null \; +      find $makepkg_repos -mindepth 2 -name "$PACKAGE-*-*-*.*.asc" -exec rm {} 2>/dev/null \; +      find $makepkg_repos -name "$PACKAGE.slack-required" -exec rm {} 2>/dev/null \; +    fi +  fi + +} + +function update_metadata { + +  # Update repository metadata +  # usage: update_metadata <repository_folder> + +  if [ ! -d "$1" ]; then +    return 1 +  fi + +  local makepkg_repos="$1" + +  ( + +  cd $makepkg_repos + +  get_sign_user +  repo_gpg_key $makepkg_repos +  gen_meta $SUBFOLDER/$PKG_NAME +  gen_filelist +  update_md5_checksum $makepkg_repos $SUBFOLDER/$PKG_NAME + +  # update md5 file from patches/ folder if needed +  if [ -d "patches/" ]; then + +    found_patch="no" + +    for file in `eval find patches/ $(pkg_ext_find $PACKAGE-*-*-*)`; do +      found_patch="yes" +      update_md5_checksum $makepkg_repos/patches patches/$SUBFOLDER/$PKG_NAME +    done + +    if [ "$found_patch" == "yes" ]; then +      gen_patches_filelist patches +    fi +  fi + +  ) + +} + +function list_packages { + +  # list packages in repositories +  # usage: list_packages [repository_list] + +  local repository repositories="$*" + +  if [ -z "$repositories" ]; then +    repositories="$PACKAGES_DIR $NOARCH_DIR" +  fi + +  for repository in $repositories; do +    echo "Packages from $repository..." +    eval find $repository $(pkg_ext_find) +  done + +} + +function remove_package { + +  # delete a package from repositories +  # usage: remove_packages <package> [repository_list] + +  local package="$1" repository repositories="$2" + +  if [ -z "$package" ]; then +    return 1 +  fi + +  if [ -z "$repositories" ]; then +    repositories="$PACKAGES_DIR $NOARCH_DIR" +  fi + +  for repository in $repositories; do + +      ( + +      cd $repository + +      for file in `eval find . $(pkg_ext_find $package-*-*-*) -o -name "$package-*-*-*.meta" -o -name "$package-*-*-*.*.asc"`; do +        svn_del $file +        if [ -e "CHECKSUMS.md5" ] && echo $file | grep -q -E -e "$(pkg_ext_grep)$"; then +          # remove md5 information +          sed -i "/ \.*\/*$(regexp_slash $file)$/d" CHECKSUMS.md5 +          cat CHECKSUMS.md5 | gzip -9 -c - > CHECKSUMS.md5.gz +        fi +      done + +      for file in `find $repository -name "$package.slack-required"`; do +        svn_del $file +      done + +      ) + +      update_metadata $repository +  done + +} + +function sign_package { + +  # sign a package from repositories +  # usage: sign_package <package> [repository_list] + +  local package="$1" repository repositories="$2" + +  if [ -z "$package" ]; then +    return 1 +  fi + +  if [ -z "$repositories" ]; then +    repositories="$PACKAGES_DIR $NOARCH_DIR" +  fi + +  for repository in $repositories; do + +    ( + +    cd $repository + +    for file in `eval find . $(pkg_ext_find $package-*-*-*)`; do + +      echo "Signing package..." + +      get_sign_user + +      if [ ! -z "$SIGN_PACKAGES_USER" ] && [ "`whoami`" != "$SIGN_PACKAGES_USER" ]; then +        tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" +        chown $SIGN_PACKAGES_USER $tmp_sign_folder +        su $SIGN_PACKAGES_USER -c "gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/`basename $file`.asc $repository/$file" +        cp $tmp_sign_folder/`basename $file`.asc $repository/$file.asc +        rm -rf $tmp_sign_folder +      else +        tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" +        gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/`basename $file`.asc $repository/$file +        cp $tmp_sign_folder/`basename $file`.asc $repository/$file.asc +        rm -rf $tmp_sign_folder +      fi + +    done + +    ) + +    update_metadata $repository +  done + +} + +function create_package { + +  # Synchronize repository +  [ $SYNC -eq $yes ] && sync_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + +  # Update keyring +  update_keyring $SLACKBUILDS_DIR/GPG-KEY + +  # Get SlackBuild script +  BUILD_SCRIPT="`find_slackbuild $PACKAGE`" + +  # Check SlackBuild script found +  if [ -z "$BUILD_SCRIPT" ]; then +    handle_error $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND $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: no package selected" +      return 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=`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 -ne $on ]; 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 +    ) +    [ $? -ne 0 ] && handle_error $error $ERROR_CREATEPKG_DEPENDENCY + +    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 + +  # Use fakeroot if needed and available +  if [ "`whoami`" != "root" ]; then +    FAKEROOT="`which fakeroot`" +    if [ "$?" == "0" ]; then +      eecho $messag "$BASENAME: running SlackBuild with fakeroot." +      FAKEROOT="$FAKEROOT --" +    else +      eecho $messag "$BASENAME: WARNING: not running as root and no fakeroot found." +      eecho $messag "$BASENAME: WARNING: your build might not be successful." +      FAKEROOT="" +    fi +  else +    FAKEROOT="" +  fi + +  # Manifest checking +  if [ $FORCE_MANIFEST_CHECK -eq $on ] || [ $FORCE_MANIFEST_CHECK_SIGNATURE -eq $on ]; then +    if [ ! -e "`dirname $SCRIPT_NAME`/Manifest" ]; then +      eecho $messag "$BASENAME: ERROR: no Manifest file for $PACKAGE." +      return 1 +    fi +  fi + +  # Manifest signature checking +  if [ $FORCE_MANIFEST_CHECK_SIGNATURE -eq $on ]; then +    if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" `dirname $SCRIPT_NAME`/Manifest; then +      gpg --verify `dirname $SCRIPT_NAME`/Manifest &> /dev/null +      if [ "$?" != "0" ]; then +        eecho $messag "$BASENAME: ERROR: invalid signature for $PACKAGES's Manifest file." +        return 1 +      fi +    else +      eecho $messag "$BASENAME: ERROR: no signed Manifest file for $PACKAGE." +      return 1 +    fi +  fi + +  # Run SlackBuild script +  [ $DEBUG -eq $off ] && SHELL_FLAG="+x" || SHELL_FLAG="-x" +  ( +    LANG=en_US \ +    TMP=$TMP \ +    SRC_DIR=${SRC_DIR:=$SOURCE_DIR} \ +    SRC=${SRC_DIR:=$SOURCE_DIR} \ +    ARCH=${ARCH:=$CREATEPKG_ARCH} \ +    COLOR=${COLOR:=$COLOR_MODE} \ +    REPOS=${REPOS:=$PACKAGES_DIR} \ +    CLEANUP=${CLEANUP:=$CREATEPKG_CLEANUP} \ +    SLACKBUILD_PATH="/" \ +    INTERACT=no $FAKEROOT sh $SHELL_FLAG ./$SCRIPT_NAME +  ) + +  # Check if package was built +  handle_error $? $PACKAGE + +  # Fix source folder user +  if [ ! -z "$SOURCE_DIR_USER" ]; then +    chown -R $SOURCE_DIR_USER $SOURCE_DIR +  fi + +  # Fix source folder group +  if [ ! -z "$SOURCE_DIR_GROUP" ]; then +    chgrp -R $SOURCE_DIR_GROUP $SOURCE_DIR +  fi + +  # Get package name, arch, version and build number +  PKG_NAME="`ls -1 -c $PACKAGES_DIR/$PACKAGE-*-*-*.* | grep -E -e "$(pkg_ext_grep)$" | head -n 1 | xargs basename`" +  PACKAGE_NAME="`package_name $PKG_NAME`" +  PACKAGE_VERSION="`package_version $PKG_NAME`" +  PACKAGE_ARCH="`package_arch $PKG_NAME`" +  PACKAGE_BUILD="`package_build $PKG_NAME`" +  PACKAGE_EXT="`package_ext $PKG_NAME`" + +  # Update package author +  if [ ! -z "$CREATEPKG_AUTHOR" ]; then +    AUTHOR="`echo $PACKAGE_BUILD | sed -e 's/^[0-9]*//'`" +    if [ "$AUTHOR" != "$CREATEPKG_AUTHOR" ]; then +      echo "Changing package build author..." +      BUILD_NUMBER="`echo $PACKAGE_BUILD | sed -e "s/$AUTHOR$//"`" +      NEW_BUILD="$BUILD_NUMBER""$CREATEPKG_AUTHOR" +      mv $PACKAGES_DIR/$PKG_NAME $PACKAGES_DIR/$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCH-$NEW_BUILD.$PACKAGE_EXT +      PKG_NAME="$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCH-$NEW_BUILD.$PACKAGE_EXT" +      PACKAGE_BUILD="$NEW_BUILD" +      AUTHOR="$CREATEPKG_AUTHOR" +      echo "New package name is $PKG_NAME." +    fi +  fi + +  # Sign package +  if [ $SIGN_PACKAGES -eq $on ]; then + +    echo "Signing package..." + +    get_sign_user + +    if [ ! -z "$SIGN_PACKAGES_USER" ] && [ "`whoami`" != "$SIGN_PACKAGES_USER" ]; then +      tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" +      chown $SIGN_PACKAGES_USER $tmp_sign_folder +      su $SIGN_PACKAGES_USER -c "gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME" +      cp $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME.asc +      rm -rf $tmp_sign_folder +    else +      tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" +      gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME +      cp $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME.asc +      rm -rf $tmp_sign_folder +    fi + +  fi + +  # Select repository directory +  if [ $MOVE_BIN_PACKAGE -eq $on ]; then +    SUBFOLDER="$( echo ${SCRIPT_BASE#$SLACKBUILDS_DIR/} )" +    NEW_REPOS=$PACKAGES_DIR/$SUBFOLDER +  else +    SUBFOLDER="." +    NEW_REPOS=$PACKAGES_DIR +  fi + +  # Update information from remote repository +  repository_update $PACKAGES_DIR + +  # Create the repository folders +  create_repo_folder $PACKAGES_DIR + +  # Remove old packages from repository tree +  remove_old_package_data $PACKAGES_DIR + +  # Move package to SlackBuilds-like tree +  if [ $MOVE_BIN_PACKAGE -eq $on ]; then + +    mv $PACKAGES_DIR/$PKG_NAME $NEW_REPOS/ +    if [ -e "$PACKAGES_DIR/$PKG_NAME.asc" ]; then +      mv $PACKAGES_DIR/$PKG_NAME.asc $NEW_REPOS/ +    fi + +    if svn_folder $NEW_REPOS; then +      ( +        cd $NEW_REPOS +        chown_svn $PACKAGES_DIR && chgrp_svn $PACKAGES_DIR +        svn_add $PKG_NAME +        svn_add $PKG_NAME.asc +      ) +    fi + +    # Move package's slack-required to binary repository +    if [ $MOVE_SLACK_REQUIRED -eq $on ]; then +      if [ ! -z "$SLACK_REQUIRED" ]; then +        svn_copy $SLACK_REQUIRED $NEW_REPOS/$PACKAGE.slack-required +      fi +    fi + +  fi + +  # Update repository metadata +  update_metadata $PACKAGES_DIR + +  # General cleanup +  echo Cleaning up the repository... +  svn_remove_empty_folders $PACKAGES_DIR + +  # Update noarch repository +  if [ $PACKAGES_REPOS_NOARCH -eq $on ] && [ "`package_arch $PKG_NAME`" == "noarch" ]; then +    repository_update $NOARCH_DIR +    echo Copying package to noarch repository... +    create_repo_folder $NOARCH_DIR +    remove_old_package_data $NOARCH_DIR +    svn_copy $NEW_REPOS/$PKG_NAME $NOARCH_DIR/$SUBFOLDER/ +    svn_copy $NEW_REPOS/`strip_pkg_ext $PKG_NAME`.meta $NOARCH_DIR/$SUBFOLDER/ +    svn_copy $NEW_REPOS/`basename $PKG_NAME`.asc $NOARCH_DIR/$SUBFOLDER/ +    svn_copy $NEW_REPOS/$PACKAGE.slack-required $NOARCH_DIR/$SUBFOLDER/ +    update_metadata $NOARCH_DIR +    svn_remove_empty_folders $NOARCH_DIR +  fi + +  # Install package +  if [ "$INSTALL" -eq $on ]; then +    upgradepkg --install-new $NEW_REPOS/$PKG_NAME +  fi + +  echo "Package saved at $NEW_REPOS/$PKG_NAME" + +  if [ $PACKAGES_REPOS_NOARCH -eq $on ] && [ "`package_arch $PKG_NAME`" == "noarch" ]; then +    echo "Aditional copy saved at $NOARCH_DIR/$SUBFOLDER/$PKG_NAME" +  fi + +  return $EXIT_CODE + +} + +function build_queue { + +  # createpkg's build queue +  # usage: build_queue <package1> ... <packageN> + +  local unable_to_install last_status built=0 total=0 + +  if [ -z "$1" ]; then +    return +  fi + +  for PACKAGE in $*; do +    create_package +    last_status="$?" +    let total++ +    if [ "$last_status" != "0" ]; then +      unable_to_install="$unable_to_install\n\t`echo $PACKAGE | sed -e 's/\\\+/\+/'`" +    else +      let built++ +    fi +  done + +  if [ ! -z "$unable_to_install" ] && [[ $total > 1 ]]; then +    eecho $messag "$BASENAME: done building $built of $total requested SlackBuilds." +    eecho $messag "$BASENAME: unable to create the following packages:" +    echo -e "$unable_to_install" +  fi + +  # Fix possible $TMP removal +  mkdir -p $TMP + +  # Fix $TMP user +  if [ ! -z "$TMP_USER" ]; then +    chown $TMP_USER $TMP +  fi + +  # Fix $TMP group +  if [ ! -z "$TMP_GROUP" ]; then +    chgrp $TMP_GROUP $TMP +  fi + +  # Exit with last build package exit status +  exit $last_status + +} + +#--------------------------------------------------- +#                 Starting createpkg +#--------------------------------------------------- +# Common functions +COMMON="/usr/libexec/simplepkg/common.sh" +SIMPLEPKG_CONF="/etc/simplepkg/simplepkg.conf" +BASENAME="`basename $0`" +EXIT_CODE=0 + +if [ -f "$COMMON" ]; then +  source $COMMON +else +  echo "error: file $COMMON found, check your $BASENAME installation" +  exit 0 +fi + +set_constants + +# Load simplepkg.conf variables +load_parameters + +# Loading error codes +error_codes + +# 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_MODE + +# 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_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + +INSTALL=$off +NO_DEPS=$off +DEBUG=$off + +case $1 in +  '--all'|'-a') +    # build all SlackBuilds in repository +    build_all_slackbuilds +    exit $EXIT_CODE +  ;; +  '--search'|'-s') +    if [ $# -ne 2 ]; then +      list_slackbuilds +    else +      LIST=`find_slackbuild $2` +      if [ -z $LIST ]; then +        EXIT_CODE=1 +      else +        for i in $LIST; do +          echo $i #| sed 's/.*\/\([^\/]\+\)\.[Ss]lack[Bb]uild$/  \1/' +        done +      fi +    fi +    exit $EXIT_CODE +  ;; +  '--info'|'-f') +    [ $# -ne 2 ] && usage   # two parameters is required +    PKG_PATH=`find_slackbuild $2` +    info_builds +    exit $EXIT_CODE +  ;; +  '--install'|'-i') +    [ $# -ne 2 ] && usage   # two parameters is required +    shift +    PACKAGE="$1" +    INSTALL=$on +    build_queue $* +  ;; +  '--no-deps'|'-nd') +    [ $# -ne 2 ] && usage   # two parameters is required +    shift +    NO_DEPS=$on +    PACKAGE="$1" +    build_queue $* +  ;; +  '--debug'|'-d') +    [ $# -ne 2 ] && usage   # two parameters is required +    shift +    PACKAGE="$1" +    DEBUG=$on +    build_queue $* +  ;; +  '--sync') +    sync_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN +    exit $EXIT_CODE +  ;; +  '--help'|'-h'|'') +    usage +    exit $EXIT_CODE +  ;; +  '--list'|'-l') +    list_slackbuilds +    exit $EXIT_CODE +  ;; +  '--update') +    repository_update $PACKAGES_DIR +    repository_update $NOARCH_DIR +    exit $EXIT_CODE +  ;; +  '--commit') +    shift +    commit_changes $PACKAGES_DIR "`basename $PACKAGES_DIR:`" $* +    if [ $PACKAGES_REPOS_NOARCH -eq $on ]; then +      commit_changes $NOARCH_DIR "noarch:" $* +    fi +    exit $EXIT_CODE +  ;; +  '--status') +    repository_status +    exit $EXIT_CODE +  ;; +  '--import') +    shift +    binary_repository_import $* +    exit $EXIT_CODE +  ;; +  '--checkout') +    shift +    repository_checkout $* +    exit $EXIT_CODE +  ;; +  '--update-keyring') +    get_sign_user +    repo_gpg_key $PACKAGES_DIR --update +    if [ $PACKAGES_REPOS_NOARCH -eq $on ]; then +      repo_gpg_key $NOARCH_DIR --update +    fi +    exit $EXIT_CODE +  ;; +  '--list-packages') +    shift +    list_packages $* +    exit $EXIT_CODE +  ;; +  '--sign') +    shift +    sign_package $* +    exit $EXIT_CODE +  ;; +  '--remove') +    shift +    remove_package $* +    exit $EXIT_CODE +  ;; +  *) +    if [ "${1:0:1}" != "-" ]; then +      build_queue $* +    else +      usage +    fi +  ;; +esac diff --git a/src/jail-commit b/src/jail-commit new file mode 100755 index 0000000..60e0a36 --- /dev/null +++ b/src/jail-commit @@ -0,0 +1,175 @@ +#!/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_files`" ]; then +    return 1 +  fi + +  echo "" > `template_perms`.tmp +  cd `template_files` + +  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 -u $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`" + +      # secure the file +      chown root.root `template_files`/$file +      chmod $perms `template_files`/$file +       +      echo "$file;$owner;$group;$perms" >> `template_perms`.tmp + +    else +      if [ ! -e "$1/$file" ]; then +        echo $BASENAME: warning: missing file `slash $1/$file` +      fi +    fi + +  done + +  cat `template_perms`.tmp | sed '/^$/d' > `template_perms` +  rm -f `template_perms`.tmp + +  if templates_under_svn && ! svn_check `template_perms`; then +    svn add `template_perms` +  fi + +} + +function template_svn_commit { + +  # issue a svn_commit from a template folder +  # usage: template_svn_commit <template-folder> + +  if templates_under_svn && svn_folder $1; 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_files`" ] || [ -a "`template_packages`" ]; 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/src/jail-update b/src/jail-update new file mode 100755 index 0000000..ce2d165 --- /dev/null +++ b/src/jail-update @@ -0,0 +1,62 @@ +#!/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 +update_jail_packages $1 +copy_template_files $1 +set_jail_perms $1 + diff --git a/src/lspkg b/src/lspkg new file mode 100755 index 0000000..c5e4ec8 --- /dev/null +++ b/src/lspkg @@ -0,0 +1,148 @@ +#!/bin/bash +# +# lspkg v0.4: 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" +PKG_LIST_DIR="var/log/packages" + +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 <package_name> +            view installed package contents +   -p, --print <package_name> +            print the contents of a package file +   -r, --remove <package_name> +            remove matching packages +   -s, --search <file_name> +            search a file under installed packages +   -d, --description <package_name> +            show matching packages' descriptions +" +} + +# ----------------------------------------------------- +#                       lspkg +# ----------------------------------------------------- + +if [ $# -eq 2 ]; then +  pack=$2 +elif [ $# -eq 1 ]; then +  pack=$1 +else +  pack="" +fi + +if [ ! -z "$pack" ]; then +  if echo $pack | grep -q "*"; then +    LIST_PKGS="`ls -1 /$ROOT/$PKG_LIST_DIR/$pack 2> /dev/null`" +  else +    pack="`echo $pack | sed -e 's/\+/\\\+/'`" +    LIST_PKGS=`eval "ls -1 /$ROOT/$PKG_LIST_DIR/ 2> /dev/null | grep -E '^$pack-[^-]+-[^-]+-[^-]+$'"` +  fi +else +  LIST_PKGS="`ls /$ROOT/$PKG_LIST_DIR/ 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 /$PKG_LIST_DIR/$file +                done +            else +                if [ ! -z "$ROOT" ]; then +                    echo "$2: package not found on /$ROOT/$PKG_LIST_DIR" +                    exit 1 +                else +                    echo "$2: package not found on /$PKG_LIST_DIR" +                    exit 1 +                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/$PKG_LIST_DIR/$1-[0-9]* +            fi +        fi +    ;; +    "-s"|"--search") +        if [ ! -z "$2" ]; then +            eval "grep -l '\/$2$' /$ROOT/$PKG_LIST_DIR/*" +        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/$PKG_LIST_DIR" +                exit 1 +            else +                echo "$1: package not found on /$PKG_LIST_DIR" +                exit 1 +            fi +        fi +    ;; +esac + diff --git a/src/mkbuild b/src/mkbuild new file mode 100755 index 0000000..9be4a16 --- /dev/null +++ b/src/mkbuild @@ -0,0 +1,1904 @@ +#!/bin/bash +# +# mkbuild: SlackBuild script maker +# feedback: rudsonaalves at yahoo.com.br +# +#  mkbuild 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. +# +#  mkbuild 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 +# +# Based in model generic.SlackBuild from Luis +# Version $Rev$ - $Author$ +# + +#-------------------------------------------------------------------- +# Functions +#-------------------------------------------------------------------- + +function mkbuild_use { + +  # mkbuild help function +  echo -e "${red}NAME${normal} +        mkbuild - create SlackBuild script from ${green}.mkbuild${normal} input file + +${red}SYNOPSIS +        mkbuild${normal} [${green}OPTIONS${normal}] [${green}mkbuild_file${normal}] + +${red}DESCRIPTION${normal} +        [${green}mkbuild_file${normal}] input file with build rules and variables + +        Input ${green}OPTIONS${normal}: +            ${red}-a${normal}, ${red}--author${normal} ${green}<author_name>${normal} +                author name +            ${red}-ai${normal}, ${red}--author_initials${normal} ${green}<initials>${normal} +                author signature +            ${red}-bn${normal}, ${red}--build-number${normal} +                change build number +            ${red}-cs${normal}, ${red}--const_string${normal} ${green}<string>${normal} +                construction string to source name +            ${red}-j${normal}, ${red}--jobs${normal} ${green}<jobs_number>${normal} +                Number of jobs to run simultaneously +            ${red}-md${normal}, ${red}--model${normal} ${green}<SlackBuild_model>${normal} +                SlackBuild model file +            ${red}-npss${normal}, ${red}--nps-strip${normal} +                Number of prefix slashes to strip +            ${red}-pf${normal}, ${red}--patch-files${normal} +                List of patch files +            ${red}-pn${normal}, ${red}--pkg_name${normal} ${green}<package_name>${normal} +                package name +            ${red}--prefix${normal} <install_dir>${normal} +                Prefix install directory +            ${red}-pv${normal}, ${red}--pkg_version${normal} ${green}<version>${normal} +                package version +            ${red}-sn${normal}, ${red}--src_name${normal} ${green}<source_name>${normal} +                source name +            ${red}-u${normal}, ${red}--url${normal} ${green}<url_address>${normal} +                url address to source + +        Program options: +        ${red}-d${normal}, ${red}--debug${normal} +            enable debug mode +        ${red}-ss${normal}, ${red}--submit-slackbuild${normal} +            submit SlackBuilds in local svn SlackBuild tree +        ${red}-sm${normal}, ${red}--submit-mkbuild${normal} +            submit .mkbuild in local svn mkbuild tree +        ${red}-sa${normal}, ${red}--submit-all${normal} +            submit SlackBuild and .mkbuild files in local svn tree +        ${red}-cs${normal}, ${red}--commit-slackbuild${normal} +            commit SlackBuilds in svn SlackBuild tree +        ${red}-cm${normal}, ${red}--commit-mkbuild${normal} +            commit .mkbuild in svn mkbuild tree +        ${red}-ca${normal}, ${red}--commit-all${normal} +            commit SlackBuild and .mkbuild files in svn tree +        ${red}-im${normal}, ${red}--import-mkbuilds${normal} +            import mkbuild repository in a svn tree +        ${red}-is${normal}, ${red}--import-slackbuilds${normal} +            import SlackBuild repository in a svn tree +        ${red}-ia${normal}, ${red}-i${normal}, ${red}--import-all${normal}, ${red}--import${normal} +            import mkbuild and SlackBuild repositories in a svn tree +        ${red}--status${normal} +            print mkbuild and SlackBuild svn repositories status +        ${red}-ls${normal}, ${red}--list${normal} +            list mkbuild folder contents +        ${red}-h${normal}, ${red}--help${normal} +            this help mesage +        ${red}-n${normal}, ${red}--new${normal} ${green}<mkbuild_name>${normal} +            start a new mkbuild configure file +        ${red}-s${normal}, ${red}--search${normal} ${green}<mkbuild_name>${normal} +            search for a ${green}<mkbuild_name>${normal} file +        ${red}--sync${normal} +            synchronize mkbuilds repository +        ${red}-v${normal}, ${red}--version${normal} +            program version +        ${red}-V${normal}, ${red}--verbose${normal} +            print debug information +        ${red}-e${normal}, ${red}--edit${normal} +            edit a mkbuild +        ${red}-um${normal}, ${red}--update-manifest${normal} +            update manifest file +        ${red}-wc${normal}, ${red}--working-copy${normal} +            create an unversioned mkbuild working copy +        ${red}--get-param-copy${normal} +            get a parameter from a given mkbuild + +${red}EXAMPLES${normal} +        ${red}mkbuild -sa pyrex.mkbuild${normal} +            build pyrex.SlackBuild and submit .mkbuild and .SlackBuild in +            Slack.Sarava local tree. +        ${red}mkbuild -a \"Jose Araujo\" -ai \"ja\" -n pyrex${normal} +            make a basic pyrex.mkbuild with author name \"Jose Araujo\" and +            author signature \"ja\". +        ${red}mkbuild --prefix /usr/local pyrex.mkbuild${normal} +            build pyrex.SlackBuild with prefix /usr/local and pyrex.mkbuild +            variables and options definitions. + +${red}AUTHOR${normal} +        Written by ${blue}Rudson R. Alves${normal} + +${red}AVAILABILITY${normal} +        by svn: ${yellow}svn checkout http://slack.sarava.org/simplepkg${normal} + +${red}REPORTING BUGS${normal} +        Report bugs to <${blue}rudsonaalves[at]rra.etc.br${normal}> + +${red}COPYRIGHT${normal} +        Copyright © 2006 Free Software Foundation, Inc. +        This is free software. You may redistribute copies of it under the +        terms of the GNU General Public License +        <${yellow}http://www.gnu.org/licenses/gpl.html${normal}>. There is NO WARRANTY, +        to the extent permitted by law." +} + +function set_parameters { + +  # Get and set mkbuild variables with parameters input +  # Use: set_parameters $@ +  #           where $@ are the parameters input +  # +  # Parameter evaluation +  ACTION="build" + +  local search match + +  while [ "$1" ]; do +    case $1 in +      '-bn'|'--build-number') +        # Build Number +        BUILD_NUMBER=$2 +        is_number $BUILD_NUMBER || handle_error "$ERROR_NOT_NUMBER" "--build-number" +        shift +      ;; +      '-ss'|'--submit-slackbuild') +        # Submit SlackBuild file +        SUBMIT_SLACKBUILD=$on +      ;; +      '-sm'|'--submit-mkbuild') +        # Submit mkbuild file +        SUBMIT_MKBUILD=$on +      ;; +      '-sa'|'--submit-all') +        # Submit SlackBuild and mkbuild file +        SUBMIT_SLACKBUILD=$on +        SUBMIT_MKBUILD=$on +      ;; +      '-cs'|'--commit-slackbuild') +        # Commit SlackBuild file +        ACTION="commit_slackbuild" +        set_mkbuild_name $2 +        break # we need to break otherwise commit log message is evalued +      ;; +      '-cm'|'--commit-mkbuild') +        # commit mkbuild file +        ACTION="commit_mkbuild" +        set_mkbuild_name $2 +        break # we need to break otherwise commit log message is evalued +      ;; +      '-ca'|'--commit-all') +        # Commit SlackBuild and mkbuild file +        ACTION="commit_all" +        set_mkbuild_name $2 +        break # we need to break otherwise commit log message is evalued +      ;; +      '-is'|'--import-slackbuilds') +        # Import SlackBuilds +        ACTION="import_slackbuilds" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-im'|'--import-mkbuilds') +        # Import mkbuilds +        ACTION="import_mkbuilds" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-ia'|'-i'|'--import-all'|'--import') +        # Import SlackBuilds and mkbuilds +        ACTION="import_all" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-ds'|'--delete-slackbuild') +        # Delete SlackBuild +        ACTION="delete_slackbuild" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-dm'|'--delete-mkbuild') +        # Delete mkbuild +        ACTION="delete_mkbuild" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-da'|'--delete-all') +        # Delete mkbuild and SlackBuild +        ACTION="delete_all" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '--status') +        # Repository status +        ACTION="status" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-ls'|'--list') +        # List mkbuild folder contents +        ACTION="list" +        set_mkbuild_name $2 +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-um'|'--update-manifest') +        ACTION="update_manifest" +        set_mkbuild_name $2 +        SOURCE_FILE="$3" +        shift 2 +      ;; +      '-n'|'--new') +        # New mkbuild configure file +        set_mkbuild_name $2 +        ACTION="new" +        shift +      ;; +      '-s'|'--search') +        # Search for a mkbuild file +        set_mkbuild_name $2 +        ACTION='search' +      ;; +      '-e'|'--edit') +        # Open mkbuild with $EDITOR +        set_mkbuild_name $2 +        ACTION='edit' +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-wc'|'--working-copy') +        # Create an unversioned mkbuild working copy +        set_mkbuild_name $2 +        ACTION='working_copy' +        break # we need to break otherwise specific arguments are evalued +      ;; +      '--get-param') +        # Get parameter for a given mkbuild +        set_mkbuild_name $2 +        ACTION='get_param' +        break # we need to break otherwise specific arguments are evalued +      ;; +      '-d'|'--debug') +        # Debug mode +        set -x +      ;; +      '-h'|'--help' ) +        # Show help mesage +        mkbuild_use && exit 0 +      ;; +      '--sync' ) +        # Synchronize mkbuilds repository +        mkbuild_update_keyring +        sync_svn_repo $MKBUILDS_DIR $MKBUILDS_SVN +        exit $? +      ;; +      '-v'|'--version') +        # Show program version +        eecho $normal "\n$BASENAME version $PROG_VERSION\n" +      ;; +      '-V' | '--verbose') +        # Enable verbose mode +        VERBOSE=1 +      ;; +      '-a'|'--author') +        # Enter with author name +        AUTHOR=$2 +        [ ${AUTHOR:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR AUTHOR +        shift +      ;; +      '-ai'|'--author_initials') +       # Enter with author name +       AUTHOR_INITIALS=$2 +       [ ${AUTHOR_INITIALS:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR AUTHOR_INITIALS +       shift +      ;; +      '-cs'|'--const_string') +        # Enter with construction source name string +        CONST_STRING=$2 +        [ ${CONST_STRING:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR CONST_STRING +        shift +      ;; +      '-md'|'--model') +        # Enter with SlackBuild model +        MODEL=$2 +        [ ${MODEL:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR MODEL +        shift +      ;; +      '-j'|'--jobs') +        # Enter with SlackBuild model +        NUMJOBS=$2 +        [ ${NUMJOBS:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR NUMJOBS +        ! is_number $NUMJOBS &&  handle_error $ERROR_NOT_NUMBER NUMJOBS +        NUMJOBS="-j$NUMJOBS" +        shift +      ;; +      '--prefix') +        # Enter with SlackBuild model +        PREFIX=$2 +        [ ${PREFIX:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR PREFIX +        shift +      ;; +      '-pn'|'--pkg_name') +        # Enter with package name +        PKG_NAME=$2 +        [ ${PKG_NAME:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR PKG_NAME +        shift +      ;; +      '-pv'|'pkg_version') +        # Enter with package version +        VERSION=$2 +        [ ${VERSION:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR VERSION +        shift +      ;; +      '-sn'|'--src_name') +        # Enter with source name +        SRC_NAME=$2 +        [ ${SRC_NAME:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR SRC_NAME +        shift +      ;; +      '-u'|'--url') +        # Enter with url address +        URL=$2 +        [ ${URL:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR URL +        shift +      ;; +      '-pf'|'--patch-files') +        # Path files list +        PATCH_FILES=$2 +        [ ${PATCH_FILES:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR PATCH_FILES +        shift +      ;; +      '-npss'|'--nps-strip') +        # Number of prefix slashes to strip +        NPS_STRIP=$2 +        [ ${NPS_STRIP:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR NPS_STRIP +        shift +      ;; +      *) +        # mkbuild input file +        set_mkbuild_name $1 +      ;; +    esac +    shift +  done + +  if [ "${MKBUILD_NAME:0:1}" == "-" ]; then +    echo "Invalid mkbuild name $MKBUILD_NAME" +    exit 1 +  fi + +  if [ ! -e "$MKBUILD_NAME" ] && [ "$ACTION" != "search" ] &&  [ "$ACTION" != "status" ]; then + +    search="`search_mkbuild`" + +    if [ ! -z "$search" ]; then +      for match in $search; do +        MKBUILD_NAME="$match" +        WORK="`dirname $match`" +        break +      done +    else +      if [ "$ACTION" == "build" ]; then +        ACTION='new' +      fi +    fi + +  fi + +  MKBUILD_NAME="${MKBUILD_NAME//.mkbuild}.mkbuild" +  MKBUILD_BASENAME="`basename $MKBUILD_NAME .mkbuild`" + +} + +function get_variable { + +  # Get variable value from mkbuild file (MKBUILD_NAME) +  [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER +  [ -z $MKBUILD_NAME ] && echo "Warning: no [mkbuild_file]." && return 0 + +  sed -n '1,/^#>>/ p' $MKBUILD_NAME | grep "^\[\[${1}\]\]" | tail -n 1 | cut -f2- -d= | sed -e 's/^"//' -e 's/"$//' + +} + +function edit_file { + +  # Edit file  $3, by change string [[$1]] to $2 +  [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + +  eval "sed -i 's¦\[\[$1\]\]¦$2¦g' $3" + +} + +function edit_file_full { + +  # Edit file  $3, by change string $1 to $2 +  [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + +  eval "sed -i 's¦$1¦$2¦' $3" + +} + +function start_build  { + +  # Build initial sections +  [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER + +  edit_file "SLACKBUILD AUTHOR" "$AUTHOR" $1 +  edit_file "SLACKBUILD AUTHOR INITIALS" "$AUTHOR_INITIALS" $1 +  edit_file "SOURCE NAME" "$SRC_NAME" $1 +  edit_file "PROGRAM NAME" "$PKG_NAME" $1 +  edit_file "PACKAGE NAME" "$PKG_NAME" $1 +  edit_file "DECOMPRESSOR" "$DECOMPRESSOR" $1 +  edit_file "DECOMPRESSOR TEST FLAG" "$DECOMPRESSOR_TEST_FLAG" $1 +  edit_file "PROGRAM URL" "$URL" $1 +  if [ "$ARCH" == "noarch" ]; then +    sed -i 's/^ARCH=.*$/ARCH="noarch"/' $1 +  else +    edit_file "ARCH" "$ARCH" $1 +  fi +  edit_file "NUMBER OF JOBS" "$NUMJOBS" $1 +  edit_file "VERSION" "$VERSION" $1 +  edit_file "SOURCE NAME CONSTRUCTION STRING" "$CONST_STRING" $1 +  edit_file "EXTENSION" "$EXTENSION" $1 +  edit_file "MKBUILD COMPRESS" "$MKBUILD_COMPRESS" $1 +  edit_file "DOWNLOAD FOLDER URL" "$URL_BASE" $1 +  edit_file "OTHER CONFIGURE ARGS" "$OPTIONS" $1 +  edit_file "DOCUMENTATION FILES" "$DOCFILES" $1 +  edit_file "PREFIX" "$PREFIX" $1 +  edit_file "UNPACKER" "$UNPACKER" $1 +  edit_file "UNPACKER FLAGS" "$UNPACKER_FLAGS" $1 +  edit_file "BUILD NUMBER" "$BUILD_NUMBER" $1 +  edit_file "PATCH FILES" "$PATCH_FILES" $1 +  edit_file "NUMBER OF PREFIX SLASHES TO STRIP" "$NPS_STRIP" $1 + +  edit_file_full "\$EXTENSION" "$EXTENSION" $1 + +} + +function clear_files { + +  # Remove temporary files +  [ ! -z $AUX_TMP ] && rm $AUX_TMP 2>/dev/null +  [ ! -z $SLACKBUILD_TEMP ] && rm $SLACKBUILD_TEMP 2>/dev/null +  [ ! -z $DIFF_FILE ] && rm $DIFF_FILE 2>/dev/null +  if [ "`ls $TMP/`" == "" ]; then +    rm -rf $TMP +  fi +  chmod 755 *.SlackBuild 2>/dev/null + +} + +function set_status { + +  # Set status section +  # $1 - Section +  # $2 - Status +  # $3 - file +  [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER +  if [ "`get_status $1 $3`" != "all" ]; then +    verbose "Section $1 $2" +    eval "sed -i 's/^<$1>.*$/<$1> $2/' $3" +  else +    echo "Warning: Section $1 have status all. Can't change!" +  fi + +} + +function get_status { + +  # Get status from section +  # $1 - Section +  # $2 - file +  [ $# -ne 2 ] && handle_error $ERROR_PAR_NUMBER +  eval "sed '/^<$1>.*$/! d' $2" + +} + +function get_mkbuild_status { + +    # Get status from mkbuild file +    # $1 section +    eval "sed '/^#>>/,/<</ ! d; /^#/ d; /: *$1$/! d; s/^ *\(.*\):.*$/\1/' $MKBUILD_NAME" +} + +function activate_sections { + +  # Enable and disable sections +  ACTIONS_LIST=`sed '/^#>>/,/<</ ! d; /^#/ d ' $MKBUILD_NAME | tr -d ' '` +  for i in $ACTIONS_LIST; do +    STATUS=`echo $i | cut -f1 -d:` +    SECTION=`echo $i | cut -f2 -d:` +    set_status $SECTION $STATUS $SLACKBUILD_TEMP +  done + +} + +function build_slackbuild { + +  # Clean SlackBuild +  # Make SlackBuild backup +  [ -e $SLACKBUILD ] && mv $SLACKBUILD $SLACKBUILD.old +  # Remove off sections +  sed -i '/^<[a-z].*> off/, /^<\/[a-z].*>$/ d' $SLACKBUILD_TEMP +  # Remove sections names +  sed -i '/^<.*$/ d' $SLACKBUILD_TEMP +  # Remove clear lines +  # isto pode ser feito com "cat -s SLACKBUILD_TEMP ..." +  #sed -i ':i ; $! N; s/\n/Ø/ ; t i ; s/Ø\{3,\}/ØØ/g ; s/Ø/\n/g' $SLACKBUILD_TEMP +  cat -s $SLACKBUILD_TEMP > $SLACKBUILD +  # Remove from frist line do #!/... line +  #sed '1,/^#\!/ {/^#\!/ b; d }' $SLACKBUILD_TEMP > $SLACKBUILD +  sed -i '1,/^#\!/ {/^#\!/ b; d }' $SLACKBUILD + +} + +function section_edit { + +  # Edits a section substituting its content +  [ -z $MKBUILD_NAME ] && return 0 + +  SECTION_LIST=`grep '^#>[a-z]' $MKBUILD_NAME | cut -c3-` + +  # Check for sections change +  [ -z "$SECTION_LIST" ] && return 0 + +  # Change sections +  for i in $SECTION_LIST; do +    verbose "Change section $i" +    if [ "$i" = "slackdesc" ]; then +      # Special slackdesc section +      slackdesc_edit > $AUX_TMP +      mv $AUX_TMP $SLACKBUILD_TEMP +    else +      # Others sections +      section_change $i +    fi +  done + +} + +function slackdesc_edit { + +  # Edit slackdesc section +  sed -n '1,/|-----/ { /<slackdesc>/ b; /|-----/ b; p; }' $SLACKBUILD_TEMP +  echo -n $PKG_NAME | tr [a-z+\-] " " +  echo -n "|-----handy-ruler" +  let N=18+${#PKG_NAME} +  for i in `seq $N $SLACKDESC_LEN`; do +    echo -n "-" +  done +  echo -en "|\n" + +  sed -n '/#>slackdesc/,/#<slackdesc/ { /^#/ b; p }' $MKBUILD_NAME +  sed '1, /\[\[SLACK-DESC\]\]/ d' $SLACKBUILD_TEMP + +} + +function section_change { + +  # Change section lines +  [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER + +  # Copy first half +  eval "sed '1,/^<$1>/! d' $SLACKBUILD_TEMP > $AUX_TMP" +  # Paste new section +  eval "sed -n '/#>$1/,/#<$1/ { /^#>/ b; /^#</ b; p }' $MKBUILD_NAME >> $AUX_TMP" +  # Copy second halt +  eval "sed '/^<\/$1>/,$ ! d' $SLACKBUILD_TEMP >> $AUX_TMP" + +  mv $AUX_TMP $SLACKBUILD_TEMP + +} + +function make_slack_required { + +  # Build slack-required file +  [ -e $WORK/slack-required ] && mv $WORK/slack-required $WORK/slack-required.old +  [ -z "$SLACK_REQUIRED" ] && return 0 + +  echo -e "# Dependency list to $SRC_NAME\n#\n# dependency [condition] [version]]" > $WORK/slack-required + +  echo $SLACK_REQUIRED | sed 's/:/\n/g' | while read i; do +    REQ=`echo $i | awk '{ print $1 }'` +    CON=`echo $i | awk '{ print $2 }'` +    VER=`echo $i | awk '{ print $3 }'` +    echo -e "$REQ\t\t$CON\t\t$VER" >> $WORK/slack-required +  done + +} + +function change_other_parameters { + +  # Change other parameters started by '[[' in .mkbuild file +  sed '1,/#>>/ ! d' $MKBUILD_NAME | grep -v '^#' | grep '^\[\[[A-Za-z]' | \ +  while read i; do +    CHANGE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\1/'`" +    VALUE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\2/'`" +    edit_file "$CHANGE" "$VALUE" $SLACKBUILD +  done + +} + +function get_slackbuild_path { + +  # Search for SlackBuild Path in order: +  #   - command line parameter; +  #   - mkbuild parameters file; +  #   - SlackBuild tree; +  #   - Gentool-portage internet tree; +  #   - default path (others/unclassified/$PKG_NAME). + +  # Start AUX_PATH with command line parameter +  AUX_PATH="$SLACKBUILD_PATH" + +  # Get in mkbuild +  [ -z "$AUX_PATH" ] && AUX_PATH=`validate_parameter "$SLACKBUILD_PATH" "SLACKBUILD PATH" ""` + +  # SlackBuild path in SlackBuild tree +  [ -z "$AUX_PATH" ] && AUX_PATH=`cd $SLACKBUILDS_DIR && find . -name $SLACKBUILD | sed -e 's/^\.\///' | xargs dirname 2>/dev/null` + +  # SlackBuild path default +  [ -z "$AUX_PATH" ] && AUX_PATH="others/unclassified/$PKG_NAME" + +  # Down case SlackBuild path +  eval "echo $AUX_PATH" | tr [A-Z] [a-z] + +} + +function apply_mkpatch { + +  # Apply mkpatch if exist +  sed -n '/#p>/,/#p</ { /^#/ b; p }' $MKBUILD_NAME > $DIFF_FILE +  if [ -s $DIFF_FILE ]; then +    mkpatch $DIFF_FILE $SLACKBUILD_TEMP > $AUX_TMP || handle_error $? +    [ ! -s $AUX_TMP ] && handle_error 1 +    cp $AUX_TMP $SLACKBUILD_TEMP +    [ $VERBOSE -eq $on ] && ( echo -e "\nApply mkpath ..."; cat $DIFF_FILE ) +  fi + +} + +# ---------------------------------------------------------------- +#                     svn functions +# ---------------------------------------------------------------- + +function submit_slackbuild { + +  # Submit SlackBuild in local Slack.Sarava tree +  echo -e "\nSubmiting $SLACKBUILD" + +  local candidate oldplace + +  # check SlackBuilds directory +  [ ! -e $SLACKBUILDS_DIR ] && createpkg --sync + +  # change to SlackBuilds directory +  cd $SLACKBUILDS_DIR/ + +  # Add SlackBuild scripts +  # check path +  [ ! -e $SLACKBUILD_PATH ] && svn_mkdir $SLACKBUILD_PATH + +  # add SlackBuild +  svn_copy $WORK/`basename $SLACKBUILD` $SLACKBUILD_PATH + +  # check and add slack-required +  [ -e $WORK/slack-required ] && svn_copy $WORK/slack-required $SLACKBUILD_PATH + +  for i in `ls $WORK | grep -E -v '(SlackBuild|old|slack-required|.mkbuild$|.tmp$)\*{0,1}$'`; do +    svn_copy $WORK/$i $SLACKBUILD_PATH +  done + +  # remove stuff in old places +  for candidate in $(find . -name $(basename $SLACKBUILD)); do +    oldplace="`dirname $candidate | sed -e 's/^\.\///'`" +    if [ "$oldplace" != "$SLACKBUILD_PATH" ]; then +      echo "Removing SlackBuild found at old path $oldplace" +      svn_del $oldplace +    fi +  done + +  if [ "$SIGN_MANIFESTS" -eq $on ]; then +    repo_gpg_key $SLACKBUILDS_DIR +  fi + +  cd $WORK + +} + +function submit_mkbuild { + +  # Submit mkbuild in local mkbuild Slack.Sarava tree +  echo -e "\nSubmiting $MKBUILD_NAME" + +  local candidate oldplace + +  # Check mkbuild directory +  [ ! -d $MKBUILDS_DIR ] && build_svn_repo $MKBUILDS_DIR $MKBUILDS_SVN + +  # Get mkbuild path in parameter file +  MKBUILD_PATH=$SLACKBUILD_PATH + +  # Change to mkbuilds directory +  cd $MKBUILDS_DIR/ + +  # Check path +  [ ! -e $MKBUILD_PATH ] && svn_mkdir $MKBUILD_PATH + +  # Add relevant files +  for i in `ls $WORK | grep -E -v '(SlackBuild|old|slack-required|.tmp$)\*{0,1}$'`; do +    if [ "`basename $i`" != "$DIST_SRC_NAME" ]; then +      if ! is_the_same $MKBUILD_PATH $WORK; then +        svn_copy $WORK/$i $MKBUILD_PATH +      else +        svn_add $WORK/$i +      fi +    fi +  done + +  # Remove stuff in old places +  for candidate in $(find . -name $(basename $MKBUILD_NAME)); do +    oldplace="`dirname $candidate | sed -e 's/^\.\///'`" +    if [ "$oldplace" != "$MKBUILD_PATH" ]; then +      echo "Removing mkbuild found at old path $oldplace" +      svn_del $oldplace +    fi +  done + +  submit_cleanup + +  cd $WORK + +} + +function submit_cleanup { + +  # Remove files that should not be stored at the mkbuilds repository +  if is_the_same $MKBUILD_PATH $WORK; then +    ( +      cd $WORK +      rm -f *.old *.tmp *.SlackBuild slack-required $DIST_SRC_NAME +    ) +  fi + +} + +function import_mkbuilds { + +  # import mkbuilds into a subversion repository +  # usage: repository_import [repository] + +  local repository="$1" + +  if [ -z "$repository" ]; then +    repository="file:////var/svn/mkbuilds" +  fi + +  repository_import $MKBUILDS_DIR $repository + +} + +function import_slackbuilds { + +  # import SlackBuilds into a subversion repository +  # usage: repository_import [repository] + +  local repository="$1" + +  if [ -z "$repository" ]; then +    repository="file:////var/svn/slackbuilds" +  fi + +  repository_import $SLACKBUILDS_DIR $repository + +} + +function repository_status { + +  local cwd + +  if svn_folder $MKBUILDS_DIR; then +    echo "Status of $MKBUILDS_DIR." +    cwd="`pwd`" +    cd $MKBUILDS_DIR && su_svn status +    cd $cwd +  fi + +  if svn_folder $SLACKBUILDS_DIR; then +    cwd="`pwd`" +    echo "Status of $SLACKBUILDS_DIR." +    cd $SLACKBUILDS_DIR && su_svn status +    cd $cwd +  fi + +  exit 0 + +} + +# ---------------------------------------------------------------- +#                     general functions +# ---------------------------------------------------------------- + +function validate_parameter { + +  # Validate parameter in .mkbuild file +  [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + +  if [ ! -z "$1" ]; then +    echo "$1" +  else +    local STRING="`get_variable "$2"`" +    if [ ! -z "$STRING" ]; then +      echo "$STRING" +    else +      echo "$3" +    fi +  fi + +} + +function decompress_find { + +  # Find decompressor program and test flag +  case $EXTENSION in +    'gz'|'GZ') +      DECOMPRESSOR="gunzip" +      DECOMPRESSOR_TEST_FLAG="-t" +    ;; +    'bz2'|'BZ2') +      DECOMPRESSOR="bunzip2" +      DECOMPRESSOR_TEST_FLAG="-t" +    ;; +    'zip'|'ZIP') +      DECOMPRESSOR="unzip" +      DECOMPRESSOR_TEST_FLAG="-t" +    ;; +    *) +    handle_error $ERROR_MKBUILD_CONSTRUCTION "DECOMPRESSOR" +    ;; +  esac + +} + +function load_parameters { + +  # Load Createpkg parameters +  SOURCE_DIR="`eval_parameter SOURCE_DIR /var/simplepkg/sources`" +  SLACKBUILDS_DIR="`eval_parameter SLACKBUILDS_DIR /var/simplepkg/slackbuilds`" +  [ ! -d $SLACKBUILDS_DIR ] && mkdir -p $SLACKBUILDS_DIR + +  MKBUILDS_DIR="`eval_parameter MKBUILDS_DIR /var/simplepkg/mkbuilds`" +  [ ! -d $SLACKBUILDS_DIR ] && mkdir -p $SLACKBUILDS_DIR + +  SLACKBUILDS_SVN="`eval_parameter SLACKBUILDS_DIR http://slack.sarava.org/slackbuilds`" +  MKBUILDS_SVN="`eval_parameter MKBUILDS_SVN http://slack.sarava.org/mkbuilds`" +  SVN_USER="`eval_parameter MKBUILDS_SVN_USER`" +  SVN_GROUP="`eval_parameter MKBUILDS_SVN_GROUP`" + +  COLOR_MODE="`eval_parameter COLOR_MODE none`" +  TMP="`eval_parameter TMP /tmp`" +  [ ! -e $TMP ] && mkdir -p $TMP + +  MKBUILD_COMPRESS="`eval_parameter MKBUILD_COMPRESS tgz`" +  MKBUILD_AUTHOR="`eval_parameter MKBUILD_AUTHOR`" +  MKBUILD_AUTHOR_INITIALS="`eval_parameter MKBUILD_AUTHOR_INITIALS`" + +  SIGN_MANIFESTS="`eval_boolean_parameter SIGN_MANIFESTS $off`" +  SIGN_MANIFESTS_USER="`eval_parameter SIGN_MANIFESTS_USER`" +  SIGN_MANIFESTS_KEYID="`eval_parameter SIGN_MANIFESTS_KEYID`" +  SIGN_MANIFESTS_WITH_GPG_AGENT="`eval_boolean_parameter SIGN_MANIFESTS_WITH_GPG_AGENT $off`" + +  if [ ! -z "$SIGN_MANIFESTS_KEYID" ]; then +    SIGN_MANIFESTS_KEYID="`echo $SIGN_MANIFESTS_KEYID | tr '[:lower:]' '[:upper:]'`" +  fi + +  if [ "$SIGN_MANIFESTS_WITH_GPG_AGENT" -eq $on ]; then +    GPG_AGENT_OPTION="--use-agent" +  else +    GPG_AGENT_OPTION="" +  fi + +  # For use at common.sh functions +  SIGN="$SIGN_MANIFESTS" +  SIGN_KEYID="$SIGN_MANIFESTS_KEYID" +  SIGN_USER="$SIGN_MANIFESTS_USER" + +  if [ "$SIGN_MANIFESTS" -eq $on ]; then +    get_sign_user +  fi + +} + +function file_metainfo { + +  # get integrity file metadata +  # usage: file_metainfo <file> <file_type> <manifest_file> + +  local sum="" file="$1" file_type="`echo $2 | tr '[:lower:]' '[:upper:]'`" +  local size algo candidate folders path manifest_file="$3" +  local dist_name="`basename $file`" + +  if [ -d "$file" ]; then +    return +  fi + +  if [ -z "$file_type" ]; then +    file_type="AUX" +  fi + +  if [ ! -e "$file" ]; then +    if [ "$file_type" == "DIST" ]; then + +      # Add DIST information only if source is not under revision control +      if [ $SVN_MOD -eq $on -o $GIT_MOD -eq $on ]; then +         return +      fi + +      # Force DIST file name at Manifest +      dist_name="$DIST_SRC_NAME" + +      # Determine file location +      get_dist_file + +      # Update Manifest metadata +      if [ -e "$DIST_SRC_LOCATION" ]; then +        file="$DIST_SRC_LOCATION" +      else +        echo "$file_type $dist_name " >> $manifest_file # end space is important +        return 1 +      fi + +    elif [ "$file_type" == "PATCH" ]; then + +      # Determine file location +      get_patch_file $file + +      # Update Manifest metadata +      if [ -e "$DOWNLOADED_PATCH_LOCATION" ]; then +        file="$DOWNLOADED_PATCH_LOCATION" +      else +        echo "$file_type $dist_name " >> $manifest_file # end space is important +        return 1 +      fi + +    else +      echo "$file_type $dist_name " >> $manifest_file # end space is important +      return 1 +    fi +  fi + +  for algo in md5 rmd160 sha1 sha256 sha512; do +    sum="$sum `echo $algo | tr '[:lower:]' '[:upper:]'` `gethash $algo $file`" +  done + +  echo $file_type $dist_name `file_size $file` $sum >> $manifest_file + +  if [ "$file_type" == "DIST" ] || [ "$file_type" == "PATCH" ]; then +    echo "Please make sure that the following hashes are correct:" +    grep -e "^$file_type $dist_name " $manifest_file +  fi + +} + +function update_manifest_info { + +  # update manifest metainfo for a given file +  # usage: update_manifest_info <file> <file_type> + +  local tmpfile file="$1" file_type="`echo $2 | tr '[:lower:]' '[:upper:]'`" + +  if [ -z "$file_type" ]; then +    file_type="`file_extension $file | tr '[:lower:]' '[:upper:]'`" +  fi + +  # Update Manifest file +  if [ ! -e "$WORK/Manifest" ]; then +    touch $WORK/Manifest +  fi + +  # Set temporary file +  tmpfile="`mktemp $TMP/mkbuild_manifest.XXXXXX`" + +  # Update metadata +  sed -e "/^$file_type `basename $file` /d" $WORK/Manifest > $tmpfile +  file_metainfo $file $file_type $tmpfile + +  if [ "$?" != "0" ]; then +    echo "Could not add hashes for $file on Manifest: file not found." +    echo "Please do it with --update-manifest." +  fi + +  # Save Manifest changes +  strip_gpg_signature $tmpfile | sort > $WORK/Manifest + +  rm -f $tmpfile + +} + +function edit_manifest { + +  local option="$1" + +  # Check if existing Manifest is properly signed +  if ! check_manifest_signature; then +    echo "Invalid signature at $WORK/Manifest, aborting." +    return 1 +  fi + +  # Update Manifest file +  echo "Updating Manifest..." + +  # Update mkbuild metainformation +  update_manifest_info $WORK/`basename $MKBUILD_NAME` + +  # Update SlackBuild information +  update_manifest_info $WORK/`basename $SLACKBUILD` + +  # Update slack-required information +  if [ -e "$WORK/slack-required" ]; then +    update_manifest_info $WORK/slack-required +  fi + +  if [ "$option" == "--update" ]; then +    # Add DIST information only if source is not under revision control +    if [ $SVN_MOD -eq $on -o $GIT_MOD -eq $on ]; then +      echo "Source is under version control system, not adding hashes to Manifest." +    else +      echo "Updating DIST information at $MKBUILD_NAME Manifest..." + +      # Determine file location +      get_dist_file $SOURCE_FILE + +      # Update Manifest metadata +      if [ -e "$DIST_SRC_LOCATION" ]; then +        update_manifest_info $DIST_SRC_LOCATION dist +      else +        echo "Can't get $DIST_SRC_NAME." +      fi +    fi +  else +    # Add source code information if its not already there +    if ! grep -q -e "^DIST $DIST_SRC_NAME " $WORK/Manifest; then +      update_manifest_info $DIST_SRC_NAME dist +    fi +  fi + +  # Update patches +  for i in `find $WORK | grep -E '(.diff$|.diff.gz$|.diff.bz2$|.patch$|.patch.gz$|.patch.bz2$)\*{0,1}$'`; do +    if [ ! -d "$WORK/$i" ] && ! grep -q -e "^PATCH `basename $i` " $WORK/Manifest; then +      update_manifest_info $i patch +    fi +  done + +  # Update patches from URLs +  for i in $PATCH_URLS; do +    if ! grep -q -e "^PATCH `basename $i` " $WORK/Manifest; then +      update_manifest_info $i patch +    fi +  done + +  # Update miscelaneous information +  for i in `find $WORK | grep -E -v '(SlackBuild|old|slack-required|.mkbuild$|.tmp$|Manifest$)\*{0,1}$' | \ +                         grep -E -v '(.diff$|.diff.gz$|.diff.bz2$|.patch$|.patch.gz$|.patch.bz2$)\*{0,1}$' | \ +                         grep -v "/\.svn"`; do +    # Avoid folders, dotfiles and DIST files +    if [ ! -d "$WORK/$i" ] && \ +       [ "`basename $i`" != "$DIST_SRC_NAME" ] && \ +       ! echo "`basename $i`" | grep -q -e "^\."; then +      update_manifest_info $i misc +    fi +  done + +  # Finally, sign the Manifest +  sign_manifest + +} + +function get_file { + +  # download a file +  # usage: download_file <file_type> <url> [file] [dist_name] + +  local folder folders path candidate +  local file_type="`echo $1 | tr '[:lower:]' '[:upper:]'`" +  local url="$2" file="$3" file_name="$4" +  local protocol="`echo $url| cut -d : -f 1 | tr '[:upper:]' '[:lower:]'`" + +  if [ -z "$file_name" ]; then +    if [ "$file_type" == "DIST" ]; then +      file_name="$DIST_SRC_NAME" +    else +      file_name="`basename $url`" +    fi +  fi + +  # Clean global var +  DOWNLOADED_FILE_LOCATION="" + +  # Determine file location +  if [ -d "$file" ]; then + +    folder="$file" +    file="$file_name" +    for candidate in $(find $folder -name $(basename $file)); do +      if [ ! -z "$candidate" ]; then +        break 2 +      fi +    done + +    if [ ! -z "$candidate" ]; then +      echo "Using $(basename $candidate) found at $(dirname $candidate) to hash at the Manifest." +      file="$candidate" +    else +      echo "Can't find $file at $folder." +      return 1 +    fi + +  elif [ -z "$file" ]; then + +    file="$file_name" +    folders="$WORK $TMP $SOURCE_DIR" +    if ! is_the_same /tmp $TMP; then +      folders="$folders /tmp" +    fi + +    echo "Trying to find $(basename $file) at $folders..." + +    for path in $folders; do +      for candidate in $(find $path -name $(basename $file) 2> /dev/null); do +        if [ ! -z "$candidate" ]; then +          break 2 +        fi +      done +    done + +    if [ ! -z "$candidate" ]; then + +      echo "Using $(basename $candidate) found at $(dirname $candidate) to hash at the Manifest." +      file="$candidate" + +    elif [ "$protocol" == "https" ] || \ +         [ "$protocol" == "http" ] || \ +         [ "$protocol" == "ftp" ]; then + +      # Try to donwload the file +      echo "File $file not found, trying to download it..." +      if [ ! -e "$file" ]; then +        if is_writable_folder $SOURCE_DIR/$PKG_NAME; then +          file="$SOURCE_DIR/$PKG_NAME/`basename $file_name`" +          wget "$url" -O "$file" +          if [ "$?" != "0" ]; then +            echo "Could not download $file" +            return 1 +          fi +        elif is_writable_folder $TMP; then +          file="$TMP/`basename $file_name`" +          if [ ! -e "$file" ]; then +            wget "$url" -O "$file" +            if [ "$?" != "0" ]; then +              echo "Could not download $file" +              return 1 +            fi +          fi +        elif ! is_the_same /tmp $TMP; then +          file="/tmp/`basename $file_name`" +          if [ ! -e "$file" ]; then +            wget "$url" -O "$file" +            if [ "$?" != "0" ]; then +              echo "Could not download $file" +              return 1 +            fi +          fi +        else +          echo "Could not download $file" +          return 1 +        fi +      fi +    fi +  fi + +  if [ -e "$file" ]; then +    DOWNLOADED_FILE_LOCATION="$file" +  fi + +} + +function get_dist_file { + +  # get package source code +  # usage: get_dist_file <url> [file_name] + +  DIST_SRC_LOCATION="" +  get_file dist $DIST_SRC_URL +  DIST_SRC_LOCATION="$DOWNLOADED_FILE_LOCATION" + +} + +function get_patch_file { + +  # get a patch +  # usage: get_patch <file_name> + +  local patch_url file_name="$1" + +  if [ -z "$file_name" ]; then +    return 1 +  fi + +  DOWNLOADED_PATCH_LOCATION="" + +  for patch_url in $PATCH_URLS; do +    if [ "`basename $file_name`" == "`basename $patch_url`" ]; then +      get_file patch $patch_url +      DOWNLOADED_PATCH_LOCATION="$DOWNLOADED_FILE_LOCATION" +      break +    fi +  done + +} + +function update_manifest { + +  # Get mkbuild values +  get_mkbuild_values + +  # Update the Manifest +  edit_manifest --update + +} + +function if_previous_error { + +  if [ "$?" != "0" ]; then +    handle_error $* +  fi + +} + +function verbose { + +  if [ $VERBOSE -eq $on ]; then +    echo $* +  fi + +} + +function get_mkbuild_values { + +  # Get values +  # Author name +  AUTHOR=${AUTHOR:="`get_variable "SLACKBUILD AUTHOR"`"} +  [ -z "$AUTHOR" ] && handle_error $ERROR_MKBUILD_CONSTRUCTION "SLACKBUILD AUTHOR" +  verbose "[[SLACKBUILD AUTHOR]]=\"$AUTHOR\"" + +  # Author initials +  STR_MOUNT=`echo $AUTHOR | sed 's/ /\n/g' | sed 's/^\([A-Z]\).*/\1/' | sed ':i; $!N;  s/\n//; ti' | tr [A-Z] [a-z]` +  AUTHOR_INITIALS="`validate_parameter "$AUTHOR_INITIALS" "SLACKBUILD AUTHOR INITIALS" "$STR_MOUNT"`" +  if_previous_error $ERROR_MKBUILD_CONSTRUCTION "SLACKBUILD AUTHOR INITIALS" +  verbose "[[SLACKBUILD AUTHOR INITIALS]]=\"$AUTHOR_INITIALS\"" + +  # URL program +  URL=`validate_parameter "$URL" "DOWNLOAD FOLDER URL" ""` +  if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "URL" +  verbose "[[URL]]=\"$URL\"" + +  AUX=`get_mkbuild_status "svn_source"` +  SVN_MOD=`convert_boolean "$AUX"` + +  AUX=`get_mkbuild_status "git_source"` +  GIT_MOD=`convert_boolean "$AUX"` + +  # Check sections +  if [ $SVN_MOD -eq $on -o $GIT_MOD -eq $on -o $URL == "" ]; then +    LIST_OFF="download_source md5sum_download_and_check_0 md5sum_download_and_check_1 gpg_signature_check untar_source" +    verbose -e "\nCheck subversion or empty URL" +    for i in $LIST_OFF; do +      if [ `get_mkbuild_status "$i"` != "off" ]; then +        handle_error $ERROR_MKBUILD_VCS +      else +        verbose -e "off: $i is ok." +      fi +    done +  fi + +  STR_MOUNT="`echo $URL | sed 's/.*\.\([a-z0-9]\+\)$/\1/'`" +  if [ $STR_MOUNT = "gz" -o $STR_MOUNT = "tgz" -o $STR_MOUNT = "bz2" -o $STR_MOUNT = "zip" ]; then +    SOURCE_NAME=`basename $URL` +    URL_BASE=`dirname $URL` +  else +    URL_BASE=$URL +  fi +  verbose "[[DOWNLOAD FOLDER URL]]=\"$URL_BASE\"" + +  if [ $SVN_MOD -eq $off ] && [ $GIT_MOD -eq $off ]; then +    # Extension +    EXTENSION=`validate_parameter "$EXTENSION" "EXTENSION" "$STR_MOUNT"` +    if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "EXTENSION" +    verbose "[[EXTENSION]]=\"$EXTENSION\"" + +    # Unpacker +    UNPACKER=`validate_parameter "$UNPACKER" "UNPACKER" "tar"` +    if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "UNPACKER" +    verbose "[[UNPACKER]]=\"$UNPACKER\"" + +    # Unpacker flags +    [ "$UNPACKER" == "tar" ] && STR_MOUNT="--no-same-owner --no-same-permissions -xvf" || STR_MOUNT="" +    UNPACKER_FLAGS=`validate_parameter "$UNPACKER_FLAGS" "UNPACKER FLAGS" "$STR_MOUNT"` +    if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "UNPACKER FLAGS" +    verbose "[[UNPACKER_FLAGS]]=\"$UNPACKER_FLAGS\"" + +    # Decompressor program and test flag +    DECOMPRESSOR=`validate_parameter "$DECOMPRESSOR" "DECOMPRESSOR" ""` +    [ -z $DECOMPRESSOR ] && decompress_find +    verbose "[[DECOMPRESSOR]]=\"$DECOMPRESSOR\"" + +    DECOMPRESSOR_TEST_FLAG=`validate_parameter "$DECOMPRESSOR_TEST_FLAG" "DECOMPRESSOR TEST FLAG" ""` +    if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "DECOMPRESSOR TEST FLAG" +    verbose "[[DECOMPRESSOR TEST FLAG]]=\"$DECOMPRESSOR_TEST_FLAG\"" +  fi + +  # Build number +  BUILD_NUMBER=`validate_parameter "$BUILD_NUMBER" "BUILD NUMBER" "1"` +  if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "BUILD NUMBER" + +  # Build archteture +  ARCH=`validate_parameter "$ARCH" "ARCH" "i486"` +  verbose "[[ARCH]]=\"$ARCH\"" + +  # Source name +  STR_MOUNT=`echo $SOURCE_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\1/'` +  SRC_NAME=`validate_parameter "$SRC_NAME" "SOURCE NAME" "$STR_MOUNT"` +  if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "SOURCE NAME" +  verbose "[[SOURCE NAME]]=\"$SRC_NAME\"" + +  # SOURCE NAME cannot be empty +  if [ -z "$SRC_NAME" ]; then +    echo "SOURCE NAME is empty." +    handle_error $ERROR_MKBUILD_CONSTRUCTION "SOURCE NAME" +  fi + +  # Package name +  STR_MOUNT=$SRC_NAME +  PKG_NAME=`validate_parameter "$PKG_NAME" "PACKAGE NAME" "$STR_MOUNT"` +  verbose "[[PACKAGE NAME]]=\"$PKG_NAME\"" + +  # PACKAGE NAME cannot be empty +  if [ -z "$PKG_NAME" ]; then +    echo "PACKAGE NAME is empty." +    handle_error $ERROR_MKBUILD_CONSTRUCTION "PACKAGE NAME" +  fi + +  # Version +  STR_MOUNT=`echo $SOURCE_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\2/'` +  VERSION=`validate_parameter "$VERSION" "VERSION" "$STR_MOUNT"` +  if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "VERSION" +  verbose "[[VERSION]]=\"$VERSION\"" + +  # Source name construction string +  CONST_STRING="`validate_parameter "$CONST_STRING" "SOURCE NAME CONSTRUCTION STRING" "\\\$SRC_NAME-\\\$VERSION.tar.$EXTENSION"`" +  verbose "[[SOURCE NAME CONSTRUCTION STRING]]=\"$CONST_STRING\"" + +  # Build Source Name +  [ -z $SOURCE_NAME ] && SOURCE_NAME=`eval "echo $CONST_STRING"` +  verbose "SOURCE_NAME=\"$SOURCE_NAME\"" + +  # Eval source code name and URL +  DIST_SRC_NAME="`eval "echo $CONST_STRING"`" # we need this to strip some escape strings +  DIST_SRC_NAME="`eval "echo $DIST_SRC_NAME"`" # twice does the job +  DIST_SRC_URL="`eval "echo $URL_BASE"`" # we need this to strip some escape strings +  DIST_SRC_URL="`eval "echo $DIST_SRC_URL"`" # twice does the job +  DIST_SRC_URL="$DIST_SRC_URL/$DIST_SRC_NAME" + +  # Documentations list +  DEFAULT_DOCFILES="NEWS TODO README AUTHORS INSTALL ChangeLog MAINTAINERS COPYING LICENSE SIGNATURE readme.*" +  DOCFILES=`validate_parameter "$DOCFILES" "DOCUMENTATION FILES" "$DEFAULT_DOCFILES"` +  verbose "[[DOCUMENTATION FILES]]=\"$DOCFILES\"" + +  # ./configure option +  OPTIONS=`validate_parameter "$OPTIONS" "OTHER CONFIGURE ARGS" ""` +  verbose "[[OTHER CONFIGURE ARGS]]=\"$OPTIONS\"" + +  # PREFIX +  PREFIX=`validate_parameter "$PREFIX" "PREFIX" "/usr"` +  verbose "[[PREFIX]]=\"$PREFIX\"" + +  # Number of jobs +  NUMJOBS=`validate_parameter "$NUMJOBS" "NUMBER OF JOBS" ""` +  is_number $NUMJOBS && NUMJOBS="-j${NUMJOBS}" +  verbose "[[NUMBER OF JOBS]]=\"$NUMJOBS\"" + +  # Make slack-required file +  SLACK_REQUIRED=`validate_parameter "$SLACK_REQUIRED" "SLACK REQUIRED" ""` +  verbose "[[SLACK REQUIRED]]=\"$SLACK_REQUIRED\"" + +  # SlackBuild model +  MODEL=`validate_parameter "$MODEL" "SLACKBUILD MODEL" "generic.mkSlackBuild"` +  verbose "[[SLACKBUILD MODEL]]=\"$MODEL\"" + +  # PATCH FILES +  PATCH_FILES=`validate_parameter "$PATCH_FILES" "PATCH FILES" ""` +  verbose "[[PATCH_FILES]]=\"$PATCH_FILES\"" + +  # PATCH URLs +  PATCH_URLS=`validate_parameter "$PATCH_URLS" "PATCH URLS" ""` +  verbose "[[PATCH_URLS]]=\"$PATCH_URLS\"" + +  # Strip  the smallest prefix containing num leading slashes from each file name found in the patch file. +  NPS_STRIP=`validate_parameter "$NPS_STRIP" "NUMBER OF PREFIX SLASHES TO STRIP" "1"` +  verbose "[[NUMBER OF PREFIX SLASHES TO STRIP]]=\"$NPS_STRIP\"" + +  # SlackBuild path +  # SlackBuild path in mkbuild parameters file +  SLACKBUILD=$WORK/${PKG_NAME}.SlackBuild +  SLACKBUILD_PATH=`get_slackbuild_path` +  verbose "[[SLACKBUILD PATH]]=\"$SLACKBUILD_PATH\"" + +} + +function make_slackbuild { + +  #-------------------------------------------------------------- +  #-                   Start build SlackBuild                   - +  #-------------------------------------------------------------- + +  # Get mkbuild values +  get_mkbuild_values + +  verbose -e "\nStart SlackBuild make" +  SLACKBUILD_TEMP=$SLACKBUILD.tmp +  cp $MODEL_DIR/$MODEL $SLACKBUILD_TEMP + +  # Apply mkpatch +  verbose -e "\nMkpatch section ..." +  apply_mkpatch + +  # On/Off sections +  verbose -e "\nEnable/disable sections ..." +  activate_sections + +  # Change sections +  verbose -e "\nEdit sections ..." +  section_edit + +  # Change strings from model +  verbose -e "\nChange strings in $PACKAGE.SlackBuild model..." +  start_build $SLACKBUILD_TEMP + +  # Remove off sections +  verbose -e "\nRemove off sections ..." +  build_slackbuild + +  # Make slack-required file +  verbose -e "\nMake slack-required file ..." +  make_slack_required + +  if [ -e slack-required ]; then +    DEPENDENCY_LIST="`cat $WORK/slack-required | awk '{print $1}' | grep '^[a-z]' | tr '\012' ' '`" +    edit_file "REQUIRES" "$DEPENDENCY_LIST" $SLACKBUILD +  else +    edit_file "REQUIRES" " " $SLACKBUILD +  fi + +  # Others changes +  verbose -e "\nEdit other [[]] parameters ..." +  change_other_parameters + +  if [ "$SIGN_MANIFESTS" -eq $on ]; then +    mkbuild_update_keyring +    repo_gpg_key $MKBUILDS_DIR +  fi + +  # Update Manifest file +  edit_manifest + +  if [ "$?" == "0" ]; then + +    # Commit SlackBuild +    [ $SUBMIT_SLACKBUILD -eq $on ] && submit_slackbuild + +    # Commit mkbuild +    [ $SUBMIT_MKBUILD -eq $on ] && submit_mkbuild +  fi + +} + +function create_mkbuild { + +  # Create a new .mkbuild parameters-file +  cp $MODEL_DIR/model.mkbuild $MKBUILD_NAME + +  if [ -z "$AUTHOR" ] && [ ! -z "$MKBUILD_AUTHOR" ]; then +    AUTHOR="$MKBUILD_AUTHOR" +  fi + +  if [ -z "$AUTHOR_INITIALS" ] && [ ! -z "$MKBUILD_AUTHOR_INITIALS" ]; then +    AUTHOR_INITIALS="$MKBUILD_AUTHOR_INITIALS" +  fi + +  # Package Author +  if [ ! -z "$AUTHOR" ]; then +    edit_file "YOUR NAME" "${AUTHOR}" $MKBUILD_NAME +    # Package Author Signature +    if [ -z "$AUTHOR_INITIALS" ]; then +      AUTHOR_INITIALS=`echo $AUTHOR | tr '[A-Z]' '[a-z]' | sed 's/ /\n/g' |  sed 's/^\([a-z]\).*/\1/' | sed ':i ; $! N ; s/\n// ; t i'` +    fi +    edit_file "YOUR SIGNATURE" "${AUTHOR_INITIALS}" $MKBUILD_NAME +  fi + +  # Change Default SourceForge URL +  [ -z "$URL" ] && URL="http://downloads.sourceforge.net/[[PKG NAME]]/" +  edit_file "DEFAULT URL" "${URL}" $MKBUILD_NAME + +  # Change Package Name +  edit_file "PKG NAME" "${MKBUILD_NAME//.mkbuild}" $MKBUILD_NAME + +  # Change SlackBuild Path +  if [ ! -z "$MKBUILD_PATH" ]; then +    edit_file_full "\[\[SLACKBUILD PATH\]\]=.*" "\[\[SLACKBUILD PATH\]\]=\"`regexp_slash $MKBUILD_PATH`\"" $MKBUILD_NAME +  fi + +  # Print .mkbuild name +  echo "$MKBUILD_NAME" + +} + +function search_mkbuild { + +  # find a given mkbuild +  # usage: search_mkbuild [-i] + +  if [ "$MKBUILD_NAME" == ".mkbuild" ]; then +    list_mkbuilds +    return +  fi + +  if [ ! -z "$MKBUILD_PATH" ]; then +    if echo $name | grep -q -e "\.mkbuild$"; then +      if [ -d "$MKBUILDS_DIR/$MKBUILD_PATH" ]; then +        find $MKBUILDS_DIR/$MKBUILD_PATH -name $MKBUILD_NAME +      else +        find $MKBUILDS_DIR -name $MKBUILD_NAME +      fi +    else +      if [ -d "$MKBUILDS_DIR/$MKBUILD_PATH" ]; then +        find $MKBUILDS_DIR/$MKBUILD_PATH -name '*.mkbuild' +      fi +    fi +  else +    if [ "$1" == "-i" ]; then +      # case insensitive mode +      find $MKBUILDS_DIR -iname $MKBUILD_NAME +    else +      find $MKBUILDS_DIR -name $MKBUILD_NAME +    fi +  fi + +} + +function set_mkbuild_name { + +  local name="$1" + +  MKBUILD_PATH="" + +  if [ ! -z "$name" ]; then +    MKBUILD_NAME="`basename $name`" +  fi + +  if echo $name | grep -q "/"; then +    if echo $name | grep -q -e "\.mkbuild$"; then +      MKBUILD_NAME="`basename $name`" +      MKBUILD_PATH="`dirname $name`" +    else +      MKBUILD_PATH="$name" +    fi +  else +    MKBUILD_NAME="${name//.mkbuild}.mkbuild" +  fi + +} + +function list_mkbuilds { + +  # list all available mkbuilds +  # usage: list_mkbuilds + +  list_builds $MKBUILDS_DIR mkbuild + +} + +function edit_mkbuild { + +  # edit a mkbuild +  # usage: edit_mkbuild + +  if [ -e "$MKBUILD_NAME" ]; then +    if [ -z "$EDITOR" ]; then +      EDITOR="vi" +    fi +    $EDITOR $MKBUILD_NAME +  else +    echo "Not found: $MKBUILD_NAME" +    return 1 +  fi + +} + +function mkbuild_update_keyring  { + +  # Update keyring using GPG-KEY from +  # mkbuild repository + +  update_keyring $MKBUILDS_DIR/GPG-KEY + +} + +function sign_manifest { + +  # sign manifest file +  # usage: sign_manifest + +  if [ "$SIGN_MANIFESTS" -eq $on ]; then +    echo "Signing Manifest..." +    if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then +      su $SIGN_USER -c "gpg $GPG_AGENT_OPTION --clearsign -u $SIGN_KEYID $WORK/Manifest" +      mv $WORK/Manifest.asc $WORK/Manifest +    else +      gpg $GPG_AGENT_OPTION --clearsign -u $SIGN_KEYID $WORK/Manifest +      mv $WORK/Manifest.asc $WORK/Manifest +    fi +  fi + +} + +function check_manifest_signature { + +  # check if a manifest signature is valid +  # usage: check_manifest_signature + +  if [ -e "$WORK/Manifest" ]; then +    if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" $WORK/Manifest; then +      echo "Checking existing Manifest signature..." +      mkbuild_update_keyring +      if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then +        su $SIGN_USER -c "gpg --verify $WORK/Manifest" +        if [ "$?" != "0" ]; then +          return 1 +        fi +      else +        gpg --verify $WORK/Manifest +        if [ "$?" != "0" ]; then +          return 1 +        fi +      fi +    fi +  fi + +} + +function delete_mkbuild { + +  # delete content from a mkbuild folder +  # usage: delete_mkbuilds [file] + +  local folder candidate file="$1" +  local name="`basename $MKBUILD_NAME .mkbuild`.mkbuild" + +  for candidate in `find $MKBUILDS_DIR -name $name`; do +    folder="`dirname $candidate`" +    if [ -d "$folder" ]; then +      if [ -z "$1" ]; then +        # Delete the whole mkbuild folder +        svn_del $folder +      elif [ -e "$folder/$file" ]; then +        svn_del $folder/$file +      fi +    fi +  done + +} + +function delete_slackbuild { + +  # delete content from a SlackBuild folder +  # usage: delete_slackbuilds [file] + +  local folder candidate file="$1" +  local name="`basename $MKBUILD_NAME .mkbuild`.SlackBuild" + +  for candidate in `find $SLACKBUILDS_DIR -name $name`; do +    folder="`dirname $candidate`" +    if [ -d "$folder" ]; then +      if [ -z "$1" ]; then +        # Delete the whole mkbuild folder +        svn_del $folder +      elif [ -e "$folder/$file" ]; then +        svn_del $folder/$file +      fi +    fi +  done + +} + +function list_mkbuild_contents { + +   if [ -e "$MKBUILD_NAME" ]; then +     ls `dirname $MKBUILD_NAME` +   else +     echo "Not found: $MKBUILD_NAME" +     return 1 +   fi + +} + +function working_copy { + +  local copy tmpfolder name + +  if [ -e "$MKBUILD_NAME" ]; then +    name="$(basename $MKBUILD_NAME .mkbuild)" +    copy="$(basename $(basename $MKBUILD_NAME .mkbuild))" +    if [ -d "$copy" ]; then +      tmpfolder="`mktemp $name.XXXXXX`" +      mv $copy $tmpfolder/ +    fi +    rsync -av --exclude=".svn" --exclude=".git" `dirname $MKBUILD_NAME`/ $copy/ &> /dev/null +    echo "Working copy for $name set at $(pwd)/$name." +   else +     echo "Not found: $MKBUILD_NAME" +     return 1 +  fi + +} + +function get_param { + +  # get a parameter from a mkbuild file +  # usage: get_param <parameter> + +  local parameter="`echo $* | tr '[:lower:]' '[:upper:] | tr -d '"' | tr -d "'"'`" + +  if [ -e "$MKBUILD_NAME" ]; then +    grep -e "\[\[$parameter\]\]" $MKBUILD_NAME | cut -d = -f 2 | tr -d '"' | tr -d "'" +  fi + +} + +# ---------------------------------------------------------------- + +#============================= +#        Main Program +#============================= + +# Common functions +COMMON_SH="/usr/libexec/simplepkg/common.sh" +PROG_VERSION="`echo '$Rev$' | sed -e 's/[^0-9]//g'`" +BASENAME="`basename $0`" +WORK=`pwd` +LANG=en_US +EXIT_CODE=0 + +if [ -f "$COMMON_SH" ]; then +  source $COMMON_SH +else +  echo $error "$BASENAME: file $COMMON_SH not found. Check your $BASENAME installation" +fi + +# Start constants +set_constants + +# Set submit off +SUBMIT_SLACKBUILD=$off +SUBMIT_MKBUILD=$off +# Set verbose off +VERBOSE=$off +SVN_MOD=$off + +# Load /etc/simplepkg/simplepkg.conf parameters +load_parameters + +# Select color mode: gray, color or none (*) +color_select $COLOR_MODE + +# Auxiliar file +AUX_TMP=/tmp/mkbuild_tmp.$RANDOM +DIFF_FILE=/tmp/mkbuild.diff.$RANDOM +# Derectory to SlackBuild models +MODEL_DIR=${MODEL_DIR:="/etc/simplepkg/defaults/mkbuild"} +# SlackDesk line length +SLACKDESC_LEN=78 + +# Load error codes +error_codes + +# Show help if has no arguments +[ $# -eq 0 ] && mkbuild_use && exit 1 + +# Configure input parameters +set_parameters "$@" + +verbose -e "$BASENAME version $PROG_VERSION\n" +case $ACTION in +  'update_manifest') +    shift +    update_manifest $* +  ;; +  'commit_slackbuild') +    shift 2 +    commit_changes $SLACKBUILDS_DIR $MKBUILD_BASENAME: $* +  ;; +  'commit_mkbuild') +    shift 2 +    commit_changes $MKBUILDS_DIR $MKBUILD_BASENAME: $* +  ;; +  'commit_all') +    shift 2 +    commit_changes $SLACKBUILDS_DIR $MKBUILD_BASENAME: $* +    commit_changes $MKBUILDS_DIR $MKBUILD_BASENAME: $* +  ;; +  'import_slackbuilds') +    shift +    import_slackbuilds $* +  ;; +  'import_mkbuilds') +    shift +    import_mkbuilds $* +  ;; +  'import_all') +    shift +    import_mkbuilds $* +    import_slackbuilds $* +  ;; +  'delete_slackbuild') +    delete_slackbuild +  ;; +  'delete_mkbuild') +    delete_mkbuild +  ;; +  'delete_all') +    delete_mkbuild +    delete_slackbuild +  ;; +  'new') +    create_mkbuild +  ;; +  'build') +    make_slackbuild +  ;; +  'search') +    search_mkbuild -i +  ;; +  'status') +    repository_status +  ;; +  'list') +    list_mkbuild_contents +  ;; +  'edit') +    edit_mkbuild +  ;; +  'working_copy') +    working_copy +  ;; +  'get_param') +    shift 2 +    get_param $* +  ;; +esac + +# Clear temporary files +verbose -e "\nRemove temporary files ..." +clear_files +exit $EXIT_CODE diff --git a/src/mkjail b/src/mkjail new file mode 100755 index 0000000..4b00c38 --- /dev/null +++ b/src/mkjail @@ -0,0 +1,115 @@ +#!/bin/bash +#           +# mkjail: 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 +# +# $Rev$ - $Author$ +# + +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_scripts`" ]; then +    for file in `template_scripts`/*; 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_packages`" + +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 "Instaling packages into $JAIL_ROOT/$server..." +echo "Using template $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/src/mkpatch b/src/mkpatch new file mode 100644 index 0000000..bbf990b --- /dev/null +++ b/src/mkpatch @@ -0,0 +1,145 @@ +#!/bin/bash +# +# mkpatch: Simple patch program to .mkbuild models +# feedback: rudsonaalves at yahoo.com.br | gpl +# +#  mkbuild 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. +# +#  mkbuild 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 +# +# Input: +#   - $1 Diff_File +#   - #2 Source_File +# +# Version: +PROG_VERSION=1.1 +BASENAME=`basename $0` + +function get_line { + +    # get a line $1 from file $2 +    [ $# -ne 2 ] && exit $ERROR_PAR_NUMBER +    ! is_number $1 && exit $ERROR_NOT_NUMBER +    [ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND + +    sed "$1 q;d" $2 +} + +function get_diff_line { + +    # get diff line e return: +    #  - Action in Diff_Action +    #  - Diff Line in Diff_Str_Line +    if [ $1 -gt $Diff_N_Lines ]; then +        Diff_Action=" " +        Diff_Str_Line="" +        return 0 +    fi +    Line=`get_line $1 $2` +    Diff_Action=`echo "$Line" | cut -c1` +    Diff_Str_Line=`echo "$Line" | cut -c2-` +} + + +# ---------------------------------------------------------------- +# ------------------- mkpatch program ---------------------------- +# common.sh library start +COMMON_SH="/usr/libexec/simplepkg/common.sh" +if [ -f "$COMMON_SH" ]; then +  source $COMMON_SH +else +  echo "$BASENAME: file $COMMON_SH not found. Check your $BASENAME installation" +fi + +# Load error codes +error_codes +# ---------------- + +if [ "$1" = "--help" -o "$1" = "-h" ]; then +    echo "Use: $BASENAME <diff_file> <source_file>" +    exit $ERROR_HELP +fi + +# Check input parameters +[ $# -ne 2 ] && exit $ERROR_PAR_NUMBER +[ ! -e $1 ] && exit $ERROR_FILE_NOTFOUND +[ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND + +# Start variables +Diff_File=$1 +Source_File=$2 +Diff_N_Lines=`wc -l $1 | cut -f1 -d" "` +Source_N_Lines=`wc -l $2 | cut -f1 -d" "` + +# Start vars +Diff_Line=1 +Diff_Pointer=1 +Status_Diff=0 + +# Get frist Diff_File line +get_diff_line $Diff_Line $Diff_File || exit $? + +Source_Line=1 +# Get frist Source_File line +Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? +while [ $Source_Line -le $Source_N_Lines ];  do +    # make Actions +    case $Diff_Action in +        '-') +            if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then +                Status_Diff=1 +                let Diff_Line++ +            else +                Diff_Line=$Diff_Pointer +                Status_Diff=0 +                echo "$Source_Str_Line" +            fi +            get_diff_line $Diff_Line $Diff_File || exit $? +            let Source_Line++ +            Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? +        ;; +        '+') +            echo "$Diff_Str_Line" +            let Diff_Line++ +            get_diff_line $Diff_Line $Diff_File || exit $? +        ;; +        ' ') +            if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then +                Status_Diff=1 +                let Diff_Line++ +            else +                Status_Diff=0 +                Diff_Line=$Diff_Pointer +            fi +            echo "$Source_Str_Line" +            get_diff_line $Diff_Line $Diff_File || exit $? +            let Source_Line++ +            Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? +        ;; +        '=') +            let Diff_Line++ +            Status_Diff=0 +            Diff_Pointer=$Diff_Line +            get_diff_line $Diff_Line $Diff_File || exit $? +        ;; +        *) +            echo "Invalid diff action." +            exit $ERROR_MKPATCH +        ;; +    esac +done + +# Make others addline "+" in the end file +while [ "$Diff_Action" = "+" -a $Diff_Line -le $Diff_N_Lines ]; do +    echo "$Diff_Str_Line" +    let Diff_Line++ +    get_diff_line $Diff_Line $Diff_File || exit $? +done diff --git a/src/mkpatch.new b/src/mkpatch.new new file mode 100755 index 0000000..cacab52 --- /dev/null +++ b/src/mkpatch.new @@ -0,0 +1,145 @@ +#!/bin/bash +# +# MKPatch 2.0.0: Simple patch program to .mkbuild models +# feedback: rudsonaalves at yahoo.com.br | gpl +# +#  mkbuild 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. +# +#  mkbuild 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 +# +# Input: +#   - $1 Diff_File +#   - #2 Source_File +# +# Version: +PROG_VERSION=2.0 +BASENAME=`basename $0` + +# Errors codes. From common.sh +ERROR_FILE_NOTFOUND=${ERROR_FILE_NOTFOUND:=100} +ERROR_PAR_NUMBER=${ERROR_PAR_NUMBER:=102} +ERROR_MKPATCH=${ERROR_MKPATCH:=600} + +# check input arguments +if [ "$1" = "--help" -o "$1" = "-h" ]; then +    echo "Use: $BASENAME <diff_file> <source_file>" +    exit $ERROR_HELP +fi + +# check number of parameters +[ $# -ne 2 ] && exit $ERROR_PAR_NUMBER + +# check diff_file exit +[ ! -e $1 ] && exit $ERROR_FILE_NOTFOUND + +# check source_file exit +[ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND + +# Change IFS value to <ENTER> only +OLD_IFS=$IFS +IFS=' +' + +# Read vector from patch file +index=0 +while read line; do +    Diff_lines[index]="`echo $line | cut -c2-`" +    Diff_action[index]="`echo $line | cut -c1`" +    let index++ +done < $1 +let Diff_n_lines=index-1 + +# Read vector from source file +index=0 +while read line; do +    Source_lines[index]="$line" +    let index++ +done < $2 +let Source_n_lines=index-1 + +# Rescue IFS value +IFS=$OLD_IFS + +# Stating variables +Source_index=0 +Diff_index=0 +Diff_pointer=0 +Status_diff=0 + +# Output vector +Output="" +Output_index=0 + +# Apply patch +while [ $Source_index -le $Source_n_lines -a $Diff_index -le $Diff_n_lines ]; do +    # make Actions +    case "${Diff_action[Diff_index]}" in +        '-') +            if [ "${Source_lines[Source_index]}" == "${Diff_lines[Diff_index]}" ]; then +                Status_diff=1 +                let Diff_index++ +            else +                Diff_index=$Diff_pointer +                Status_diff=0 +                Output[Output_index]="${Source_lines[Souce_index]}" +                let Output_index++ +            fi +            let Source_index++ +            ;; +        '+') +            Output[Output_index]="${Diff_lines[Diff_index]}" +            let Diff_index++ +            let Output_index++ +            ;; +        ' ') +            if [ "${Source_lines[Source_index]}" == "${Diff_lines[Diff_index]}" ]; then +                Status_diff=1 +                let Diff_index++ +            else +                Status_diff=0 +                Diff_index=$Diff_pointer +            fi +            Output[Output_index]="${Source_lines[Source_index]}" +            let Output_index++ +            let Source_index++ +            ;; +        '=') +            let Diff_index++ +            Status_diff=0 +            Diff_pointer=$Diff_index +            ;; +        '*') +            echo "Invalid diff action." +            exit $ERROR_MKPATCH +            ;; +    esac +done + +# Check end of file mkSlackBuild +if [ $Diff_index -gt $Diff_n_lines -a $Source_index -le $Source_n_lines ]; then +    # write the rest of mkSlackBuild in Output vector +    for index in `seq $Source_index $Source_n_lines`; do +        Output[Output_index]="${Source_lines[index]}" +        let Output_index++ +    done +elif [ $Diff_index -le $Diff_n_lines ]; then +    # Write others addlines, "+", in Output vector +    while [ "${Diff_Action[Diff_index]}" == "+" ]; do +        Output[Output_index]="${Diff_lines[Diff_index]}" +        let Diff_index++ +        let Output_index++ +    done +fi + +# Print Output file +for index in `seq 1 $Output_index`; do +    echo "${Output[$index-1]}" +done diff --git a/src/rebuildpkg b/src/rebuildpkg new file mode 100755 index 0000000..65315ad --- /dev/null +++ b/src/rebuildpkg @@ -0,0 +1,86 @@ +#!/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" + +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.$MKBUILD_COMPRESS +mv $package_name.$MKBUILD_COMPRESS $TMP/ +echo "done: package rebuilt and stored at $TMP/$package_name.$MKBUILD_COMPRESS" diff --git a/src/simplaret b/src/simplaret new file mode 100755 index 0000000..7b157bb --- /dev/null +++ b/src/simplaret @@ -0,0 +1,1194 @@ +#!/bin/bash +# +# simplaret: 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 +# +# $Rev$ - $Author$ +# + +BASENAME="`basename $0`" +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 + +if [ -f "$HOME/.simplepkg/repos.conf" ]; then +  REPOS_CONF="$HOME/.simplepkg/repos.conf" +elif [ -f "/etc/simplepkg/repos.conf" ]; then +  REPOS_CONF="/etc/simplepkg/repos.conf" +else +  REPOS_CONF="/etc/simplepkg/defaults/repos.conf" +fi + +function simplaret_usage { + +  echo "usage: [ARCH=otherarch] [VERSION=otherversion] $BASENAME [OPTION] package-name" +  echo -e "\t OPTIONS: --help, --install, --update (or --sync), --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.old" ]; then +      echo Restoring old $file to $1... +      mv $1/$file.old $1/$file +     else +      rm -f $1/$file.old +    fi +  done + +} + +function simplaret_import_gpg_keys { + +  if [ "$SIGNATURE_CHECKING" == "$on" ]; then +    check_gnupg +    if [ -f "$1/GPG-KEY" ] && [ -f "$1/GPG-KEY.old" ]; then +      if ! diff $1/GPG-KEY $1/GPG-KEY.old &> /dev/null; then +        gpg --import < $1/GPG-KEY +      fi +    elif [ -f "$1/GPG-KEY" ]; then +      gpg --import < $1/GPG-KEY +    fi +  fi + +} + +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 | tr '[:upper:]' '[:lower:]'`" +  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" ] || [ "$protocol" == "https" ]; then + +    echo Getting $1/$2: +    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/$2: + +    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 repository definitions 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_set_arch +    distro="`basename $repository_url`" +    if [ "$ARCH" == "x86_64" ] && [ "$distro" == "slackware" ]; then +      distro="slackware64" +    fi +    repository_url="$repository_url/$distro-$VERSION/" +  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_import_gpg_keys $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 -e "$(pkg_ext_grep .)$" $2/`simplaret_filelist` | awk '{ print $8 }' +  else +    grep $1 $2/`simplaret_filelist` | awk '{ print $8 }' | grep -E -e "$(pkg_ext_grep .)$" +  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 { + +  if [ "$SIGNATURE_CHECKING" == "$on" ]; then +    echo `simplaret_filelist` CHECKSUMS.md5 GPG-KEY +  else +    echo `simplaret_filelist` CHECKSUMS.md5 +  fi + +} + +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 | grep -E -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 | grep -E -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 [ "$1" == "-w" ] && [ ! -z "$2" ]; then +    mtime="-mtime +`echo "$2*7" | bc -l`" +    mtime_message="older than $2 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 +    if [ -z "$mtime_message" ]; then +      echo "$BASENAME: purging all packages for:" +    else +      echo "$BASENAME: purging all packages $mtime_message for:" +    fi +    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 `pkg_ext` 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 { + +  # search and delete packages +  # usage: simplaret_search_and_delete <package> <folder> [--silent] + +  local file candidate place basename name version build +  local name_version name_build + +  name="`package_name $1`" + +  if [ "$name" != "$1" ]; then +    # searching by full package filename +    name_version="`package_version $1`" +    name_build="`package_build $1`" +    name_ext="`package_ext $1`" + +    # search wheter the package filename is in the repositories +    if [ "`simplaret_search $1 | grep $1 | wc -l`" == "0" ]; then  +      echo "Error: package not found: $1" +      return 1 +    fi + +    for file in `eval find $2/ $(pkg_ext_find $name*) 2> /dev/null`; do +      candidate="`basename $file`" +      version="`package_version $candidate`" +      build="`package_build $candidate`" +      ext="`package_ext $candidate`" +      if [ "`package_name $candidate`" == "$name" ]; then + +        if [ "$name_version" == "$version" ] && \ +           [ "$name_build" == "$build" ] &&     \ +           [ "$name_ext" == "$ext" ]; 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="`strip_pkg_ext $file`" +           rm -f $file +           rm -f $place/$candidate.slack-required +           rm -f $file.asc $place/$basename.meta $place/$basename.txt +           break +         fi +            +       fi +    done + +  else + +    for file in `eval find $2/ $(pkg_ext_find $name*) 2> /dev/null`; do +      candidate="`basename $file`" +      version="`package_version $candidate`" +      build="`package_build $candidate`" +      ext="`package_ext $candidate`" +      if [ "`package_name $candidate`" == "$name" ]; 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 [ "$version" == "`package_version $result`" ] && \ +               [ "$build" == "`package_build $result`" ] &&     \ +               [ "$ext" == "`package_ext $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="`strip_pkg_ext $file`" +               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 + +  fi + +} + +function simplaret_get { + +  # get a package +  # usage: simplaret_get <package-name|package-file-name> [--silent] + +  local silent generate_patches search search_results +  local name version build + +  # prevent user to stay in $storage +  cd  + +  name="`package_name $1`" + +  if [ "$name" != "$1" ]; then +    # simplaret_get was called with the package file +    # name and not with just the package name +    version="`package_version $1`" +    build="`package_build $1`" +  else +    version="" +    build="" +  fi + +  # 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`" == "$name" ]; then + +      if [ ! -z "$build" ] && [ ! -z "$version" ]; then +        # simplaret_get was called with the package file +        # name and not with just the package name +        if [ "$version" != "`package_version $candidate`" ] && \ +           [ "$build" != "`package_build $candidate`" ]; then +           # the package version and/or build doesnt matched +           # the desired one +           continue +         fi +      fi + +      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/$name.slack-required" ]; then +        rm $folder/$name.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`/$name.slack-required; then +        simplaret_download $repository_url `dirname $file`/$name.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 [ "$SIGNATURE_CHECKING" == "$on" ]; then +          if [ -f "$folder/$candidate.asc" ]; then +            gpg --verify $folder/$candidate.asc $folder/$candidate +            if [ "$?" != "0" ]; then +              echo "Package signature does not match. Removing package." +              rm -f $folder/$candidate.asc $folder/$candidate +              LAST_DOWNLOADED_PACKAGE="" +              return 1 +            fi +          else +            echo "Missing signature. Removing package." +            rm -f $folder/$candidate.asc $folder/$candidate +            LAST_DOWNLOADED_PACKAGE="" +            return 1 +          fi +        fi +        # generate the patches FILE_LIST and PACKAGES.TXT if needed +        if [ "$generate_patches" == "1" ]; then +          gen_patches_filelist $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 pack +  local installed_build repos_type get is_patch package_match + +  # get just the file and package name +  sugested_filename="`echo $sugested | cut -d , -f 1`" +  sugested_pack="`package_name $sugested_filename`" + +  # search if its installed in the jail +  if grep -q -e "^$sugested_pack$" $PACKAGES_TMP; then +   +    # get the repository type +    repos_type="`echo $sugested | cut -d , -f 2`" + +    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_filename`" +    package_build="`package_build $sugested_filename`" + +    # check if the patch was already downloaded +    if echo "$DOWNLOADED_PATCHES" | grep -q " $ARCH:$VERSION:$sugested_pack "; then +      #if [ "$IS_UPGRADE" != "1" ]; then +        #echo Package $sugested_pack already downloaded +        #echo "Jail $root needs package $sugested_pack (already downloaded, skipping)" +        return +      #fi +    fi + +    pack="`echo $sugested_pack | sed -e 's/\+/\\\+/'`" +    installed="`check_installed $pack $root`" +    installed_version="`package_version $installed.tgz`" +    installed_build="`package_build $installed.tgz`" + +    get="no" + +    # if needed, download the patch +    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 + +    # finally, get the package +    if [ "$get" == "yes" ]; then +      if [ "$IS_UPGRADE" == "1" ]; then +        if [ "$package_match" == "no" ]; then +          simplaret_install $sugested_pack +        else +          simplaret_get $sugested_pack +        fi +      else +        simplaret_get $sugested_pack +      fi +      if [ "$?" == "0" ]; then +        DOWNLOADED_PATCHES="$DOWNLOADED_PATCHES $ARCH:$VERSION:$sugested_pack " # the ending space is important +      fi +    fi + +  fi + +  unset 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 + +  # installed packages at $root +  PACKAGES_TMP=/tmp/simplaret_packages.$RANDOM +  rm -f $PACKAGES_TMP ; touch $PACKAGES_TMP ; chmod 600 $PACKAGES_TMP +  ls -1 $root/var/log/packages/ | sed -e 's/-[^-]*-[^-]*-[^-]*$//' > $PACKAGES_TMP + +  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 + +  rm $PACKAGES_TMP + +  # 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-name1|package-file-name1> ... [--skip-checks] + +  local package root jail_arch jail_version slack_required dep dependency tmp +  local name version build + +  for package in $*; do + +    if [ "$package" == "--skip-checks" ]; then +      continue +    fi + +    name="`package_name $package`" +   +    root="/$ROOT" +    mkdir -p $root/var/log/setup/tmp +   +    if [ "`echo $package | 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 ! echo $* | grep -q -- "--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 $package --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 $package --skip-checks\" to ignore this warning and install anyway" +        return 1 +      fi +    fi +   +    # package="`simplaret_get $package --silent`" +    simplaret_get $package --silent +    package="$LAST_DOWNLOADED_PACKAGE" +   +    if [ "$package" != "0" ] && [ ! -z "$package" ]; then +      slack_required="`dirname $package`/$name.slack-required" +      if [ -f "$package" ]; then +   +        if [ -f "$slack_required" ] && [ "$DEPENDENCY_CHECKING" == "1" ]; then +          # TODO: check dependency versions +          # this routine checks for dependencies in package's slack-required +          # procedure adapted from createpkg script +          ( grep -v '^#' $slack_required | awk '{ print $1 }' | while read dep; do +             if [ ! -z "$dep" ]; then +              dependency="`echo $dep | awk '{ print $package }'`" +              simplaret_solve_dep $name $dependency $root +             fi +             true +           done ) +        fi +   +        ROOT=$root upgradepkg --install-new $package +        LAST_DOWNLOADED_PACKAGE="0" +   +      else +        echo "Error: could not install package $package: file not found" +        LAST_DOWNLOADED_PACKAGE="0" +        return 1 +      fi +    else +      echo "Error: could not install package $package" +      LAST_DOWNLOADED_PACKAGE="0" +      return 1 +    fi + +  done + +} + +function simplaret_set_arch { + +  # set correct value for ARCH + +  local repos_type new_arch + +  # any arch defined in ARCH_i486 that hasn't an entry +  # on $REPOS_CONF will be mapped to i486 + +  ARCH_i486=" nocona prescott pentium4m pentium4 pentium-m pentium3m pentium3 " +  ARCH_i486="$ARCH_i486 pentium2 i686 pentium-pro i586 pentium-mmx pentium i486 " +  ARCH_i486="$ARCH_i486 athlon-mp athlon-xp athlon4 athlon-tbird athlon k6 k6-2 " +  ARCH_i486="$ARCH_i486 k6-3 winchip-c6 winchip2 c3 c3-2 " + +  # 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_i486" | grep -q " $ARCH "; then +        new_arch="i486" +      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 echo $1 | grep -q -e "^file:///"; then +    url="`echo $1 | sed -e 's/file:\/\///'`" +    if [ -e "$url" ]; then +      return 0 +    else +      return 1 +    fi +  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="`check_installed $pack $root`" +  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 + +} + +function simplaret_remove { + +  # remove packages +  # usage: simplaret_remove <package1> [<package2> ... <packageN>] + +  for package in $*; do +    ROOT=/$ROOT removepkg $package +  done + +} + +function simplaret_req_arg { + +  # requires arg + +  if [ -z "$1" ]; then +    simplaret_usage; +  fi + +} + +if [ -z "$1" ]; then +  simplaret_usage +  exit 1 +else +  eval_config $BASENAME +  set_constants +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" | "--sync" | "sync" ) simplaret_update ;; +  "--upgrade" | "upgrade") simplaret_get_patches --upgrade ;; +  "--get-patches" | "get-patches") simplaret_get_patches ;; +  "--search" | "search") shift ; simplaret_req_arg $1 ; simplaret_search $* ;; +  "--get" | "get") shift ; simplaret_req_arg $1 ; simplaret_get $* ;; +  "--purge" | "purge") shift ; simplaret_purge $* ;; +  "--install" | "install") shift ; simplaret_req_arg $1 ; simplaret_install $* ;; +  "--remove" | "remove") shift ; simplaret_req_arg $1 ; simplaret_remove $* ;; +  "--help" | "help") simplaret_usage ;; +  *) +    if echo $1 | grep -q -v '^--'; then +      simplaret_install $* +    else +      simplaret_usage +    fi +    ;; +esac + diff --git a/src/simpletrack b/src/simpletrack new file mode 100755 index 0000000..31b7225 --- /dev/null +++ b/src/simpletrack @@ -0,0 +1,66 @@ +#!/bin/bash +# +# simpletrack $Id$: slacktrack/altertrack wrapper from simplepkg suite +# feedback: rhatto at riseup.net | gpl +#  +#  Simpletrack 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. +# +#  Simpletrack 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 +# + +PRIORITY=${SLACKTRACK_PRIORITY:=slacktrack-real slacktrack altertrack} +BASENAME="`basename $0`" + +function slacktrack { + +  $1 -b $REPOS -x $TMP,$SRC_DIR,/dev -jefkzp "$PACKAGE-$VERSION-$ARCH-$BUILD.$MKBUILD_COMPRESS" "./$2" + +} + +function slacktrack-real { + +  $1 -b $REPOS -x $TMP,$SRC_DIR,/dev -jefkzp "$PACKAGE-$VERSION-$ARCH-$BUILD.$MKBUILD_COMPRESS" "./$2" + +} + +function altertrack { + +  $1 -b $REPOS -x $TMP,$SRC_DIR,/dev -jefkzp "$PACKAGE-$VERSION-$ARCH-$BUILD.$MKBUILD_COMPRESS" "./$2" + +} + +# ----------------------------------------------------- +#                       main +# ----------------------------------------------------- + +if [ -z "$1" ]; then +	echo "usage: $BASENAME [options] <build-script>" +	exit 1 +elif [ ! -f "$1" ]; then +	echo "$1: file not found" +	exit 1 +fi + +for tracker in $PRIORITY; do +	path="`which $tracker 2> /dev/null`" +	found="$?" +	if [ "$found" == "0" ]; then +		echo $BASENAME: using $tracker... +		$tracker $path $* +		break +	fi +done + +if [ "$found" != "0" ]; then +  echo "Can't find any suitable tracker among $PRIORITY" +  echo "Does slacktrack package is installed in your system?" +  exit 1 +fi 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 +  | 
