1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/openpkg/openpkg.sh Tue Jan 06 23:40:39 2009 +0100 1.3 @@ -0,0 +1,299 @@ 1.4 +#!@l_prefix@/lib/openpkg/bash 1.5 +## 1.6 +## openpkg -- OpenPKG Tool Chain 1.7 +## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/> 1.8 +## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/> 1.9 +## 1.10 +## Permission to use, copy, modify, and distribute this software for 1.11 +## any purpose with or without fee is hereby granted, provided that 1.12 +## the above copyright notice and this permission notice appear in all 1.13 +## copies. 1.14 +## 1.15 +## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 1.16 +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1.17 +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1.18 +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR 1.19 +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.20 +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.21 +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 1.22 +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 1.23 +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 1.24 +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 1.25 +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 1.26 +## SUCH DAMAGE. 1.27 +## 1.28 +## openpkg.sh: Execution Frontend (Language: Bourne-Shell) 1.29 +## 1.30 + 1.31 +## 1.32 +## command line parsing 1.33 +## 1.34 + 1.35 +# command line options defaults 1.36 +opt_prefix="" 1.37 +opt_tools="" 1.38 +opt_version=no 1.39 +opt_help=no 1.40 + 1.41 +# process command line options by iterating over arguments 1.42 +for opt 1.43 +do 1.44 + case "${opt}" in 1.45 + -*=*) arg=`echo "${opt}" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; 1.46 + *) arg='' ;; 1.47 + esac 1.48 + case "${opt}" in 1.49 + -v|--version ) opt_version=yes; shift ;; 1.50 + -h|--help ) opt_help=yes; shift ;; 1.51 + --prefix=* ) opt_prefix="${arg}"; shift ;; 1.52 + --tools=* ) opt_tools="${arg}"; shift ;; 1.53 + -* ) echo "openpkg:ERROR: Invalid command-line option \"${opt}\"." 1>&2 1.54 + echo "openpkg:ERROR: Run \"${0} --help\" for list of valid options" 1>&2; exit 1 ;; 1.55 + * ) break ;; 1.56 + esac 1.57 +done 1.58 + 1.59 +## 1.60 +## determine OpenPKG locations 1.61 +## 1.62 + 1.63 +# determine path to OpenPKG instance 1.64 +openpkg_prefix="@l_prefix@" 1.65 +if [ ".${OPENPKG_PREFIX}" != . ]; then 1.66 + openpkg_prefix="${OPENPKG_PREFIX}" 1.67 +fi 1.68 +if [ ".${opt_prefix}" != . ]; then 1.69 + openpkg_prefix="${opt_prefix}" 1.70 +fi 1.71 +if [ -x "${openpkg_prefix}/bin/openpkg" -a -x "${openpkg_prefix}/libexec/openpkg/rpm" ]; then 1.72 + # OpenPKG 2.0 and higher 1.73 + true 1.74 +elif [ -f "${openpkg_prefix}/bin/rpm" -a -x "${openpkg_prefix}/lib/openpkg/rpm" ]; then 1.75 + # OpenPKG 1.x 1.76 + echo "openpkg:ERROR: OpenPKG 1.x instance found under \"${openpkg_prefix}\" (not supported)" 1>&2 1.77 + exit 1 1.78 +else 1.79 + echo "openpkg:ERROR: no OpenPKG instance found under \"${openpkg_prefix}\"" 1>&2 1.80 + exit 1 1.81 +fi 1.82 + 1.83 +# allow convenient all-in-one specification of OpenPKG Tool Chain locations 1.84 +# (assuming the filesystem layout of an uninstalled OpenPKG Tool Chain) 1.85 +openpkg_tools="${OPENPKG_TOOLS}" 1.86 +openpkg_tools_cmdpath="${OPENPKG_TOOLS_CMDPATH}" 1.87 +openpkg_tools_apipath="${OPENPKG_TOOLS_APIPATH}" 1.88 +if [ ".${opt_tool}" != . ]; then 1.89 + openpkg_tools="${opt_tools}" 1.90 +fi 1.91 +if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_cmdpath}" = . ]; then 1.92 + openpkg_tools_cmdpath="${openpkg_tools}/cmd:@" 1.93 +fi 1.94 +if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_apipath}" = . ]; then 1.95 + openpkg_tools_apipath="${openpkg_tools}/api:@" 1.96 +fi 1.97 + 1.98 +# determine path to OpenPKG Tool Chain commands 1.99 +cmdpath="${openpkg_prefix}/libexec/openpkg" 1.100 +if [ -d "${openpkg_prefix}/libexec/openpkg-tools" ]; then 1.101 + # openpkg-tools package overrides 1.102 + cmdpath="${openpkg_prefix}/libexec/openpkg-tools:${cmdpath}" 1.103 +fi 1.104 +if [ -d "${openpkg_prefix}/libexec/openpkg-audit" ]; then 1.105 + # openpkg-audit package overrides 1.106 + cmdpath="${openpkg_prefix}/libexec/openpkg-audit:${cmdpath}" 1.107 +fi 1.108 +if [ ".${openpkg_tools_cmdpath}" != . ]; then 1.109 + # user supplied path overrides 1.110 + cmdpath=`echo "${openpkg_tools_cmdpath}" | sed -e "s;@;${cmdpath};"` 1.111 +fi 1.112 +openpkg_tools_cmdpath=`echo "${cmdpath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'` 1.113 + 1.114 +# determine path to OpenPKG Tool Chain API 1.115 +apipath="" 1.116 +if [ -d "${openpkg_prefix}/lib/openpkg-tools" ]; then 1.117 + # openpkg-tools package overrides 1.118 + apipath="${openpkg_prefix}/lib/openpkg-tools:${apipath}" 1.119 +fi 1.120 +if [ ".${openpkg_tools_apipath}" != . ]; then 1.121 + # user supplied path overrides 1.122 + apipath=`echo "${openpkg_tools_apipath}" | sed -e "s;@;${apipath};"` 1.123 +fi 1.124 +openpkg_tools_apipath=`echo "${apipath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'` 1.125 + 1.126 +## 1.127 +## execute stand-alone option commands in advance 1.128 +## 1.129 + 1.130 +# implement stand-alone "--help" option 1.131 +if [ ".${opt_help}" = .yes ]; then 1.132 + release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'` 1.133 + echo "" 1.134 + echo "This is ${release} <http://www.openpkg.org/>" 1.135 + echo "Cross-Platform Unix Software Packaging Facility" 1.136 + echo "" 1.137 + echo "Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>" 1.138 + echo "Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>" 1.139 + echo "" 1.140 + echo "The command \"${openpkg_prefix}/bin/openpkg\" is the official command-line" 1.141 + echo "execution frontend of the OpenPKG tool chain. Its usage is:" 1.142 + echo "" 1.143 + echo " \$ ${openpkg_prefix}/bin/openpkg [<option> ...] \\" 1.144 + echo " <command> [<command-option> ...] [<command-argument> ...]" 1.145 + echo "" 1.146 + echo "where <option> is one of the following global options:" 1.147 + echo " -p, --prefix sets the OpenPKG instance prefix (also: \${OPENPKG_PREFIX})" 1.148 + echo " -t, --tools sets the OpenPKG tool chain prefix (also: \${OPENPKG_TOOLS})" 1.149 + echo " -v, --version display OpenPKG version/release" 1.150 + echo " -h, --help display this usage help message" 1.151 + echo "" 1.152 + echo "where <command> is one of the following commands:" 1.153 + echo " rpm (provided by bootstrap package)" 1.154 + echo " rpmbuild (provided by bootstrap package)" 1.155 + echo " rpm2cpio (provided by bootstrap package)" 1.156 + echo " rpm-config (provided by bootstrap package)" 1.157 + echo " uuid (provided by bootstrap package)" 1.158 + echo " rc (provided by bootstrap package)" 1.159 + echo " lsync (provided by bootstrap package)" 1.160 + echo " man (provided by bootstrap package)" 1.161 + # install command intentionally left out in above display! 1.162 + 1.163 + # dynamically figure out add-on commands 1.164 + for cmd in rpm rpmbuild rpm2cpio rpm-config uuid rc lsync man install; do 1.165 + id=`echo "${cmd}" | sed -e 's/-/_/g'` 1.166 + eval "__cmd_seen_${id}=yes" 1.167 + done 1.168 + OIFS="${IFS}"; IFS=":" 1.169 + for dir in ${openpkg_tools_cmdpath}; do 1.170 + IFS="${OIFS}" 1.171 + if [ ! -d ${dir} ]; then 1.172 + continue 1.173 + fi 1.174 + for cmd in `cd ${dir} 2>/dev/null && echo *`; do 1.175 + name=`echo "${cmd}" | sed -e 's/\.sh$//' -e 's/\.pl$//' \ 1.176 + -e 's/^/X/' -e 's/^X\([a-z][a-zA-Z0-9_-]*\)$/\1/' -e 's/^X.*$//'` 1.177 + if [ ".${name}" != . ]; then 1.178 + if [ -f ${dir}/${cmd} ]; then 1.179 + id=`echo "${name}" | sed -e 's/-/_/g'` 1.180 + eval "seen=\$__cmd_seen_${id}" 1.181 + if [ ".${seen}" != .yes ]; then 1.182 + echo "${name}" | awk '{ printf(" %-15s (provided by add-on package)\n", $0); }' 1.183 + eval "__cmd_seen_${id}=yes" 1.184 + fi 1.185 + fi 1.186 + fi 1.187 + done 1.188 + done 1.189 + IFS="${OIFS}" 1.190 + echo "" 1.191 + echo "where <command-option> and <command-argument> are <command> specific" 1.192 + echo "options and arguments. Run \"${openpkg_prefix}/bin/openpkg <command> --help\"" 1.193 + echo "and \"${openpkg_prefix}/bin/openpkg man <command>\" for more details." 1.194 + echo "" 1.195 + exit 0 1.196 +fi 1.197 + 1.198 +# implement stand-alone "--version" option 1.199 +if [ ".${opt_version}" = .yes ]; then 1.200 + release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'` 1.201 + version=`${openpkg_prefix}/libexec/openpkg/rpm -q --qf '%{version}' openpkg` 1.202 + echo "${release} (${version})" 1.203 + exit 0 1.204 +fi 1.205 + 1.206 +## 1.207 +## determine command details and execute command appropriately 1.208 +## 1.209 + 1.210 +# command line sanity check 1.211 +if [ ${#} -eq 0 ]; then 1.212 + echo "openpkg:ERROR: Invalid command-line arguments." 1>&2 1.213 + echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid arguments." 1>&2 1.214 + exit 1 1.215 +fi 1.216 + 1.217 +# search command by iterating over all command directories 1.218 +cmd="${1}" 1.219 +shift 1.220 +cmd_path="" 1.221 +cmd_shell="" 1.222 +cmd_stack="${OPENPKG_TOOLS_CMDSTACK}" 1.223 +OIFS="${IFS}"; IFS=":" 1.224 +for dir in ${openpkg_tools_cmdpath}; do 1.225 + IFS="${OIFS}" 1.226 + 1.227 + # skip (currently) not existing directory 1.228 + if [ ! -d ${dir} ]; then 1.229 + continue 1.230 + fi 1.231 + 1.232 + # check for various command implementations 1.233 + if [ -x ${dir}/${cmd} ]; then 1.234 + # found executable stand-alone binary 1.235 + cmd_path="${dir}/${cmd}" 1.236 + cmd_shell="" 1.237 + elif [ -f ${dir}/${cmd}.sh ]; then 1.238 + # found non-executable Bourne-Shell script 1.239 + cmd_path="${dir}/${cmd}.sh" 1.240 + cmd_shell="${openpkg_prefix}/lib/openpkg/bash" 1.241 + elif [ -f ${dir}/${cmd}.pl ]; then 1.242 + # found non-executable Perl script 1.243 + cmd_path="${dir}/${cmd}.pl" 1.244 + if [ -x ${openpkg_prefix}/bin/perl ]; then 1.245 + cmd_shell="${openpkg_prefix}/bin/perl" 1.246 + else 1.247 + cmd_shell=`${openpkg_prefix}/lib/openpkg/shtool path -p "$PATH:$openpkg_prefix/lib/openpkg" -m perl 2>&1` 1.248 + if [ ".${cmd_shell}" = . ]; then 1.249 + echo "openpkg:ERROR: No Perl interpreter found in \${PATH}" 1>&2 1.250 + exit 1 1.251 + fi 1.252 + fi 1.253 + # provide Perl module include path(s) to API 1.254 + OIFS="${IFS}"; IFS=":" 1.255 + for dir2 in ${openpkg_tools_apipath}; do 1.256 + IFS="${OIFS}" 1.257 + if [ ! -d ${dir2} ]; then 1.258 + continue 1.259 + fi 1.260 + cmd_shell="${cmd_shell} -I${dir2}" 1.261 + done 1.262 + IFS="${OIFS}" 1.263 + else 1.264 + # command not found, continue searching 1.265 + continue 1.266 + fi 1.267 + 1.268 + # check whether to use this found command or to continue searching 1.269 + # for next command implementation in sequence (in order to support 1.270 + # flexible nested command wrapping) 1.271 + cmd_last=`echo "${cmd_stack}" | sed -e 's;:.*$;;'` 1.272 + if [ ".${cmd_last}" = ".${cmd}" ]; then 1.273 + # we were last command on stack, so pop us from call 1.274 + # stack and continue searching for next implementation 1.275 + cmd_stack=`echo "${cmd_stack}" | sed -e 's;^[^:][^:]*:*;;'` 1.276 + continue 1.277 + else 1.278 + # last command on stack was different, so stop 1.279 + # searching because we found the implementation 1.280 + break 1.281 + fi 1.282 +done 1.283 +IFS="${OIFS}" 1.284 + 1.285 +# sanity check search result 1.286 +if [ ".${cmd_path}" = . ]; then 1.287 + echo "openpkg:ERROR: No such command \"${cmd}\" found in command path" 1>&2 1.288 + echo "openpkg:ERROR: (${openpkg_tools_cmdpath})." 1>&2 1.289 + echo "openpkg:ERROR: Set \${OPENPKG_TOOLS_CMDPATH} appropriately." 1>&2 1.290 + echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid commands." 1>&2 1.291 + exit 1 1.292 +fi 1.293 + 1.294 +# export essential run-time information to command 1.295 +export OPENPKG_PREFIX="$openpkg_prefix" 1.296 +export OPENPKG_TOOLS_CMDPROG="${0}" 1.297 +export OPENPKG_TOOLS_CMDNAME="${cmd}" 1.298 +export OPENPKG_TOOLS_CMDSTACK=`echo "${OPENPKG_TOOLS_CMDSTACK}" | sed -e 's;^\(.\);:\1;' -e "s;^;${cmd};"` 1.299 + 1.300 +# execute command 1.301 +eval "exec ${cmd_shell} ${cmd_path} \${1+\"\$@\"}" 1.302 +