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 <[email protected]>
+
+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 <[email protected]>
+
+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
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel