~devstack-core/devstack/github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/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>]
#   localtc|<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"
if [ -n "$os_UPDATE" ]; then
    echo "os|version=$os_UPDATE"
fi


# 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