1#!/bin/sh 2# Copyright (C) 2006-2011 OpenWrt.org 3# Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de> 4 5 6debug () { 7 ${DEBUG:-:} "$@" 8} 9mount() { 10 busybox mount "$@" 11} 12 13# newline 14N=" 15" 16 17_C=0 18NO_EXPORT=1 19LOAD_STATE=1 20LIST_SEP=" " 21 22hotplug_dev() { 23 env -i ACTION=$1 INTERFACE=$2 /sbin/hotplug-call net 24} 25 26append() { 27 local var="$1" 28 local value="$2" 29 local sep="${3:- }" 30 31 eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\"" 32} 33 34list_contains() { 35 local var="$1" 36 local str="$2" 37 local val 38 39 eval "val=\" \${$var} \"" 40 [ "${val%% $str *}" != "$val" ] 41} 42 43list_remove() { 44 local var="$1" 45 local remove="$2" 46 local val 47 48 eval "val=\" \${$var} \"" 49 val1="${val%% $remove *}" 50 [ "$val1" = "$val" ] && return 51 val2="${val##* $remove }" 52 [ "$val2" = "$val" ] && return 53 val="${val1## } ${val2%% }" 54 val="${val%% }" 55 eval "export ${NO_EXPORT:+-n} -- \"$var=\$val\"" 56} 57 58config_load() { 59 [ -n "$IPKG_INSTROOT" ] && return 0 60 uci_load "$@" 61} 62 63reset_cb() { 64 config_cb() { return 0; } 65 option_cb() { return 0; } 66 list_cb() { return 0; } 67} 68reset_cb 69 70package() { 71 return 0 72} 73 74config () { 75 local cfgtype="$1" 76 local name="$2" 77 78 export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1)) 79 name="${name:-cfg$CONFIG_NUM_SECTIONS}" 80 append CONFIG_SECTIONS "$name" 81 [ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name" 82 export ${NO_EXPORT:+-n} CONFIG_SECTION="$name" 83 export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype" 84} 85 86option () { 87 local varname="$1"; shift 88 local value="$*" 89 90 export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value" 91 [ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*" 92} 93 94list() { 95 local varname="$1"; shift 96 local value="$*" 97 local len 98 99 config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0 100 [ $len = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}" 101 len=$(($len + 1)) 102 config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value" 103 config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len" 104 append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP" 105 list_cb "$varname" "$*" 106} 107 108config_rename() { 109 local OLD="$1" 110 local NEW="$2" 111 local oldvar 112 local newvar 113 114 [ -n "$OLD" -a -n "$NEW" ] || return 115 for oldvar in `set | grep ^CONFIG_${OLD}_ | \ 116 sed -e 's/\(.*\)=.*$/\1/'` ; do 117 newvar="CONFIG_${NEW}_${oldvar##CONFIG_${OLD}_}" 118 eval "export ${NO_EXPORT:+-n} \"$newvar=\${$oldvar}\"" 119 unset "$oldvar" 120 done 121 export ${NO_EXPORT:+-n} CONFIG_SECTIONS="$(echo " $CONFIG_SECTIONS " | sed -e "s, $OLD , $NEW ,")" 122 123 [ "$CONFIG_SECTION" = "$OLD" ] && export ${NO_EXPORT:+-n} CONFIG_SECTION="$NEW" 124} 125 126config_unset() { 127 config_set "$1" "$2" "" 128} 129 130config_clear() { 131 local SECTION="$1" 132 local oldvar 133 134 list_remove CONFIG_SECTIONS "$SECTION" 135 export ${NO_EXPORT:+-n} CONFIG_SECTIONS="${SECTION:+$CONFIG_SECTIONS}" 136 137 for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \ 138 sed -e 's/\(.*\)=.*$/\1/'` ; do 139 unset $oldvar 140 done 141} 142 143# config_get <variable> <section> <option> [<default>] 144# config_get <section> <option> 145config_get() { 146 case "$3" in 147 "") eval echo "\${CONFIG_${1}_${2}:-\${4}}";; 148 *) eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";; 149 esac 150} 151 152# config_get_bool <variable> <section> <option> [<default>] 153config_get_bool() { 154 local _tmp 155 config_get _tmp "$2" "$3" "$4" 156 case "$_tmp" in 157 1|on|true|enabled) _tmp=1;; 158 0|off|false|disabled) _tmp=0;; 159 *) _tmp="$4";; 160 esac 161 export ${NO_EXPORT:+-n} "$1=$_tmp" 162} 163 164config_set() { 165 local section="$1" 166 local option="$2" 167 local value="$3" 168 local old_section="$CONFIG_SECTION" 169 170 CONFIG_SECTION="$section" 171 option "$option" "$value" 172 CONFIG_SECTION="$old_section" 173} 174 175config_foreach() { 176 local ___function="$1" 177 [ "$#" -ge 1 ] && shift 178 local ___type="$1" 179 [ "$#" -ge 1 ] && shift 180 local section cfgtype 181 182 [ -z "$CONFIG_SECTIONS" ] && return 0 183 for section in ${CONFIG_SECTIONS}; do 184 config_get cfgtype "$section" TYPE 185 [ -n "$___type" -a "x$cfgtype" != "x$___type" ] && continue 186 eval "$___function \"\$section\" \"\$@\"" 187 done 188} 189 190config_list_foreach() { 191 [ "$#" -ge 3 ] || return 0 192 local section="$1"; shift 193 local option="$1"; shift 194 local function="$1"; shift 195 local val 196 local len 197 local c=1 198 199 config_get len "${section}" "${option}_LENGTH" 200 [ -z "$len" ] && return 0 201 while [ $c -le "$len" ]; do 202 config_get val "${section}" "${option}_ITEM$c" 203 eval "$function \"\$val\" \"$@\"" 204 c="$(($c + 1))" 205 done 206} 207 208load_modules() { 209 [ -d /etc/modules.d ] && { 210 cd /etc/modules.d 211 sed 's/^[^#]/insmod &/' $* | ash 2>&- || : 212 } 213} 214 215include() { 216 local file 217 218 for file in $(ls $1/*.sh 2>/dev/null); do 219 . $file 220 done 221} 222 223find_mtd_part() { 224 local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')" 225 local PREFIX=/dev/mtdblock 226 227 PART="${PART##mtd}" 228 [ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/ 229 echo "${PART:+$PREFIX$PART}" 230} 231 232strtok() { # <string> { <variable> [<separator>] ... } 233 local tmp 234 local val="$1" 235 local count=0 236 237 shift 238 239 while [ $# -gt 1 ]; do 240 tmp="${val%%$2*}" 241 242 [ "$tmp" = "$val" ] && break 243 244 val="${val#$tmp$2}" 245 246 export ${NO_EXPORT:+-n} "$1=$tmp"; count=$((count+1)) 247 shift 2 248 done 249 250 if [ $# -gt 0 -a -n "$val" ]; then 251 export ${NO_EXPORT:+-n} "$1=$val"; count=$((count+1)) 252 fi 253 254 return $count 255} 256 257 258jffs2_mark_erase() { 259 local part="$(find_mtd_part "$1")" 260 [ -z "$part" ] && { 261 echo Partition not found. 262 return 1 263 } 264 echo -e "\xde\xad\xc0\xde" | mtd -qq write - "$1" 265} 266 267uci_apply_defaults() { 268 cd /etc/uci-defaults || return 0 269 files="$(ls)" 270 [ -z "$files" ] && return 0 271 mkdir -p /tmp/.uci 272 for file in $files; do 273 ( . "./$(basename $file)" ) && rm -f "$file" 274 done 275 uci commit 276} 277 278group_add() { 279 local name="$1" 280 local gid="$2" 281 local rc 282 [ -f "${IPKG_INSTROOT}/etc/group" ] || return 1 283 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/group 284 echo "${name}:x:${gid}:" >> ${IPKG_INSTROOT}/etc/group 285 rc=$? 286 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/group 287 return $rc 288} 289 290group_exists() { 291 grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/group 292} 293 294user_add() { 295 local name="${1}" 296 local uid="${2}" 297 local gid="${3:-$2}" 298 local desc="${4:-$1}" 299 local home="${5:-/var/run/$1}" 300 local shell="${6:-/bin/false}" 301 local rc 302 [ -f "${IPKG_INSTROOT}/etc/passwd" ] || return 1 303 [ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd 304 echo "${name}:x:${uid}:${gid}:${desc}:${home}:${shell}" >> ${IPKG_INSTROOT}/etc/passwd 305 echo "${name}:x:0:0:99999:7:::" >> ${IPKG_INSTROOT}/etc/shadow 306 rc=$? 307 [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd 308 return $rc 309} 310 311user_exists() { 312 grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/passwd 313} 314 315 316pi_include() { 317 if [ -f "/tmp/overlay/$1" ]; then 318 . "/tmp/overlay/$1" 319 elif [ -f "$1" ]; then 320 . "$1" 321 elif [ -d "/tmp/overlay/$1" ]; then 322 if [ -n "$(ls /tmp/overlay/$1/*.sh 2>/dev/null)" ]; then 323 for src_script in /tmp/overlay/$1/*.sh; do 324 . "$src_script" 325 done 326 fi 327 elif [ -d "$1" ]; then 328 if [ -n "$(ls $1/*.sh 2>/dev/null)" ]; then 329 for src_script in $1/*.sh; do 330 . "$src_script" 331 done 332 fi 333 else 334 echo "WARNING: $1 not found" 335 return 1 336 fi 337 return 0 338} 339 340[ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh 341