-
Notifications
You must be signed in to change notification settings - Fork 65
/
Copy pathinfo.sh
executable file
·159 lines (129 loc) · 3.31 KB
/
info.sh
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
154
155
156
157
158
159
#!/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
# --------
# - We are going to check packages only for the services needed.
# - We are parsing the packages files and detecting metadatas.
if is_ubuntu; then
PKG_DIR=$FILES/apts
elif is_fedora; then
PKG_DIR=$FILES/rpms
elif is_suse; then
PKG_DIR=$FILES/rpms-suse
else
exit_distro_not_supported "list of packages"
fi
for p in $(get_packages $PKG_DIR); 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
#echo "unknown: $p"
continue
fi
echo "pip|${p}|${ver}"
else
# No match in freeze file
#echo "unknown: $p"
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
sed -e '
/PASSWORD/d;
/^#/d;
s/^/localrc\|/;
' $TOP_DIR/localrc
fi