de3fa96730393b76e39bd4d3ea5f41a104c16b69
[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
172 local shell="$(which bash)"
173 for i in `cat "$root/usr/lib/opkg/info/${name}.list" | grep "^/etc/init.d/"`; do
174 if [ -n "$root" ]; then
175 ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" disable
176 else
177 if [ "$PKG_UPGRADE" != "1" ]; then
178 "$i" disable
179 fi
180 "$i" stop || /bin/true
181 fi
182 done
183 }
184
185 add_group_and_user() {
186 local pkgname="$1"
187 local rusers="$(sed -ne 's/^Require-User: *//p' $root/usr/lib/opkg/info/${pkgname}.control 2>/dev/null)"
188
189 if [ -n "$rusers" ]; then
190 local tuple oIFS="$IFS"
191 for tuple in $rusers; do
192 local uid gid uname gname
193
194 IFS=":"
195 set -- $tuple; uname="$1"; gname="$2"
196 IFS="="
197 set -- $uname; uname="$1"; uid="$2"
198 set -- $gname; gname="$1"; gid="$2"
199 IFS="$oIFS"
200
201 if [ -n "$gname" ] && [ -n "$gid" ]; then
202 group_exists "$gname" || group_add "$gname" "$gid"
203 elif [ -n "$gname" ]; then
204 group_add_next "$gname"; gid=$?
205 fi
206
207 if [ -n "$uname" ]; then
208 user_exists "$uname" || user_add "$uname" "$uid" "$gid"
209 fi
210
211 if [ -n "$uname" ] && [ -n "$gname" ]; then
212 group_add_user "$gname" "$uname"
213 fi
214
215 unset uid gid uname gname
216 done
217 fi
218 }
219
220 default_postinst() {
221 local root="${IPKG_INSTROOT}"
222 local pkgname="$(basename ${1%.*})"
223 local ret=0
224
225 add_group_and_user "${pkgname}"
226
227 if [ -f "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" ]; then
228 ( . "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" )
229 ret=$?
230 fi
231
232 if [ -d "$root/rootfs-overlay" ]; then
233 cp -R $root/rootfs-overlay/. $root/
234 rm -fR $root/rootfs-overlay/
235 fi
236
237 if [ -z "$root" ] && grep -q -s "^/etc/uci-defaults/" "/usr/lib/opkg/info/${pkgname}.list"; then
238 . /lib/functions/system.sh
239 [ -d /tmp/.uci ] || mkdir -p /tmp/.uci
240 for i in $(sed -ne 's!^/etc/uci-defaults/!!p' "/usr/lib/opkg/info/${pkgname}.list"); do (
241 cd /etc/uci-defaults
242 [ -f "$i" ] && . "$i" && rm -f "$i"
243 ) done
244 uci commit
245 fi
246
247 [ -n "$root" ] || rm -f /tmp/luci-indexcache 2>/dev/null
248
249 local shell="$(which bash)"
250 for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
251 if [ -n "$root" ]; then
252 ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" enable
253 else
254 if [ "$PKG_UPGRADE" != "1" ]; then
255 "$i" enable
256 fi
257 "$i" start
258 fi
259 done
260
261 return $ret
262 }
263
264 include() {
265 local file
266
267 for file in $(ls $1/*.sh 2>/dev/null); do
268 . $file
269 done
270 }
271
272 find_mtd_index() {
273 local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
274 local INDEX="${PART##mtd}"
275
276 echo ${INDEX}
277 }
278
279 find_mtd_part() {
280 local INDEX=$(find_mtd_index "$1")
281 local PREFIX=/dev/mtdblock
282
283 [ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/
284 echo "${INDEX:+$PREFIX$INDEX}"
285 }
286
287 group_add() {
288 local name="$1"
289 local gid="$2"
290 local rc
291 [ -f "${IPKG_INSTROOT}/etc/group" ] || return 1
292 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/group
293 echo "${name}:x:${gid}:" >> ${IPKG_INSTROOT}/etc/group
294 rc=$?
295 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/group
296 return $rc
297 }
298
299 group_exists() {
300 grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/group
301 }
302
303 group_add_next() {
304 local gid gids
305 gid=$(grep -s "^${1}:" ${IPKG_INSTROOT}/etc/group | cut -d: -f3)
306 [ -n "$gid" ] && return $gid
307 gids=$(cat ${IPKG_INSTROOT}/etc/group | cut -d: -f3)
308 gid=100
309 while [ -n "$(echo $gids | grep $gid)" ] ; do
310 gid=$((gid + 1))
311 done
312 group_add $1 $gid
313 return $gid
314 }
315
316 group_add_user() {
317 local grp delim=","
318 grp=$(grep -s "^${1}:" ${IPKG_INSTROOT}/etc/group)
319 [ -z "$(echo $grp | cut -d: -f4 | grep $2)" ] || return
320 [ -n "$(echo $grp | grep ":$")" ] && delim=""
321 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd
322 sed -i "s/$grp/$grp$delim$2/g" ${IPKG_INSTROOT}/etc/group
323 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd
324 }
325
326 user_add() {
327 local name="${1}"
328 local uid="${2}"
329 local gid="${3}"
330 local desc="${4:-$1}"
331 local home="${5:-/var/run/$1}"
332 local shell="${6:-/bin/false}"
333 local rc
334 [ -z "$uid" ] && {
335 uids=$(cat ${IPKG_INSTROOT}/etc/passwd | cut -d: -f3)
336 uid=100
337 while [ -n "$(echo $uids | grep $uid)" ] ; do
338 uid=$((uid + 1))
339 done
340 }
341 [ -z "$gid" ] && gid=$uid
342 [ -f "${IPKG_INSTROOT}/etc/passwd" ] || return 1
343 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd
344 echo "${name}:x:${uid}:${gid}:${desc}:${home}:${shell}" >> ${IPKG_INSTROOT}/etc/passwd
345 echo "${name}:x:0:0:99999:7:::" >> ${IPKG_INSTROOT}/etc/shadow
346 rc=$?
347 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd
348 return $rc
349 }
350
351 user_exists() {
352 grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/passwd
353 }
354
355 . $IPKG_INSTROOT/lib/config/uci.sh