base-files: add update-alternatives call to default_{postinst,prerm}
[openwrt/staging/yousong.git] / package / base-files / files / lib / functions.sh
1 #!/bin/sh
2 # Copyright (C) 2006-2014 OpenWrt.org
3 # Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de>
4 # Copyright (C) 2010 Vertical Communications
5
6
7 debug () {
8 ${DEBUG:-:} "$@"
9 }
10
11 # newline
12 N="
13 "
14
15 _C=0
16 NO_EXPORT=1
17 LOAD_STATE=1
18 LIST_SEP=" "
19
20 append() {
21 local var="$1"
22 local value="$2"
23 local sep="${3:- }"
24
25 eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
26 }
27
28 list_contains() {
29 local var="$1"
30 local str="$2"
31 local val
32
33 eval "val=\" \${$var} \""
34 [ "${val%% $str *}" != "$val" ]
35 }
36
37 config_load() {
38 uci_load "$@"
39 }
40
41 reset_cb() {
42 config_cb() { return 0; }
43 option_cb() { return 0; }
44 list_cb() { return 0; }
45 }
46 reset_cb
47
48 package() {
49 return 0
50 }
51
52 config () {
53 local cfgtype="$1"
54 local name="$2"
55
56 export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))
57 name="${name:-cfg$CONFIG_NUM_SECTIONS}"
58 append CONFIG_SECTIONS "$name"
59 [ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"
60 export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"
61 export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"
62 }
63
64 option () {
65 local varname="$1"; shift
66 local value="$*"
67
68 export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"
69 [ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"
70 }
71
72 list() {
73 local varname="$1"; shift
74 local value="$*"
75 local len
76
77 config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0
78 [ $len = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}"
79 len=$(($len + 1))
80 config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value"
81 config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len"
82 append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP"
83 list_cb "$varname" "$*"
84 }
85
86 config_unset() {
87 config_set "$1" "$2" ""
88 }
89
90 # config_get <variable> <section> <option> [<default>]
91 # config_get <section> <option>
92 config_get() {
93 case "$3" in
94 "") eval echo "\${CONFIG_${1}_${2}:-\${4}}";;
95 *) eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";;
96 esac
97 }
98
99 # config_get_bool <variable> <section> <option> [<default>]
100 config_get_bool() {
101 local _tmp
102 config_get _tmp "$2" "$3" "$4"
103 case "$_tmp" in
104 1|on|true|yes|enabled) _tmp=1;;
105 0|off|false|no|disabled) _tmp=0;;
106 *) _tmp="$4";;
107 esac
108 export ${NO_EXPORT:+-n} "$1=$_tmp"
109 }
110
111 config_set() {
112 local section="$1"
113 local option="$2"
114 local value="$3"
115 local old_section="$CONFIG_SECTION"
116
117 CONFIG_SECTION="$section"
118 option "$option" "$value"
119 CONFIG_SECTION="$old_section"
120 }
121
122 config_foreach() {
123 local ___function="$1"
124 [ "$#" -ge 1 ] && shift
125 local ___type="$1"
126 [ "$#" -ge 1 ] && shift
127 local section cfgtype
128
129 [ -z "$CONFIG_SECTIONS" ] && return 0
130 for section in ${CONFIG_SECTIONS}; do
131 config_get cfgtype "$section" TYPE
132 [ -n "$___type" -a "x$cfgtype" != "x$___type" ] && continue
133 eval "$___function \"\$section\" \"\$@\""
134 done
135 }
136
137 config_list_foreach() {
138 [ "$#" -ge 3 ] || return 0
139 local section="$1"; shift
140 local option="$1"; shift
141 local function="$1"; shift
142 local val
143 local len
144 local c=1
145
146 config_get len "${section}" "${option}_LENGTH"
147 [ -z "$len" ] && return 0
148 while [ $c -le "$len" ]; do
149 config_get val "${section}" "${option}_ITEM$c"
150 eval "$function \"\$val\" \"\$@\""
151 c="$(($c + 1))"
152 done
153 }
154
155 insert_modules() {
156 for m in $*; do
157 if [ -f /etc/modules.d/$m ]; then
158 sed 's/^[^#]/insmod &/' /etc/modules.d/$m | ash 2>&- || :
159 else
160 modprobe $m
161 fi
162 done
163 }
164
165 default_prerm() {
166 local root="${IPKG_INSTROOT}"
167 local name
168
169 name=$(basename ${1%.*})
170 [ -f "$root/usr/lib/opkg/info/${name}.prerm-pkg" ] && . "$root/usr/lib/opkg/info/${name}.prerm-pkg"
171 check_update_alternatives remove "${name}"
172
173 local shell="$(which bash)"
174 for i in `cat "$root/usr/lib/opkg/info/${name}.list" | grep "^/etc/init.d/"`; do
175 if [ -n "$root" ]; then
176 ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" disable
177 else
178 if [ "$PKG_UPGRADE" != "1" ]; then
179 "$i" disable
180 fi
181 "$i" stop || /bin/true
182 fi
183 done
184 }
185
186 add_group_and_user() {
187 local pkgname="$1"
188 local rusers="$(sed -ne 's/^Require-User: *//p' $root/usr/lib/opkg/info/${pkgname}.control 2>/dev/null)"
189
190 if [ -n "$rusers" ]; then
191 local tuple oIFS="$IFS"
192 for tuple in $rusers; do
193 local uid gid uname gname
194
195 IFS=":"
196 set -- $tuple; uname="$1"; gname="$2"
197 IFS="="
198 set -- $uname; uname="$1"; uid="$2"
199 set -- $gname; gname="$1"; gid="$2"
200 IFS="$oIFS"
201
202 if [ -n "$gname" ] && [ -n "$gid" ]; then
203 group_exists "$gname" || group_add "$gname" "$gid"
204 elif [ -n "$gname" ]; then
205 group_add_next "$gname"; gid=$?
206 fi
207
208 if [ -n "$uname" ]; then
209 user_exists "$uname" || user_add "$uname" "$uid" "$gid"
210 fi
211
212 if [ -n "$uname" ] && [ -n "$gname" ]; then
213 group_add_user "$gname" "$uname"
214 fi
215
216 unset uid gid uname gname
217 done
218 fi
219 }
220
221 check_update_alternatives() {
222 local cmd="$1"
223 local pkgname="$2"
224 local altspecs="$(sed -ne 's/^Alternatives: *//p' $root/usr/lib/opkg/info/${pkgname}.control 2>/dev/null)"
225 local spec
226 local oIFS
227 local shell="$(which bash)"
228
229 shell="${shell:-/bin/sh}"
230 oIFS="$IFS"; IFS=", "
231 for spec in $altspecs; do
232 $shell ${IPKG_INSTROOT}/usr/sbin/update-alternatives "$cmd" --spec "$spec"
233 done
234 IFS="$oIFS"
235 }
236
237 default_postinst() {
238 local root="${IPKG_INSTROOT}"
239 local pkgname="$(basename ${1%.*})"
240 local ret=0
241
242 add_group_and_user "${pkgname}"
243 check_update_alternatives update "${pkgname}"
244
245 if [ -f "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" ]; then
246 ( . "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" )
247 ret=$?
248 fi
249
250 if [ -d "$root/rootfs-overlay" ]; then
251 cp -R $root/rootfs-overlay/. $root/
252 rm -fR $root/rootfs-overlay/
253 fi
254
255 if [ -z "$root" ] && grep -q -s "^/etc/uci-defaults/" "/usr/lib/opkg/info/${pkgname}.list"; then
256 . /lib/functions/system.sh
257 [ -d /tmp/.uci ] || mkdir -p /tmp/.uci
258 for i in $(sed -ne 's!^/etc/uci-defaults/!!p' "/usr/lib/opkg/info/${pkgname}.list"); do (
259 cd /etc/uci-defaults
260 [ -f "$i" ] && . "$i" && rm -f "$i"
261 ) done
262 uci commit
263 fi
264
265 [ -n "$root" ] || rm -f /tmp/luci-indexcache 2>/dev/null
266
267 local shell="$(which bash)"
268 for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
269 if [ -n "$root" ]; then
270 ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" enable
271 else
272 if [ "$PKG_UPGRADE" != "1" ]; then
273 "$i" enable
274 fi
275 "$i" start
276 fi
277 done
278
279 return $ret
280 }
281
282 include() {
283 local file
284
285 for file in $(ls $1/*.sh 2>/dev/null); do
286 . $file
287 done
288 }
289
290 find_mtd_index() {
291 local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
292 local INDEX="${PART##mtd}"
293
294 echo ${INDEX}
295 }
296
297 find_mtd_part() {
298 local INDEX=$(find_mtd_index "$1")
299 local PREFIX=/dev/mtdblock
300
301 [ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/
302 echo "${INDEX:+$PREFIX$INDEX}"
303 }
304
305 group_add() {
306 local name="$1"
307 local gid="$2"
308 local rc
309 [ -f "${IPKG_INSTROOT}/etc/group" ] || return 1
310 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/group
311 echo "${name}:x:${gid}:" >> ${IPKG_INSTROOT}/etc/group
312 rc=$?
313 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/group
314 return $rc
315 }
316
317 group_exists() {
318 grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/group
319 }
320
321 group_add_next() {
322 local gid gids
323 gid=$(grep -s "^${1}:" ${IPKG_INSTROOT}/etc/group | cut -d: -f3)
324 [ -n "$gid" ] && return $gid
325 gids=$(cat ${IPKG_INSTROOT}/etc/group | cut -d: -f3)
326 gid=100
327 while [ -n "$(echo $gids | grep $gid)" ] ; do
328 gid=$((gid + 1))
329 done
330 group_add $1 $gid
331 return $gid
332 }
333
334 group_add_user() {
335 local grp delim=","
336 grp=$(grep -s "^${1}:" ${IPKG_INSTROOT}/etc/group)
337 [ -z "$(echo $grp | cut -d: -f4 | grep $2)" ] || return
338 [ -n "$(echo $grp | grep ":$")" ] && delim=""
339 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd
340 sed -i "s/$grp/$grp$delim$2/g" ${IPKG_INSTROOT}/etc/group
341 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd
342 }
343
344 user_add() {
345 local name="${1}"
346 local uid="${2}"
347 local gid="${3}"
348 local desc="${4:-$1}"
349 local home="${5:-/var/run/$1}"
350 local shell="${6:-/bin/false}"
351 local rc
352 [ -z "$uid" ] && {
353 uids=$(cat ${IPKG_INSTROOT}/etc/passwd | cut -d: -f3)
354 uid=100
355 while [ -n "$(echo $uids | grep $uid)" ] ; do
356 uid=$((uid + 1))
357 done
358 }
359 [ -z "$gid" ] && gid=$uid
360 [ -f "${IPKG_INSTROOT}/etc/passwd" ] || return 1
361 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd
362 echo "${name}:x:${uid}:${gid}:${desc}:${home}:${shell}" >> ${IPKG_INSTROOT}/etc/passwd
363 echo "${name}:x:0:0:99999:7:::" >> ${IPKG_INSTROOT}/etc/shadow
364 rc=$?
365 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd
366 return $rc
367 }
368
369 user_exists() {
370 grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/passwd
371 }
372
373 . $IPKG_INSTROOT/lib/config/uci.sh