#!/bin/bash assert_is_app() { local check_link=yes local version= while getopts "Cv:" opt do case $opt in C) check_link=no ;; v) version=$OPTARG ;; esac done if [ ! -d .app ] then echo "This is not an app, missing directory: '.app'" >&2 exit 1 fi if [[ $check_link == yes ]] then if [ ! -e current ] then fatal "Missing 'current' link." >&2 fi fi if [[ $version != "" ]] then if [[ ! -d versions/$version ]] then fatal "No such version: $version" fi fi } debug() { [[ $echo_debug == no ]] || echo "D: $usage_app: $@" 2>&1 } info() { echo "I: $usage_app: $@" 2>&1 } fatal() { echo "$usage_app: fatal: $@" 2>&1 exit 1 } list_apps() { local filter_name=$1; shift local filter_instnace=$1; shift local vars="$@" sort $apps/.app/var/list | while read line do echo $line | (IFS=:; while read name instance version junk do if [ -n "$filter_name" -a "$filter_name" != "$name" ] then continue fi if [ -n "$filter_instance" -a "$filter_instance" != "$instance" ] then continue fi local line="" IFS=" "; for var in $vars do case $var in name) x=$name;; instance) x=$instance;; version) x=$version;; current_version) x=`find_current_version $name $instance`;; *) x="";; esac if [ -z "$line" ] then line="$line$x" else line="$line:$x" fi done echo $line done) done } find_current_version() { local name=$1 local instance=$2 if [ ! -L $apps/$name/$instance/current ] then return 0 fi ( cd $apps/$name/$instance ls -l current | sed -n "s,.* current -> versions/\(.*\)/root,\1,p" ) } find_versions() { local name="$1" local instance="$2" if [ ! -d $apps/$name/$instance/versions ] then return 0 fi ( cd $apps/$name/$instance/versions ls -1d * ) } grep_path() { local regex="$1"; shift local path="$1"; shift find `echo $path | tr : " "` -type f -executable 2>/dev/null | (egrep "$regex" || exit 0) # IFS=: # for x in $path # do # ls $x/* 2>/dev/null | while read f # do # if [[ $f =~ $regex ]] # then # echo $f # fi # done # done } # TODO: set ulimit # TODO: set umask # TODO: change group newgrp/sg # usage: run_app [-v version] [bin to execute] run_app() { version= while getopts "v:" opt do case $opt in v) version=$OPTARG shift 2 OPTIND=1 ;; esac done local bin=$1; shift local e=`app-cat-conf -f .app/config -n "env\..*" | cut -f 2- -d .` ( if [[ $version == "" ]] then assert_is_app cd current else assert_is_app -v "$version" cd "versions/$version" fi # This magically get the expansion of $u correct. IFS=" " # Set a default PATH which can be overridden by the application's settings set +e env -i \ PATH=/bin:/usr/bin \ $e \ PWD="$PWD" \ APPSH_HOME=$APPSH_HOME \ $bin "$@" local ret=$? set +x set -e exit $ret ) } ##################################################################### # Common init # Add the app-* apps to PATH. They're added last to allow the user to # overload their implementations. PATH=$PATH:$APPSH_HOME/bin:$APPSH_HOME/libexec # Save for later usage_app=${0##*/} echo_debug=${echo_debug-no}