= What is the NodeConfig script? = use this NodeConfig scripts to easily change the configuration of any number of nodes. Just connect all nodes over the cabled ethernet network, note all the mac-addresses of the nodes you want to configure, and run the available scripts configure all of those. usage of the attached scripts: ../telnet-loop.sh nodetable.csv nodeconfigscript will connect to all nodes (one-by-one), listed in the nodetable.csv (mac-addresses, etc.) execute the nodeconfigscript _on the node. It is using the telnet daemon running on the nodes to connect. the variant ssh-loop.sh uses ssh to connect to the nodes -- use ssh keys to connect without having to enter passwords... use copy-loop.sh to copy files over to all of the nodes listed in your table. = Files = <> = Basic configuration = * [[BattleMeshV3/NodeConfigScript/Zlan]] is a general configuration (gateway to the internet on wired side etc) * [[BattleMeshV3/NodeConfigScript/Olsr]] configuration of basic olsr node * [[BattleMeshV3/NodeConfigScript/Babel]] configuration of babel node * [[BattleMeshV3/NodeConfigScript/Batman]] configuration of batman node = Snippets = usefull short fragments of code to script the configuration -- we use the 'uci' command to set the system configuration, as it is standard on openwrt and easy to use command line tool. == using parameters == the 'node-configuration-factory' parses the node table, and exports the parameters specified using the variable names @PARAM0@ to @PARAM9@ -- use these in your scripts for node specific parameters. eg. if you specified an ip address in the 4th column {{{ IP="@PARAM3@" }}} == setting hostname == {{{ set -a NAME="@PARAM1@" sysctl -w kernel.hostname=$NAME uci set system.@system[0].hostname=$NAME uci commit }}} == wireless device name == the wireless device has different names on different types of devices -- you can query the name from the uci system (it's typically 'wifi0' or 'radio0') {{{ DEVICE=`uci get wireless.@wifi-iface[0].device` }}} and then use it further in your script, eg. {{{ uci set wireless.$DEVICE.channel=4 }}} == configure wireless interface == {{{ set -a # adapt PARAM2 to the parameter in your node table IP="@PARAM2@" #query wireless device' name DEVICE=`uci get wireless.@wifi-iface[0].device` uci set wireless.$DEVICE.channel=5 uci set wireless.$DEVICE.disabled=0 uci set wireless.$DEVICE.hwmode=11g uci set wireless.@wifi-iface[0].network=wlan uci set wireless.@wifi-iface[0].mode=adhoc uci set wireless.@wifi-iface[0].ssid=WBM2009v2-Test0 uci set wireless.@wifi-iface[0].encryption=none uci set wireless.@wifi-iface[0].bssid=02:ca:fe:ca:ca:00 uci set wireless.@wifi-iface[0].rate=54M uci set wireless.@wifi-iface[0].bgscan=0 uci set network.wlan=interface uci set network.wlan.proto=static uci set network.wlan.ipaddr=$IP uci set network.wlan.netmask=255.255.255.0 # commit uci changes and restart wifi uci commit wireless && wifi }}} == disabling dnsmasq, firewall, httpd == {{{ set -a /etc/init.d/dnsmasq stop /etc/init.d/dnsmasq disable /etc/init.d/firewall stop /etc/init.d/firewall disable /etc/init.d/httpd stop /etc/init.d/httpd disable }}} == configuring an alias ethernet interface == as it is mandatory to keep the wired interface configured with it's default settings (ip 192.168.1.1/24) for the node-configuration-factory to work -- you need to configure an alias interface if you want to use the ethernet interface with other configuration settings. eg. {{{ WIREDIP="@PARAM2@" uci set network.zlan=alias uci set network.zlan.interface=lan uci set network.zlan.proto=static uci set network.zlan.ipaddr=$WIREDIP uci set network.zlan.netmask=255.255.255.0 uci commit }}} == rc.local == executing commands after booting -- quick and dirty eg. (PARAM7 parameter contained a static routing configuration in this case: 'route add -net 192.168.3.0/24 gw 192.168.13.1 && route add -net 192.168.13.0/24 gw 192.168.4.1' ) {{{ cat > /etc/rc.local << EOF echo 1 > /proc/sys/net/ipv4/ip_forward eval "@PARAM7@" exit 0 EOF }}} == reset a configured node to default config == a neat, easy and clean way to reset a node is to use a feature of the squashfs+jffs filesystem: the squashfs partition contains the pristine install, while the jffs contains all configuration and added packages. executing the openwrt command {{{ firstboot }}} will cleanup the jffs partition and reset the configuration to its initial state