Whamcloud - gitweb
LU-16217 iokit: Add lst.sh wrapper and lst-survey
[fs/lustre-release.git] / contrib / lbuild / funcs.sh
1 cleanup() {
2
3     true
4 }
5
6 error() {
7     local msg="$1"
8
9     if [ -n "$msg" ]; then
10         echo -e "\n${0##*/}: $msg" >&$STDOUT
11     fi
12 }
13
14 fatal() {
15     cleanup
16     error "$2"
17     exit $1
18 }
19
20 #
21 # in a given directory, find the first rpm matching given requirements
22 #
23 find_rpm() {
24     local dir="$1"
25     local match_type="$2"
26     local match="$3"
27
28     pushd "$dir" > /dev/null || \
29         fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
30
31     local file
32     for file in $(ls *.rpm); do
33         if [ ! -f "$file" ]; then
34             continue
35         fi
36         case "$match_type" in
37             provides)
38                 # match is any valid ERE (i.e. given to egrep) match
39                 if rpm -q --provides -p "$file" 2>&$STDOUT | egrep "$match" >&$STDOUT; then
40                     echo "$file"
41                     popd >/dev/null
42                     return 0
43                 fi
44                 ;;
45             *)
46                 popd >/dev/null
47                 fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
48                 ;;
49         esac
50     done
51
52     popd >/dev/null
53     return 1
54 }
55
56 find_linux_rpms() {
57     local prefix="$1"
58     local pathtorpms=${2:-"$KERNELRPMSBASE/$lnxmaj/$DISTROMAJ/$TARGET_ARCH"}
59
60     local wanted_kernel="${lnxmaj}${lnxmin}-${lnxrel}${rpmfix}"
61     local kernel_rpms=$(find_linux_rpm "$prefix" "$pathtorpms")
62     # call a distro specific hook, if available
63     if type -p find_linux_rpms-$DISTROMAJ; then
64         local rpm
65         if rpm=$(find_linux_rpms-$DISTROMAJ "$prefix" "$wanted_kernel" "$pathtorpms"); then
66             kernel_rpms="$kernel_rpms $rpm"
67         else
68             return 255
69         fi
70     fi
71
72     echo "$kernel_rpms"
73     return 0
74
75 }
76
77 # a noop function which can be overridden by a distro method implementation
78 resolve_arch() {
79     local arch="$1"
80
81     echo "$arch"
82 }
83
84 # XXX this needs to be re-written as a wrapper around find_rpm
85 #     or just gotten rid of.  :-)
86 find_linux_rpm() {
87     local prefix="$1"
88     local pathtorpms=${2:-"$KERNELRPMSBASE/$lnxmaj/$DISTROMAJ/$TARGET_ARCH"}
89
90     local found_rpm=""
91     local wanted_kernel="${lnxmaj}${lnxmin}-${lnxrel}${rpmfix}"
92     local ret=1
93     if [ -d "$pathtorpms" ]; then
94         local rpm
95         for rpm in $(ls ${pathtorpms}/*.$(resolve_arch $TARGET_ARCH $PATCHLESS).rpm); do
96             if rpm -q --provides -p "$rpm" 2>&$STDOUT | grep -q "kernel${prefix} = $wanted_kernel" 2>&$STDOUT; then
97                 found_rpm="$rpm"
98                 ret=0
99                 break
100             fi
101         done
102     else
103         mkdir -p "$pathtorpms"
104     fi
105     # see above "XXX"
106     #     [ -f "$found_rpm" ] && break
107     # done
108     if [ -z "$found_rpm" ]; then
109         # see if there is a distro specific way of getting the RPM
110         if type -p find_linux_rpm-$DISTROMAJ; then
111             if found_rpm=$(find_linux_rpm-$DISTROMAJ "$prefix" "$wanted_kernel" "$pathtorpms"); then
112                 found_rpm="${pathtorpms}/$found_rpm"
113                 ret=0
114             else
115                 ret=${PIPESTATUS[0]}
116             fi
117         fi
118     fi
119
120     echo "$found_rpm"
121     return $ret
122
123 }
124
125 # autodetect used Distro
126 autodetect_distro() {
127
128     local name
129     local version
130
131     if which lsb_release >/dev/null 2>&1; then
132         name="$(lsb_release -s -i)"
133         version="$(lsb_release -s -r)"
134         case "$name" in
135             "EnterpriseEnterpriseServer")
136                 name="oel"
137                 ;;
138             "RedHatEnterpriseServer" | "ScientificSL" | "CentOS")
139                 name="rhel"
140                 ;;
141             "SUSE LINUX" | "SUSE")
142                 name="sles"
143                 case "$version" in
144                 *.*)    # $version already has patchlevel
145                         ;;
146                 *)      # add patchlevel
147                         PATCHLEVEL=$(sed -n -e 's/^PATCHLEVEL = //p' /etc/SuSE-release)
148                         if [ "$PATCHLEVEL" -ne "0" ]; then
149                                 version="${version}.$PATCHLEVEL"
150                         fi
151                         ;;
152                 esac
153                 ;;
154             "Fedora")
155                 name="fc"
156                 ;;
157             "openEuler")
158                 name="oe"
159                 # Change from YY.MM to YYMM, let DISTROMAJ contain MM part
160                 version=${version/./}
161                 ;;
162             *)
163                 fatal 1 "I don't know what distro name $name and version $version is.\nEither update autodetect_distro() or use the --distro argument."
164                 ;;
165         esac
166     else
167         error "You really ought to install lsb_release for accurate distro identification"
168         # try some heuristics
169         if [ -f /etc/SuSE-release ]; then
170             name=sles
171             version=$(sed -n -e 's/^VERSION = //p' /etc/SuSE-release)
172             PATCHLEVEL=$(sed -n -e 's/^PATCHLEVEL = //p' /etc/SuSE-release)
173             if [ "$PATCHLEVEL" -ne "0" ]; then
174                     version="${version}.$PATCHLEVEL"
175             fi
176         elif [ -f /etc/redhat-release ]; then
177                 #name=$(head -1 /etc/redhat-release)
178                 name=rhel
179                 version=$(cat /etc/redhat-release |
180                           sed -e 's/^[^0-9.]*//g' | sed -e 's/[ ].*//')
181         fi
182         if [ -z "$name" -o -z "$version" ]; then
183             fatal 1 "I don't know how to determine distro type/version.\nEither update autodetect_distro() or use the --distro argument."
184         fi
185     fi
186
187     echo ${name}-${version}
188     return 0
189
190 }
191
192 # autodetect target
193 autodetect_target() {
194     local distro="$1"
195
196     local target=""
197     case ${distro} in
198          rhel7*)  target="3.10-rhel7";;
199          rhel8*)  target="4.18-rhel8";;
200         rhel-9.0) target="5.14-rhel9.0";;
201         rhel-9.1) target="5.14-rhel9.1";;
202         sles11.4) target="$(uname -r | cut -d . -f 1,2)-sles11sp4";;
203         sles11.3) target="$(uname -r | cut -d . -f 1,2)-sles11sp3";;
204         sles11*)  target="$(uname -r | cut -d . -f 1,2)-sles11";;
205         sles12.5) target="$(uname -r | cut -d . -f 1,2)-sles12sp5";;
206         sles12.4) target="$(uname -r | cut -d . -f 1,2)-sles12sp4";;
207         sles12.3) target="$(uname -r | cut -d . -f 1,2)-sles12sp3";;
208         sles12*)  target="$(uname -r | cut -d . -f 1,2)-sles12";;
209         sles15.1) target="$(uname -r | cut -d . -f 1,2)-sles15sp1";;
210         sles15.2) target="$(uname -r | cut -d . -f 1,2)-sles15sp2";;
211         sles15.3) target="$(uname -r | cut -d . -f 1,2)-sles15sp3";;
212         sles15.4) target="$(uname -r | cut -d . -f 1,2)-sles15sp4";;
213           fc18)   target="3.x-fc18";;
214           oe2203) target="5.10-oe2203";;
215              *)   fatal 1 "I don't know what distro $distro is.\nEither update autodetect_target() or use the --target argument.";;
216     esac
217
218     echo ${target}
219     return 0
220
221 }