With this patch you can auto-configure your router at the first boot by the MAC address or a random number.
To use it write a own config-package with a executable file paced in /etc/default/autoconf witch looks like this: config 'interface' 'lan' option 'netmask' '255.255.255.0' option 'ipaddr' "10.$LAN4.$LAN5.1" option 'ip6addr' "fdcc:93c9:77b3::$WLAN0_HEX_IPV6$WLAN1_HEX: ${WLAN2_HEX}ff:fe$WLAN3_HEX:$WLAN4_HEX$WLAN5_HEX/64" option 'dns' '85.214.73.63' For LAN MAC use LAN as varname prefix, for an random number use RAND.
Index: package/router-autoconf/files/autoconf.init =================================================================== --- package/router-autoconf/files/autoconf.init (Revision 0) +++ package/router-autoconf/files/autoconf.init (Revision 0) @@ -0,0 +1,349 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2009 Alina Friedrichsen <x-al...@gmx.net> + +START=39 +STOP=39 + +N=' +' +T=' ' + +validate_varname() +{ + local varname="$1" + + case "$varname" in + *[!0-9A-Za-z_]*|'') return 1;; + esac + + return 0 +} + +validate_cfgtype() +{ + local cfgtype="$1" + + case "$cfgtype" in + *[!0-9A-Za-z_-]*|'') return 1;; + esac + + return 0 +} + +get_wifi() +{ + local wifi + + wifi="$(LANG=C uci show wirele...@wifi-device[0] 2> /dev/null)" || return 1 + IFS='.=' + set -- $wifi + unset IFS + wifi="$2" + [ -z "$wifi" ] && return 1 + echo "$wifi" + + return 0 +} + +get_mac() +{ + local ifname="$1" + local mac + + mac="$(LANG=C ifconfig "$ifname" 2> /dev/null)" || return 1 + mac="$(echo "$mac" | sed -n -e 's/^.* HWaddr \([A-Fa-f0-9][A-Fa-f0-9][:-][A-Fa-f0-9][A-Fa-f0-9][:-][A-Fa-f0-9][A-Fa-f0-9][:-][A-Fa-f0-9][A-Fa-f0-9][:-][A-Fa-f0-9][A-Fa-f0-9][:-][A-Fa-f0-9][A-Fa-f0-9]\).*$/\1/p'| head -n 1 | tr -- '-' ':')" + [ -z "$mac" ] && return 1 + echo "$mac" + + return 0 +} + +boot() +{ + local autoconf= + if [ \! -s /etc/config/wireless ]; then + /sbin/wifi detect > /etc/config/wireless + autoconf=1 + fi + + local mac="$(hexdump -n 8 -- /dev/urandom | sed -e 's/^[0-9A-Fa-f]*//' | tr -d ' \t\n' | sed -e 's/\(..\)/\1 /g')" + IFS=' ' + set -- $mac + unset IFS + + RAND0="$(printf '%d' "0x$1")" + RAND1="$(printf '%d' "0x$2")" + RAND2="$(printf '%d' "0x$3")" + RAND3="$(printf '%d' "0x$4")" + RAND4="$(printf '%d' "0x$5")" + RAND5="$(printf '%d' "0x$6")" + RAND6="$(printf '%d' "0x$7")" + RAND7="$(printf '%d' "0x$8")" + + RAND0_HEX="$(printf '%02x' "0x$1")" + RAND1_HEX="$(printf '%02x' "0x$2")" + RAND2_HEX="$(printf '%02x' "0x$3")" + RAND3_HEX="$(printf '%02x' "0x$4")" + RAND4_HEX="$(printf '%02x' "0x$5")" + RAND5_HEX="$(printf '%02x' "0x$6")" + RAND6_HEX="$(printf '%02x' "0x$7")" + RAND7_HEX="$(printf '%02x' "0x$8")" + + RAND0_HEX_UPPERCASE="$(printf '%02X' "0x$1")" + RAND1_HEX_UPPERCASE="$(printf '%02X' "0x$2")" + RAND2_HEX_UPPERCASE="$(printf '%02X' "0x$3")" + RAND3_HEX_UPPERCASE="$(printf '%02X' "0x$4")" + RAND4_HEX_UPPERCASE="$(printf '%02X' "0x$5")" + RAND5_HEX_UPPERCASE="$(printf '%02X' "0x$6")" + RAND6_HEX_UPPERCASE="$(printf '%02X' "0x$7")" + RAND7_HEX_UPPERCASE="$(printf '%02X' "0x$8")" + + local wifi="$(get_wifi)" + mac="$(get_mac "$wifi")" || return 0 + IFS=':' + set -- $mac + unset IFS + + WLAN0="$(printf '%d' "0x$1")" + WLAN1="$(printf '%d' "0x$2")" + WLAN2="$(printf '%d' "0x$3")" + WLAN3="$(printf '%d' "0x$4")" + WLAN4="$(printf '%d' "0x$5")" + WLAN5="$(printf '%d' "0x$6")" + + WLAN0_HEX="$(printf '%02x' "0x$1")" + WLAN0_HEX_IPV6="$(printf '%02x' "$((WLAN0^0x2))")" + WLAN1_HEX="$(printf '%02x' "0x$2")" + WLAN2_HEX="$(printf '%02x' "0x$3")" + WLAN3_HEX="$(printf '%02x' "0x$4")" + WLAN4_HEX="$(printf '%02x' "0x$5")" + WLAN5_HEX="$(printf '%02x' "0x$6")" + + WLAN0_HEX_UPPERCASE="$(printf '%02X' "0x$1")" + WLAN0_HEX_UPPERCASE_IPV6="$(printf '%02X' "$((WLAN0^0x2))")" + WLAN1_HEX_UPPERCASE="$(printf '%02X' "0x$2")" + WLAN2_HEX_UPPERCASE="$(printf '%02X' "0x$3")" + WLAN3_HEX_UPPERCASE="$(printf '%02X' "0x$4")" + WLAN4_HEX_UPPERCASE="$(printf '%02X' "0x$5")" + WLAN5_HEX_UPPERCASE="$(printf '%02X' "0x$6")" + + mac="$(get_mac "eth0")" || return 0 + IFS=':' + set -- $mac + unset IFS + + LAN0="$(printf '%d' "0x$1")" + LAN1="$(printf '%d' "0x$2")" + LAN2="$(printf '%d' "0x$3")" + LAN3="$(printf '%d' "0x$4")" + LAN4="$(printf '%d' "0x$5")" + LAN5="$(printf '%d' "0x$6")" + + LAN0_HEX="$(printf '%02x' "0x$1")" + LAN0_HEX_IPV6="$(printf '%02x' "$((LAN0^0x2))")" + LAN1_HEX="$(printf '%02x' "0x$2")" + LAN2_HEX="$(printf '%02x' "0x$3")" + LAN3_HEX="$(printf '%02x' "0x$4")" + LAN4_HEX="$(printf '%02x' "0x$5")" + LAN5_HEX="$(printf '%02x' "0x$6")" + + LAN0_HEX_UPPERCASE="$(printf '%02X' "0x$1")" + LAN0_HEX_UPPERCASE_IPV6="$(printf '%02X' "$((LAN0^0x2))")" + LAN1_HEX_UPPERCASE="$(printf '%02X' "0x$2")" + LAN2_HEX_UPPERCASE="$(printf '%02X' "0x$3")" + LAN3_HEX_UPPERCASE="$(printf '%02X' "0x$4")" + LAN4_HEX_UPPERCASE="$(printf '%02X' "0x$5")" + LAN5_HEX_UPPERCASE="$(printf '%02X' "0x$6")" + + if [ x"$autoconf" != x ]; then + first_boot() + { + return 0 + } + + regular_boot() + { + return 0 + } + + package() + { + CONFIG_PACKAGE="$1" + CONFIG_INDEX=0 + + validate_varname "$CONFIG_PACKAGE" || CONFIG_PACKAGE= + + if [ x"$CONFIG_PACKAGE" = x ]; then + return 1 + fi + + if [ \! -e "/etc/config/$CONFIG_PACKAGE" ]; then + > "/etc/config/$CONFIG_PACKAGE" + fi + + return 0 + } + + config() + { + if [ x"$1" != x"$CONFIG_TYPE" ]; then + CONFIG_INDEX=0 + fi + + CONFIG_TYPE="$1" + CONFIG_SECTION="$2" + + if ! validate_cfgtype "$CONFIG_TYPE"; then + CONFIG_TYPE= + CONFIG_SECTION= + return 1 + fi + + if [ x"$CONFIG_PACKAGE" = x -o x"$CONFIG_TYPE" = x ]; then + return 1 + fi + + if [ x"$CONFIG_SECTION" = x ]; then + CONFIG_SECTION="@$CONFIG_TYPE[$CONFIG_INDEX]" + CONFIG_INDEX="$((CONFIG_INDEX + 1))" + + if ! uci -- get "$CONFIG_PACKAGE.$CONFIG_SECTION" > /dev/null 2> /dev/null; then + CONFIG_SECTION="$(uci -- add "$CONFIG_PACKAGE" "$CONFIG_TYPE")" || return 1 + fi + else + if ! validate_varname "$CONFIG_SECTION"; then + CONFIG_SECTION= + return 1; + fi + + uci -- set "$CONFIG_PACKAGE.$CONFIG_SECTION=$CONFIG_TYPE" || return 1 + fi + + return 0 + } + + option() + { + CONFIG_VARNAME="$1" + CONFIG_VALUE="$2" + + validate_varname "$CONFIG_VARNAME" || CONFIG_VARNAME= + + if [ x"$CONFIG_PACKAGE" = x -o x"$CONFIG_SECTION" = x -o x"$CONFIG_VARNAME" = x ]; then + return 1 + fi + + uci -- set "$CONFIG_PACKAGE.$CONFIG_SECTION.$CONFIG_VARNAME=$CONFIG_VALUE" || return 1 + + return 0 + } + + list() + { + CONFIG_VARNAME="$1" + CONFIG_VALUE="$2" + + validate_varname "$CONFIG_VARNAME" || CONFIG_VARNAME= + + if [ x"$CONFIG_PACKAGE" = x -o x"$CONFIG_SECTION" = x -o x"$CONFIG_VARNAME" = x ]; then + return 1 + fi + + uci -- add_list "$CONFIG_PACKAGE.$CONFIG_SECTION.$CONFIG_VARNAME=$CONFIG_VALUE" + + return 0 + } + + delete() + { + CONFIG_VARNAME="$1" + + if [ x"$CONFIG_PACKAGE" = x -o x"$CONFIG_SECTION" = x ]; then + return 1 + fi + + if [ x"$CONFIG_VARNAME" != x ]; then + validate_varname "$CONFIG_VARNAME" || return 1 + uci -- delete "$CONFIG_PACKAGE.$CONFIG_SECTION.$CONFIG_VARNAME" + else + uci -- delete "$CONFIG_PACKAGE.$CONFIG_SECTION" + fi + + return 0 + } + + if [ -e /etc/default/autoconf ]; then + FIRST_BOOT=1 + ROOT_PASSWD= + CONFIG_PACKAGE= + CONFIG_TYPE= + CONFIG_SECTION= + CONFIG_INDEX=0 + . /etc/default/autoconf + uci -- commit + + if [ x"$ROOT_PASSWD" != x ]; then + ( + sleep 1 + printf "%s\n" "$ROOT_PASSWD" + sleep 1 + printf "%s\n" "$ROOT_PASSWD" + ) | passwd + fi + fi + + first_boot + + uci -- get syst...@system[0].hostname > /proc/sys/kernel/hostname + /etc/init.d/network restart + + regular_boot + else + first_boot() + { + return 0 + } + + regular_boot() + { + return 0 + } + + package() + { + return 0 + } + + config() + { + return 0 + } + + option() + { + return 0 + } + + list() + { + return 0 + } + + if [ -e /etc/default/autoconf ]; then + FIRST_BOOT=0 + . /etc/default/autoconf + fi + + regular_boot + fi +} + +start() +{ + return 0 +} + +stop() +{ + return 0 +} Index: package/router-autoconf/Makefile =================================================================== --- package/router-autoconf/Makefile (Revision 0) +++ package/router-autoconf/Makefile (Revision 0) @@ -0,0 +1,30 @@ +# Copyright (C) 2008 Alina Friedrichsen <x-al...@gmx.net> + +include $(TOPDIR)/rules.mk + +PKG_NAME:=router-autoconf +PKG_VERSION:=0.1 +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/router-autoconf + SECTION:=net + CATEGORY:=Base system + DEPENDS:= + TITLE:=router auto-configuration +endef + +define Package/router-autoconf/conffiles +/etc/init.d/autoconf +endef + +define Build/Compile +endef + +define Package/router-autoconf/install + $(INSTALL_DIR) -- '$(1)/etc/init.d' + $(INSTALL_BIN) -- ./files/autoconf.init '$(1)/etc/init.d/autoconf' +endef + +$(eval $(call BuildPackage,router-autoconf))
_______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel