functions.sh 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. #!/bin/sh
  2. # Copyright (C) 2006 OpenWrt.org
  3. # Copyright (C) 2006 Fokus Fraunhofer <[email protected]>
  4. debug () {
  5. ${DEBUG:-:} "$@"
  6. }
  7. mount() {
  8. busybox mount "$@"
  9. }
  10. # newline
  11. N="
  12. "
  13. _C=0
  14. NO_EXPORT=1
  15. LOAD_STATE=1
  16. LIST_SEP=" "
  17. hotplug_dev() {
  18. env -i ACTION=$1 INTERFACE=$2 /sbin/hotplug-call net
  19. }
  20. append() {
  21. local var="$1"
  22. local value="$2"
  23. local sep="${3:- }"
  24. eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
  25. }
  26. list_contains() {
  27. local var="$1"
  28. local str="$2"
  29. local val
  30. eval "val=\" \${$var} \""
  31. [ "${val%% $str *}" != "$val" ]
  32. }
  33. list_remove() {
  34. local var="$1"
  35. local remove="$2"
  36. local val
  37. eval "val=\" \${$var} \""
  38. val1="${val%% $remove *}"
  39. [ "$val1" = "$val" ] && return
  40. val2="${val##* $remove }"
  41. [ "$val2" = "$val" ] && return
  42. val="${val1## } ${val2%% }"
  43. val="${val%% }"
  44. eval "export ${NO_EXPORT:+-n} -- \"$var=\$val\""
  45. }
  46. config_load() {
  47. [ -n "$IPKG_INSTROOT" ] && return 0
  48. uci_load "$@"
  49. }
  50. reset_cb() {
  51. config_cb() { return 0; }
  52. option_cb() { return 0; }
  53. list_cb() { return 0; }
  54. }
  55. reset_cb
  56. package() {
  57. return 0
  58. }
  59. config () {
  60. local cfgtype="$1"
  61. local name="$2"
  62. export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))
  63. name="${name:-cfg$CONFIG_NUM_SECTIONS}"
  64. append CONFIG_SECTIONS "$name"
  65. [ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"
  66. export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"
  67. export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"
  68. }
  69. option () {
  70. local varname="$1"; shift
  71. local value="$*"
  72. export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"
  73. [ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"
  74. }
  75. list() {
  76. local varname="$1"; shift
  77. local value="$*"
  78. local len
  79. config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0
  80. [ $len = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}"
  81. len=$(($len + 1))
  82. config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value"
  83. config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len"
  84. append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP"
  85. list_cb "$varname" "$*"
  86. }
  87. config_rename() {
  88. local OLD="$1"
  89. local NEW="$2"
  90. local oldvar
  91. local newvar
  92. [ -n "$OLD" -a -n "$NEW" ] || return
  93. for oldvar in `set | grep ^CONFIG_${OLD}_ | \
  94. sed -e 's/\(.*\)=.*$/\1/'` ; do
  95. newvar="CONFIG_${NEW}_${oldvar##CONFIG_${OLD}_}"
  96. eval "export ${NO_EXPORT:+-n} \"$newvar=\${$oldvar}\""
  97. unset "$oldvar"
  98. done
  99. export ${NO_EXPORT:+-n} CONFIG_SECTIONS="$(echo " $CONFIG_SECTIONS " | sed -e "s, $OLD , $NEW ,")"
  100. [ "$CONFIG_SECTION" = "$OLD" ] && export ${NO_EXPORT:+-n} CONFIG_SECTION="$NEW"
  101. }
  102. config_unset() {
  103. config_set "$1" "$2" ""
  104. }
  105. config_clear() {
  106. local SECTION="$1"
  107. local oldvar
  108. list_remove CONFIG_SECTIONS "$SECTION"
  109. export ${NO_EXPORT:+-n} CONFIG_SECTIONS="${SECTION:+$CONFIG_SECTIONS}"
  110. for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \
  111. sed -e 's/\(.*\)=.*$/\1/'` ; do
  112. unset $oldvar
  113. done
  114. }
  115. # config_get <variable> <section> <option> [<default>]
  116. # config_get <section> <option>
  117. config_get() {
  118. case "$3" in
  119. "") eval echo "\${CONFIG_${1}_${2}:-\${4}}";;
  120. *) eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";;
  121. esac
  122. }
  123. # config_get_bool <variable> <section> <option> [<default>]
  124. config_get_bool() {
  125. local _tmp
  126. config_get _tmp "$2" "$3" "$4"
  127. case "$_tmp" in
  128. 1|on|true|enabled) _tmp=1;;
  129. 0|off|false|disabled) _tmp=0;;
  130. *) _tmp="$4";;
  131. esac
  132. export ${NO_EXPORT:+-n} "$1=$_tmp"
  133. }
  134. config_set() {
  135. local section="$1"
  136. local option="$2"
  137. local value="$3"
  138. local old_section="$CONFIG_SECTION"
  139. CONFIG_SECTION="$section"
  140. option "$option" "$value"
  141. CONFIG_SECTION="$old_section"
  142. }
  143. config_foreach() {
  144. local function="$1"
  145. [ "$#" -ge 1 ] && shift
  146. local type="$1"
  147. [ "$#" -ge 1 ] && shift
  148. local section cfgtype
  149. [ -z "$CONFIG_SECTIONS" ] && return 0
  150. for section in ${CONFIG_SECTIONS}; do
  151. config_get cfgtype "$section" TYPE
  152. [ -n "$type" -a "x$cfgtype" != "x$type" ] && continue
  153. eval "$function \"\$section\" \"\$@\""
  154. done
  155. }
  156. config_list_foreach() {
  157. [ "$#" -ge 3 ] || return 0
  158. local section="$1"; shift
  159. local option="$1"; shift
  160. local function="$1"; shift
  161. local val
  162. local len
  163. local c=1
  164. config_get len "${section}" "${option}_LENGTH"
  165. [ -z "$len" ] && return 0
  166. while [ $c -le "$len" ]; do
  167. config_get val "${section}" "${option}_ITEM$c"
  168. eval "$function \"\$val\" \"$@\""
  169. c="$(($c + 1))"
  170. done
  171. }
  172. load_modules() {
  173. [ -d /etc/modules.d ] && {
  174. cd /etc/modules.d
  175. sed 's/^[^#]/insmod &/' $* | ash 2>&- || :
  176. }
  177. }
  178. include() {
  179. local file
  180. for file in $(ls $1/*.sh 2>/dev/null); do
  181. . $file
  182. done
  183. }
  184. find_mtd_part() {
  185. local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
  186. local PREFIX=/dev/mtdblock
  187. PART="${PART##mtd}"
  188. [ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/
  189. echo "${PART:+$PREFIX$PART}"
  190. }
  191. strtok() { # <string> { <variable> [<separator>] ... }
  192. local tmp
  193. local val="$1"
  194. local count=0
  195. shift
  196. while [ $# -gt 1 ]; do
  197. tmp="${val%%$2*}"
  198. [ "$tmp" = "$val" ] && break
  199. val="${val#$tmp$2}"
  200. export ${NO_EXPORT:+-n} "$1=$tmp"; count=$((count+1))
  201. shift 2
  202. done
  203. if [ $# -gt 0 -a -n "$val" ]; then
  204. export ${NO_EXPORT:+-n} "$1=$val"; count=$((count+1))
  205. fi
  206. return $count
  207. }
  208. jffs2_mark_erase() {
  209. local part="$(find_mtd_part "$1")"
  210. [ -z "$part" ] && {
  211. echo Partition not found.
  212. return 1
  213. }
  214. echo -e "\xde\xad\xc0\xde" | mtd -qq write - "$1"
  215. }
  216. uci_apply_defaults() {
  217. cd /etc/uci-defaults || return 0
  218. files="$(ls)"
  219. [ -z "$files" ] && return 0
  220. mkdir -p /tmp/.uci
  221. for file in $files; do
  222. ( . "./$(basename $file)" ) && rm -f "$file"
  223. done
  224. uci commit
  225. }
  226. service_kill() {
  227. local name="${1}"
  228. local pid="${2:-$(pidof "$name")}"
  229. local grace="${3:-5}"
  230. [ -f "$pid" ] && pid="$(head -n1 "$pid" 2>/dev/null)"
  231. for pid in $pid; do
  232. [ -d "/proc/$pid" ] || continue
  233. local try=0
  234. kill -TERM $pid 2>/dev/null && \
  235. while grep -qs "$name" "/proc/$pid/cmdline" && [ $((try++)) -lt $grace ]; do sleep 1; done
  236. kill -KILL $pid 2>/dev/null && \
  237. while grep -qs "$name" "/proc/$pid/cmdline"; do sleep 1; done
  238. done
  239. }
  240. pi_include() {
  241. if [ -f "/tmp/overlay/$1" ]; then
  242. . "/tmp/overlay/$1"
  243. elif [ -f "$1" ]; then
  244. . "$1"
  245. elif [ -d "/tmp/overlay/$1" ]; then
  246. if [ -n "$(ls /tmp/overlay/$1/*.sh 2>/dev/null)" ]; then
  247. for src_script in /tmp/overlay/$1/*.sh; do
  248. . "$src_script"
  249. done
  250. fi
  251. elif [ -d "$1" ]; then
  252. if [ -n "$(ls $1/*.sh 2>/dev/null)" ]; then
  253. for src_script in $1/*.sh; do
  254. . "$src_script"
  255. done
  256. fi
  257. else
  258. echo "WARNING: $1 not found"
  259. return 1
  260. fi
  261. return 0
  262. }
  263. [ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh