| #!/usr/bin/env bash |
| |
| # **info.sh** |
| |
| # Produce a report on the state of DevStack installs |
| # |
| # Output fields are separated with '|' chars |
| # Output types are git,localrc,os,pip,pkg: |
| # |
| # git|<project>|<branch>[<shaq>] |
| # localrc|<var>=<value> |
| # os|<var>=<value> |
| # pip|<package>|<version> |
| # pkg|<package>|<version> |
| |
| function usage { |
| echo "$0 - Report on the DevStack configuration" |
| echo "" |
| echo "Usage: $0" |
| exit 1 |
| } |
| |
| if [ "$1" = "-h" ]; then |
| usage |
| fi |
| |
| # Keep track of the current directory |
| TOOLS_DIR=$(cd $(dirname "$0") && pwd) |
| TOP_DIR=$(cd $TOOLS_DIR/..; pwd) |
| cd $TOP_DIR |
| |
| # Import common functions |
| source $TOP_DIR/functions |
| |
| # Source params |
| source $TOP_DIR/stackrc |
| |
| DEST=${DEST:-/opt/stack} |
| FILES=$TOP_DIR/files |
| if [[ ! -d $FILES ]]; then |
| echo "ERROR: missing devstack/files - did you grab more than just stack.sh?" |
| exit 1 |
| fi |
| |
| |
| # OS |
| # -- |
| |
| # Determine what OS we're using |
| GetDistro |
| |
| echo "os|distro=$DISTRO" |
| echo "os|vendor=$os_VENDOR" |
| echo "os|release=$os_RELEASE" |
| |
| # Repos |
| # ----- |
| |
| # git_report <dir> |
| function git_report { |
| local dir=$1 |
| local proj ref branch head |
| if [[ -d $dir/.git ]]; then |
| pushd $dir >/dev/null |
| proj=$(basename $dir) |
| ref=$(git symbolic-ref HEAD) |
| branch=${ref##refs/heads/} |
| head=$(git show-branch --sha1-name $branch | cut -d' ' -f1) |
| echo "git|${proj}|${branch}${head}" |
| popd >/dev/null |
| fi |
| } |
| |
| for i in $DEST/*; do |
| if [[ -d $i ]]; then |
| git_report $i |
| fi |
| done |
| |
| |
| # Packages |
| # -------- |
| |
| # - Only check packages for the services enabled |
| # - Parse version info from the package metadata, not the package/file names |
| |
| for p in $(get_packages $ENABLED_SERVICES); do |
| if [[ "$os_PACKAGE" = "deb" ]]; then |
| ver=$(dpkg -s $p 2>/dev/null | grep '^Version: ' | cut -d' ' -f2) |
| elif [[ "$os_PACKAGE" = "rpm" ]]; then |
| ver=$(rpm -q --queryformat "%{VERSION}-%{RELEASE}\n" $p) |
| else |
| exit_distro_not_supported "finding version of a package" |
| fi |
| echo "pkg|${p}|${ver}" |
| done |
| |
| |
| # Pips |
| # ---- |
| |
| CMD_PIP=$(get_pip_command) |
| |
| # Pip tells us what is currently installed |
| FREEZE_FILE=$(mktemp --tmpdir freeze.XXXXXX) |
| $CMD_PIP freeze >$FREEZE_FILE 2>/dev/null |
| |
| # Loop through our requirements and look for matches |
| while read line; do |
| if [[ -n "$line" ]]; then |
| if [[ "$line" =~ \+(.*)@(.*)#egg=(.*) ]]; then |
| # Handle URLs |
| p=${BASH_REMATCH[1]} |
| ver=${BASH_REMATCH[2]} |
| elif [[ "$line" =~ (.*)[=\<\>]=(.*) ]]; then |
| # Normal pip packages |
| p=${BASH_REMATCH[1]} |
| ver=${BASH_REMATCH[2]} |
| else |
| # Unhandled format in freeze file |
| continue |
| fi |
| echo "pip|${p}|${ver}" |
| else |
| # No match in freeze file |
| continue |
| fi |
| done <$FREEZE_FILE |
| |
| rm $FREEZE_FILE |
| |
| |
| # localrc |
| # ------- |
| |
| # Dump localrc with 'localrc|' prepended and comments and passwords left out |
| if [[ -r $TOP_DIR/localrc ]]; then |
| RC=$TOP_DIR/localrc |
| elif [[ -f $RC_DIR/.localrc.auto ]]; then |
| RC=$TOP_DIR/.localrc.auto |
| fi |
| if [[ -n $RC ]]; then |
| sed -e ' |
| /^[ \t]*$/d; |
| /PASSWORD/s/=.*$/=\<password\>/; |
| /^#/d; |
| s/^/localrc\|/; |
| ' $RC |
| fi |