diff options
Diffstat (limited to 'package/base-files/files/lib/functions')
-rw-r--r-- | package/base-files/files/lib/functions/boot.sh | 150 | ||||
-rw-r--r-- | package/base-files/files/lib/functions/leds.sh | 68 | ||||
-rw-r--r-- | package/base-files/files/lib/functions/network.sh | 336 | ||||
-rw-r--r-- | package/base-files/files/lib/functions/uci-defaults.sh | 6 |
4 files changed, 333 insertions, 227 deletions
diff --git a/package/base-files/files/lib/functions/boot.sh b/package/base-files/files/lib/functions/boot.sh deleted file mode 100644 index 8c3f27ba4..000000000 --- a/package/base-files/files/lib/functions/boot.sh +++ /dev/null @@ -1,150 +0,0 @@ -#!/bin/sh -# Copyright (C) 2006-2010 OpenWrt.org -# Copyright (C) 2010 Vertical Communications - -mount() { - /bin/busybox mount -o noatime "$@" -} - -boot_hook_splice_start() { - export -n PI_HOOK_SPLICE=1 -} - -boot_hook_splice_finish() { - local hook - for hook in $PI_STACK_LIST; do - local v; eval "v=\${${hook}_splice:+\$${hook}_splice }$hook" - export -n "${hook}=${v% }" - export -n "${hook}_splice=" - done - export -n PI_HOOK_SPLICE= -} - -boot_hook_init() { - local hook="${1}_hook" - export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook" - export -n "$hook=" -} - -boot_hook_add() { - local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}" - local func="${2}" - - [ -n "$func" ] && { - local v; eval "v=\$$hook" - export -n "$hook=${v:+$v }$func" - } -} - -boot_hook_shift() { - local hook="${1}_hook" - local rvar="${2}" - - local v; eval "v=\$$hook" - [ -n "$v" ] && { - local first="${v%% *}" - - [ "$v" != "${v#* }" ] && \ - export -n "$hook=${v#* }" || \ - export -n "$hook=" - - export -n "$rvar=$first" - return 0 - } - - return 1 -} - -boot_run_hook() { - local hook="$1" - local func - - while boot_hook_shift "$hook" func; do - local ran; eval "ran=\$PI_RAN_$func" - [ -n "$ran" ] || { - export -n "PI_RAN_$func=1" - $func "$1" "$2" - } - done -} - -find_mtd_part() { - local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')" - local PREFIX=/dev/mtdblock - - PART="${PART##mtd}" - [ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/ - echo "${PART:+$PREFIX$PART}" -} - -jffs2_ready () { - mtdpart="$(find_mtd_part rootfs_data)" - [ -z "$mtdpart" ] && return 1 - magic=$(hexdump $mtdpart -n 4 -e '4/1 "%02x"') - [ "$magic" != "deadc0de" ] -} - -dupe() { # <new_root> <old_root> - cd $1 - echo -n "creating directories... " - { - cd $2 - find . -xdev -type d - echo "./dev ./overlay ./mnt ./proc ./tmp" - # xdev skips mounted directories - cd $1 - } | xargs mkdir -p - echo "done" - - echo -n "setting up symlinks... " - for file in $(cd $2; find . -xdev -type f;); do - case "$file" in - ./rom/note) ;; #nothing - ./etc/config*|\ - ./usr/lib/opkg/info/*) cp -af $2/$file $file;; - *) ln -sf /rom/${file#./*} $file;; - esac - done - for file in $(cd $2; find . -xdev -type l;); do - cp -af $2/${file#./*} $file - done - echo "done" -} - -pivot() { # <new_root> <old_root> - mount -o move /proc $1/proc && \ - pivot_root $1 $1$2 && { - mount -o move $2/dev /dev - mount -o move $2/tmp /tmp - mount -o move $2/sys /sys 2>&- - mount -o move $2/overlay /overlay 2>&- - return 0 - } -} - -fopivot() { # <rw_root> <ro_root> <dupe?> - root=$1 - { - if grep -q overlay /proc/filesystems; then - mount -t overlayfs -olowerdir=/,upperdir=$1 "overlayfs:$1" /mnt && root=/mnt - elif grep -q mini_fo /proc/filesystems; then - mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root=/mnt - else - mount --bind / /mnt - mount --bind -o union "$1" /mnt && root=/mnt - fi - } || { - [ "$3" = "1" ] && { - mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1 - dupe $1 $rom - } - } - pivot $root $2 -} - -ramoverlay() { - mkdir -p /tmp/root - mount -t tmpfs -o mode=0755 root /tmp/root - fopivot /tmp/root /rom 1 -} - diff --git a/package/base-files/files/lib/functions/leds.sh b/package/base-files/files/lib/functions/leds.sh new file mode 100644 index 000000000..743c7da78 --- /dev/null +++ b/package/base-files/files/lib/functions/leds.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# Copyright (C) 2013 OpenWrt.org + +led_set_attr() { + [ -f "/sys/class/leds/$1/$2" ] && echo "$3" > "/sys/class/leds/$1/$2" +} + +led_timer() { + led_set_attr $1 "trigger" "timer" + led_set_attr $1 "delay_on" "$2" + led_set_attr $1 "delay_off" "$3" +} + +led_on() { + led_set_attr $1 "trigger" "none" + led_set_attr $1 "brightness" 255 +} + +led_off() { + led_set_attr $1 "trigger" "none" + led_set_attr $1 "brightness" 0 +} + +led_morse() { + led_set_attr $1 "trigger" "morse" + led_set_attr $1 "delay" "$2" + led_set_attr $1 "message" "$3" +} + +status_led_set_timer() { + led_timer $status_led "$1" "$2" + [ -n "$status_led2" ] && led_timer $status_led2 "$1" "$2" +} + +status_led_set_heartbeat() { + led_set_attr $status_led "trigger" "heartbeat" +} + +status_led_set_morse() { + led_morse $status_led "$1" "$2" + [ -n "$status_led2" ] && led_morse $status_led2 "$1" "$2" +} + +status_led_on() { + led_on $status_led + [ -n "$status_led2" ] && led_on $status_led2 +} + +status_led_off() { + led_off $status_led + [ -n "$status_led2" ] && led_off $status_led2 +} + +status_led_blink_slow() { + led_timer $status_led 1000 1000 +} + +status_led_blink_fast() { + led_timer $status_led 100 100 +} + +status_led_blink_preinit() { + led_timer $status_led 200 200 +} + +status_led_blink_failsafe() { + led_timer $status_led 50 50 +} diff --git a/package/base-files/files/lib/functions/network.sh b/package/base-files/files/lib/functions/network.sh index d2d4aae0d..d86a504bf 100644 --- a/package/base-files/files/lib/functions/network.sh +++ b/package/base-files/files/lib/functions/network.sh @@ -1,127 +1,281 @@ . /usr/share/libubox/jshn.sh -__network_ipaddr() +__network_set_cache() { - local __var="$1" - local __iface="$2" - local __family="$3" - local __prefix="${4:-0}" + if [ -n "$3" ]; then + eval "export -- __NETWORK_CV_$1='$3'" + __NETWORK_CACHE="${__NETWORK_CACHE:+$__NETWORK_CACHE }__NETWORK_CV_$1" + elif json_get_var "__NETWORK_CV_$1" "$2"; then + __NETWORK_CACHE="${__NETWORK_CACHE:+$__NETWORK_CACHE }__NETWORK_CV_$1" + fi +} - local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)" +__network_export() +{ + local __v="__NETWORK_CV_$2" + eval "export -- \"$1=\${$__v:+\$$__v$3}\"; [ -n \"\${$__v+x}\" ]" +} + +__network_parse_ifstatus() +{ + local __iface="$1" + local __key="${__iface}" + local __tmp + local __old_ns - json_load "${__tmp:-{}}" - json_get_type __tmp "ipv${__family}_address" + __network_export __tmp "${__key}__parsed" && return 0 + __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)" + [ -n "$__tmp" ] || return 1 - if [ "$__tmp" = array ]; then + json_set_namespace "network" __old_ns + json_load "$__tmp" - json_select "ipv${__family}_address" - json_get_type __tmp 1 + __network_set_cache "${__key}__parsed" "" "1" - if [ "$__tmp" = object ]; then + for __tmp in "" "_inactive"; do - json_select 1 - json_get_var $__var address + __key="${__key}${__tmp}" - [ $__prefix -gt 0 ] && { - json_get_var __tmp mask - eval "export -- \"$__var=\${$__var}/$__tmp\"" - } + # parse addresses + local __family + for __family in 4 6; do + if json_is_a "ipv${__family}_address" array; then - return 0 + json_select "ipv${__family}_address" + + if json_is_a 1 object; then + + json_select 1 + __network_set_cache "${__key}_address${__family}" address + __network_set_cache "${__key}_mask${__family}" mask + json_select ".." + + fi + + json_select ".." + + fi + done + + # parse prefixes + if json_is_a "ipv6_prefix" array; then + json_select "ipv6_prefix" + + if json_is_a 1 object; then + json_select 1 + __network_set_cache "${__key}_prefix6_address" address + __network_set_cache "${__key}_prefix6_mask" mask + json_select ".." + fi + + json_select ".." fi - fi - return 1 -} + # parse routes + if json_is_a route array; then -network_get_ipaddr() { __network_ipaddr "$1" "$2" 4 0; } -network_get_ipaddr6() { __network_ipaddr "$1" "$2" 6 0; } + json_select "route" -network_get_subnet() { __network_ipaddr "$1" "$2" 4 1; } -network_get_subnet6() { __network_ipaddr "$1" "$2" 6 1; } + local __idx=1 + while json_is_a "$__idx" object; do + json_select "$((__idx++))" + json_get_var __tmp table -__network_gateway() + if [ -z "$__tmp" ]; then + json_get_var __tmp target + + case "${__tmp}" in + 0.0.0.0) + __network_set_cache "${__key}_gateway4" nexthop + ;; + ::) + __network_set_cache "${__key}_gateway6" nexthop + ;; + esac + fi + + json_select ".." + + done + + json_select ".." + + fi + + # parse dns info + local __field + for __field in "dns_server" "dns_search"; do + if json_is_a "$__field" array; then + + json_select "$__field" + + local __idx=1 + local __dns="" + + while json_is_a "$__idx" string; do + + json_get_var __tmp "$((__idx++))" + __dns="${__dns:+$__dns }$__tmp" + + done + + json_select ".." + + if [ -n "$__dns" ]; then + __network_set_cache "${__key}_${__field}" "" "$__dns" + fi + fi + done + + # parse up state, device and physdev + for __field in "up" "l3_device" "device"; do + if json_get_type __tmp "$__field"; then + __network_set_cache "${__key}_${__field}" "$__field" + fi + done + + # descend into inactive table + json_is_a "inactive" object && json_select "inactive" + + done + + json_cleanup + json_set_namespace "$__old_ns" + + return 0 +} + + +__network_ipaddr() { local __var="$1" local __iface="$2" local __family="$3" + local __prefix="$4" + local __tmp - local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)" - local __idx=1 - local __enabled + __network_parse_ifstatus "$__iface" || return 1 - json_load "${__tmp:-{}}" + if [ $__prefix -eq 1 ]; then + __network_export __tmp "${__iface}_mask${__family}" && \ + __network_export "$__var" "${__iface}_address${__family}" "/$__tmp" + return $? + fi - if json_get_type __tmp route && [ "$__tmp" = array ]; then + __network_export "$__var" "${__iface}_address${__family}" + return $? - json_select route +} - while json_get_type __tmp "$__idx" && [ "$__tmp" = object ]; do +# determine IPv4 address of given logical interface +# 1: destination variable +# 2: interface +network_get_ipaddr() { __network_ipaddr "$1" "$2" 4 0; } - json_select "$((__idx++))" - json_get_var __tmp target - json_get_var __enabled enabled +# determine IPv6 address of given logical interface +# 1: destination variable +# 2: interface +network_get_ipaddr6() { __network_ipaddr "$1" "$2" 6 0; } - case "${__enabled}/${__family}/${__tmp}" in - 1/4/0.0.0.0|1/6/::) - json_get_var "$__var" nexthop - return $? - ;; - esac +# determine IPv4 subnet of given logical interface +# 1: destination variable +# 2: interface +network_get_subnet() { __network_ipaddr "$1" "$2" 4 1; } - json_select ".." +# determine IPv6 subnet of given logical interface +# 1: destination variable +# 2: interface +network_get_subnet6() { __network_ipaddr "$1" "$2" 6 1; } - done - fi +# determine IPv6 prefix +network_get_prefix6() { + local __var="$1" + local __iface="$2" + local __address + local __mask - return 1 + __network_parse_ifstatus "$__iface" || return 1 + __network_export __mask "${__iface}_prefix6_mask" || return 1 + __network_export "$__var" "${__iface}_prefix6_address" "/$__mask" + return $? } -network_get_gateway() { __network_gateway "$1" "$2" 4; } -network_get_gateway6() { __network_gateway "$1" "$2" 6; } - -__network_dns() { +__network_gateway() +{ local __var="$1" local __iface="$2" - local __field="$3" + local __family="$3" + local __inactive="$4" - local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)" - local __dns="" - local __idx=1 + __network_parse_ifstatus "$__iface" || return 1 - json_load "${__tmp:-{}}" + if [ "$__inactive" = 1 -o "$__inactive" = "true" ]; then + __network_export "$__var" "${__iface}_inactive_gateway${__family}" && \ + return 0 + fi - if json_get_type __tmp "$__field" && [ "$__tmp" = array ]; then + __network_export "$__var" "${__iface}_gateway${__family}" + return $? +} - json_select "$__field" +# determine IPv4 gateway of given logical interface +# 1: destination variable +# 2: interface +# 3: consider inactive gateway if "true" (optional) +network_get_gateway() { __network_gateway "$1" "$2" 4 "${3:-0}"; } - while json_get_type __tmp "$__idx" && [ "$__tmp" = string ]; do +# determine IPv6 gateway of given logical interface +# 1: destination variable +# 2: interface +# 3: consider inactive gateway if "true" (optional) +network_get_gateway6() { __network_gateway "$1" "$2" 6 "${3:-0}"; } - json_get_var __tmp "$((__idx++))" - __dns="${__dns:+$__dns }$__tmp" - done +__network_dns() { + local __var="$1" + local __iface="$2" + local __field="$3" + local __inactive="$4" + + __network_parse_ifstatus "$__iface" || return 1 + + if [ "$__inactive" = 1 -o "$__inactive" = "true" ]; then + __network_export "$__var" "${__iface}_inactive_${__field}" && \ + return 0 fi - eval "export -- \"$__var=$__dns\"" - [ -n "$__dns" ] + __network_export "$__var" "${__iface}_${__field}" + return $? } -network_get_dnsserver() { __network_dns "$1" "$2" dns_server; } -network_get_dnssearch() { __network_dns "$1" "$2" dns_search; } +# determine the DNS servers of the given logical interface +# 1: destination variable +# 2: interface +# 3: consider inactive servers if "true" (optional) +network_get_dnsserver() { __network_dns "$1" "$2" dns_server "${3:-0}"; } + +# determine the domains of the given logical interface +# 1: destination variable +# 2: interface +# 3: consider inactive domains if "true" (optional) +network_get_dnssearch() { __network_dns "$1" "$2" dns_search "${3:-0}"; } -__network_wan() { +__network_wan() +{ local __var="$1" local __family="$2" + local __inactive="$3" local __iface for __iface in $(ubus list | sed -ne 's/^network\.interface\.//p'); do - if __network_gateway "$__var" "$__iface" "$__family"; then - eval "export -- \"$__var=$__iface\"" - return 0 + if [ "$__iface" != loopback ]; then + if __network_gateway "$__var" "$__iface" "$__family" "$__inactive"; then + eval "export -- \"$__var=$__iface\"" + return 0 + fi fi done @@ -129,8 +283,15 @@ __network_wan() { return 1 } -network_find_wan() { __network_wan "$1" 4; } -network_find_wan6() { __network_wan "$1" 6; } +# find the logical interface which holds the current IPv4 default route +# 1: destination variable +# 2: consider inactive default routes if "true" (optional) +network_find_wan() { __network_wan "$1" 4 "${2:-0}"; } + +# find the logical interface which holds the current IPv6 default route +# 1: destination variable +# 2: consider inactive dafault routes if "true" (optional) +network_find_wan6() { __network_wan "$1" 6 "${2:-0}"; } __network_device() @@ -139,20 +300,27 @@ __network_device() local __iface="$2" local __field="$3" - local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)" - [ -n "$__tmp" ] || return 1 - - json_load "$__tmp" - json_get_var "$__var" "$__field" + __network_parse_ifstatus "$__iface" || return 1 + __network_export "$__var" "${__iface}_${__field}" + return $? } +# test whether the given logical interface is running +# 1: interface network_is_up() { local __up __network_device __up "$1" up && [ $__up -eq 1 ] } +# determine the layer 3 linux network device of the given logical interface +# 1: destination variable +# 2: interface network_get_device() { __network_device "$1" "$2" l3_device; } + +# determine the layer 2 linux network device of the given logical interface +# 1: destination variable +# 2: interface network_get_physdev() { __network_device "$1" "$2" device; } @@ -168,5 +336,19 @@ __network_defer() ubus call network.device set_state "$(json_dump)" 2>/dev/null } +# defer netifd actions on the given linux network device +# 1: device name network_defer_device() { __network_defer "$1" 1; } + +# continue netifd actions on the given linux network device +# 1: device name network_ready_device() { __network_defer "$1" 0; } + +# flush the internal value cache to force re-reading values from ubus +network_flush_cache() +{ + local __tmp + for __tmp in $__NETWORK_CACHE __NETWORK_CACHE; do + unset "$__tmp" + done +} diff --git a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-files/files/lib/functions/uci-defaults.sh index 477c00cfd..bf6fe1e30 100644 --- a/package/base-files/files/lib/functions/uci-defaults.sh +++ b/package/base-files/files/lib/functions/uci-defaults.sh @@ -150,6 +150,8 @@ set network.loopback.ifname='lo' set network.loopback.proto='static' set network.loopback.ipaddr='127.0.0.1' set network.loopback.netmask='255.0.0.0' +set network.globals='globals' +set network.globals.ula_prefix='auto' EOF } @@ -174,6 +176,7 @@ set network.lan.type='bridge' set network.lan.proto='static' set network.lan.ipaddr='192.168.1.1' set network.lan.netmask='255.255.255.0' +set network.lan.ip6assign='60' EOF } @@ -184,6 +187,9 @@ ucidef_set_interface_wan() { set network.wan='interface' set network.wan.ifname='$ifname' set network.wan.proto='dhcp' +set network.wan6='interface' +set network.wan6.ifname='@wan' +set network.wan6.proto='dhcpv6' EOF } |