#!/bin/sh # # Copyright (c) 2012, Ting-Wei Lan. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the author nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PREFIX=/usr/local PKGDB=/var/pkgdb PKGDB_COPY=${PKGDB}/copy PKGDB_DIR=${PKGDB}/dir PKGDB_SYMLINK=${PKGDB}/symlink USING_COPY="etc com var" USING_SYMLINK="bin sbin libexec lib lib64 include share locale info man" [ "$1" ] && package_name="$1" [ "$2" ] && package_prefix="$2" if [ -z "${package_name}" ]; then package_dir="`pwd`" package_name_default="`basename "${package_dir}"`" read -p "Package name [${package_name_default}]: " package_name if [ -z "${package_name}" ]; then echo "===> Using default value ${package_name_default}" package_name=${package_name_default} fi fi if [ -e "${PKGDB_COPY}/${package_name}" ] || [ -e "${PKGDB_DIR}/${package_name}" ] || [ -e "${PKGDB_SYMLINK}/${package_name}" ]; then echo "${package_name} is installed! Try other name!" exit 1 fi if [ -z "${package_prefix}" ]; then read -p "Installation prefix [${PREFIX}]: " package_prefix if [ -z "${package_prefix}" ]; then echo "===> Using default value ${PREFIX}" package_prefix="${PREFIX}" fi fi printf "\nScanning current directory...\n" install_copy="" install_symlink="" noinstall="" for i in * do determined=0 for j in ${USING_COPY} do [ "$i" = "$j" ] && [ -d "$i" ] && \ install_copy="${install_copy} $i" && \ determined=1 && break done [ "${determined}" = "1" ] && continue for j in ${USING_SYMLINK} do [ "$i" = "$j" ] && [ -d "$i" ] && \ install_symlink="${install_symlink} $i" && \ determined=1 && break done [ "${determined}" != "1" ] && noinstall="${noinstall} $i" done printf "These directories will be \e[1;32mcopied\e[m: \n\t${install_copy}\n" printf "These directories will be \e[1;36msymlinked\e[m: \n\t${install_symlink}\n" printf "These directories (or files) will \e[1;31mnot\e[m be installed: \n\t${noinstall}\n" printf "Note: Only directories can be installed via this program!\n\n" read -p "OK [Y/n]? " is_confirmed if [ "${is_confirmed}" = "n" ]; then read -p "Modify setting or quit [M/q]? " want_modify if [ "${want_modify}" != "q" ]; then while [ "${modify_ok}" != "1" ] do read -p "Installing by copying [${install_copy}]: " list_copy read -p "Installing by symlinking [${install_symlink}]: " list_symlink read -p "Apply the settings [Y/n]? " setting_yes if [ "${setting_yes}" != "n" ]; then [ "${list_copy}" ] && install_copy="${list_copy}" [ "${list_symlink}" ] && install_symlink="${list_symlink}" fi printf "These directories (or files) will be \e[1;32mcopied\e[m: \n\t${install_copy}\n" printf "These directories (or files) will be \e[1;36msymlinked\e[m: \n\t${install_symlink}\n" read -p "Modify again [Y/n]? " setting_ok [ "${setting_ok}" = "n" ] && modify_ok=1 done else echo "Installation cancelled by user" exit 1 fi fi mkdir -p ${PKGDB_COPY} mkdir -p ${PKGDB_SYMLINK} mkdir -p ${PKGDB_DIR} echo "===> Creating file ${PKGDB_COPY}/${package_name}" exec 3> ${PKGDB_COPY}/${package_name} echo "===> Creating file ${PKGDB_SYMLINK}/${package_name}" exec 4> ${PKGDB_SYMLINK}/${package_name} echo "===> Creating file ${PKGDB_DIR}/${package_name}" exec 5> ${PKGDB_DIR}/${package_name} for i in ${install_copy} do [ -z "$i" ] && continue mkdir -p ${package_prefix}/$i find "$i" -mindepth 1 -print | { while read oneline do if [ -d "${oneline}" ]; then dir_mode="`stat -c "%a" "$oneline"`" dir_user="`stat -c "%U" "$oneline"`" dir_grp="`stat -c "%G" "$oneline"`" printf "[\e[1;35mDIR\e[m][+] ${package_prefix}/${oneline}\n" install -o "$dir_user" -g "$dir_grp" -m "$dir_mode" -d \ "${package_prefix}/${oneline}" echo "${package_prefix}/${oneline}" 1>&5 elif [ -L "${oneline}" ]; then printf "[\e[1;36mSYMLINK\e[m][+] ${package_prefix}/${oneline}\n" ln -s "`readlink "${oneline}"`" \ "${package_prefix}/${oneline}" echo "${package_prefix}/${oneline}" 1>&4 elif [ -f "${oneline}" ]; then if [ -e "${package_prefix}/${oneline}" ]; then echo "===> File ${package_prefix}/${oneline} exists! Skip installation!" echo "#### Comparing files ..." diff -u "${package_prefix}/${oneline}" "${oneline}" [ "$?" = "0" ] && echo "#### Two files are the same." else printf "[\e[1;32mCOPY\e[m][+] ${package_prefix}/${oneline}\n" cp -p "${oneline}" "${package_prefix}/${oneline}" echo "${package_prefix}/${oneline}" 1>&3 fi fi done } done for i in ${install_symlink} do [ -z "$i" ] && continue if [ -d "$i" ]; then mkdir -p ${package_prefix}/$i find "$i" -mindepth 1 -print | { while read oneline do if [ -d "${oneline}" ]; then dir_mode="`stat -c "%a" "$oneline"`" dir_user="`stat -c "%U" "$oneline"`" dir_grp="`stat -c "%G" "$oneline"`" printf "[\e[1;35mDIR\e[m][+] ${package_prefix}/${oneline}\n" install -o "$dir_user" -g "$dir_grp" -m "$dir_mode" -d \ "${package_prefix}/${oneline}" echo "${package_prefix}/${oneline}" 1>&5 elif [ -f "$oneline" ] || [ -L "$oneline" ]; then printf "[\e[1;36mSYMLINK\e[m][+] ${package_prefix}/${oneline}\n" ln -s "`readlink -f "${oneline}"`" \ "${package_prefix}/${oneline}" echo "${package_prefix}/${oneline}" 1>&4 fi done } fi done