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

Reply via email to