From 4ed949bf9a7422c562d46df51575d6536b64c448 Mon Sep 17 00:00:00 2001 From: vpeter4 Date: Mon, 30 Jul 2012 21:12:18 +0300 Subject: [PATCH] connman: rework network initscript --- packages/network/connman/init.d/21_network | 389 ++++++++++++--------- 1 file changed, 228 insertions(+), 161 deletions(-) diff --git a/packages/network/connman/init.d/21_network b/packages/network/connman/init.d/21_network index 27e9379fc1..683135989d 100644 --- a/packages/network/connman/init.d/21_network +++ b/packages/network/connman/init.d/21_network @@ -22,188 +22,255 @@ # # runlevels: openelec, installer, textmode -if [ -f /var/config/settings.conf ]; then - . /var/config/settings.conf +connman_state() { + local dbus_reply="$(mktemp)" + if [ -z "$1" ]; then + dbus-send --system --type=method_call --print-reply --dest=net.connman / net.connman.Manager.GetProperties >$dbus_reply 2>/dev/null + else + dbus-send --system --type=method_call --print-reply --dest=net.connman /net/connman/service/$1 net.connman.Service.GetProperties >$dbus_reply 2>/dev/null + fi -# save original interface names (eth0, eth1) - NET_IFACE_NAME=$NET_IFACE - NET2_IFACE_NAME=$NET2_IFACE -fi + ret=$(awk ' + /string *"State"/ { + getline line + if (line ~ /string "/){ + sub(/.*string "/, "", line) + sub(/"/, "", line) + print line + break + } + } +' $dbus_reply) -[ -z "$NET_HOSTNAME" ] && NET_HOSTNAME="openelec" + rm -f $dbus_reply + echo $ret +} -# setup hostname +set_basic() { + # run it from here too - debugging + if [ -f /etc/init.d/06_systemconfig ]; then + . /etc/init.d/06_systemconfig + fi + + if [ -f /var/config/settings.conf ]; then + . /var/config/settings.conf + fi + + [ -z "$NET_HOSTNAME" ] && NET_HOSTNAME="openelec" + + # setup hostname progress "Setup hostname" echo "$NET_HOSTNAME" > /proc/sys/kernel/hostname -# create /etc/hosts file, useful for gethostbyname(localhost) + # create /etc/hosts file, useful for gethostbyname(localhost) progress "creating /etc/hosts" echo -e "127.0.0.1\tlocalhost $NET_HOSTNAME" > /etc/hosts -# starting loopback device + # starting loopback device ifconfig lo up -# add user defined hosts.conf entry's + # add user defined hosts.conf entry's [ -f $HOME/.config/hosts.conf ] && cat $HOME/.config/hosts.conf >> /etc/hosts -( - # setup Networking 1 - progress "setup Networking 1" + CONNMAN_SETTINGS="/var/lib/connman/settings" - CONNMAN_PROFILE="/var/lib/connman/default.profile" + rm -rf /var/lib/connman + mkdir -p /var/lib/connman + mkdir -p /var/run/connman - mkdir -p /var/run/connman - mkdir -p /var/lib/connman - - # NETWORK 1: ( LAN / WLAN ) - for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do - if [ ! -f /sys/class/net/$NET_IFACE/address ]; then - logger -t Connman "### [$i] cannot find /sys/class/net/$NET_IFACE/address ###" - else - logger -t Connman "### [$i] found /sys/class/net/$NET_IFACE/address, continue ###" - NET_IFACE=`cat /sys/class/net/$NET_IFACE/address | sed 's/://g'` - break - fi - usleep 500000 - done - - if [ "$NET_NETWORK" = "WLAN" -a -n "$NET_SSID" ]; then - NET_SSID_HEX=`echo -n "$NET_SSID" | od -tx1 | cut -c8-| tr -d ' \n'` - - # NET_SECURITY: ( NONE / WEP / WPA/WPA2 ) - if [ "$NET_SECURITY" = "WEP" -a -n "$NET_PASSPHRASE" ]; then - MODE="managed_wep" - elif [ "$NET_SECURITY" = "WPA/WPA2" -a -n "$NET_PASSPHRASE" ]; then - MODE="managed_psk" - else - MODE="managed_none" - fi - - if [ "$NET_HIDDEN" = "true" ]; then - echo "[wifi_${NET_IFACE}_hidden_${MODE}]" > $CONNMAN_PROFILE - else - echo "[wifi_${NET_IFACE}_${NET_SSID_HEX}_${MODE}]" > $CONNMAN_PROFILE - fi - - echo "Name=$NET_SSID" >> $CONNMAN_PROFILE - echo "SSID=$NET_SSID_HEX" >> $CONNMAN_PROFILE - [ -n "$NET_PASSPHRASE" ] && echo "Passphrase=$NET_PASSPHRASE" >> $CONNMAN_PROFILE - echo "Favorite=true" >> $CONNMAN_PROFILE - echo "AutoConnect=true" >> $CONNMAN_PROFILE - else - MODE="cable" - echo "[ethernet_${NET_IFACE}_${MODE}]" > $CONNMAN_PROFILE - fi - - # IP settings - if [ -z "$NET_IPADDRESS" -o "$NET_IPADDRESS" = "0.0.0.0" ]; then - echo "IPv4.method=dhcp" >> $CONNMAN_PROFILE - else - echo "IPv4.method=manual" >> $CONNMAN_PROFILE - echo "IPv4.local_address=$NET_IPADDRESS" >> $CONNMAN_PROFILE - [ -n "$NET_PREFIXLEN" ] && echo "IPv4.netmask_prefixlen=$NET_PREFIXLEN" >> $CONNMAN_PROFILE - [ -n "$NET_GATEWAY" ] && echo "IPv4.gateway=$NET_GATEWAY" >> $CONNMAN_PROFILE - fi - - [ -n "$NET_DNS1" ] && NET_NAMESERVER="$NET_DNS1" - [ -n "$NET_DNS2" ] && NET_NAMESERVER="$NET_NAMESERVER;$NET_DNS2" - [ -n "$NET_DNS3" ] && NET_NAMESERVER="$NET_NAMESERVER;$NET_DNS3" - [ -n "$NET_NAMESERVER" ] && echo "Nameservers=$NET_NAMESERVER;" >> $CONNMAN_PROFILE - - # END OF NETWORK 1 - - # NETWORK 2: ( LAN / WLAN ) - if [ -n "$NET2_NETWORK" -a "$NET2_NETWORK" != "NONE" -a "$NET2_IFACE_NAME" != "$NET_IFACE_NAME" ]; then - # setup Networking 2 - progress "setup Networking 2" - - for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do - if [ ! -f /sys/class/net/$NET2_IFACE/address ]; then - logger -t Connman "### [$i] cannot find /sys/class/net/$NET2_IFACE/address ###" - else - logger -t Connman "### [$i] found /sys/class/net/$NET2_IFACE/address, continue ###" - NET2_IFACE=`cat /sys/class/net/$NET2_IFACE/address | sed 's/://g'` - break - fi - usleep 500000 - done - - if [ "$NET2_NETWORK" = "WLAN" -a -n "$NET2_SSID" ]; then - NET2_SSID_HEX=`echo -n "$NET2_SSID" | od -tx1 | cut -c8-| tr -d ' \n'` - - # NET_SECURITY: ( NONE / WEP / WPA/WPA2 ) - if [ "$NET2_SECURITY" = "WEP" -a -n "$NET2_PASSPHRASE" ]; then - MODE="managed_wep" - elif [ "$NET2_SECURITY" = "WPA/WPA2" -a -n "$NET2_PASSPHRASE" ]; then - MODE="managed_psk" - else - MODE="managed_none" - fi - - if [ "$NET2_HIDDEN" = "true" ]; then - echo "[wifi_${NET2_IFACE}_hidden_${MODE}]" >> $CONNMAN_PROFILE - else - echo "[wifi_${NET2_IFACE}_${NET2_SSID_HEX}_${MODE}]" >> $CONNMAN_PROFILE - fi - - echo "Name=$NET2_SSID" >> $CONNMAN_PROFILE - echo "SSID=$NET2_SSID_HEX" >> $CONNMAN_PROFILE - [ -n "$NET2_PASSPHRASE" ] && echo "Passphrase=$NET2_PASSPHRASE" >> $CONNMAN_PROFILE - echo "Favorite=true" >> $CONNMAN_PROFILE - echo "AutoConnect=true" >> $CONNMAN_PROFILE - else - MODE="cable" - echo "[ethernet_${NET2_IFACE}_${MODE}]" >> $CONNMAN_PROFILE - fi - - # IP settings - if [ -z "$NET2_IPADDRESS" -o "$NET2_IPADDRESS" = "0.0.0.0" ]; then - echo "IPv4.method=dhcp" >> $CONNMAN_PROFILE - else - echo "IPv4.method=manual" >> $CONNMAN_PROFILE - echo "IPv4.local_address=$NET2_IPADDRESS" >> $CONNMAN_PROFILE - [ -n "$NET2_PREFIXLEN" ] && echo "IPv4.netmask_prefixlen=$NET2_PREFIXLEN" >> $CONNMAN_PROFILE - [ -n "$NET2_GATEWAY" ] && echo "IPv4.gateway=$NET2_GATEWAY" >> $CONNMAN_PROFILE - fi - - [ -n "$NET2_DNS1" ] && NET2_NAMESERVER="$NET2_DNS1" - [ -n "$NET2_DNS2" ] && NET2_NAMESERVER="$NET2_NAMESERVER;$NET2_DNS2" - [ -n "$NET2_DNS3" ] && NET2_NAMESERVER="$NET2_NAMESERVER;$NET2_DNS3" - [ -n "$NET2_NAMESERVER" ] && echo "Nameservers=$NET2_NAMESERVER;" >> $CONNMAN_PROFILE - -( - # wait some time, put eth1 (NET2_IFACE) down and then up - # this is just temporary solution until I figure out how to - # do properly with connman - usleep 5000000 - ifconfig $NET2_IFACE_NAME down - usleep 1000000 - ifconfig $NET2_IFACE_NAME up -)& - - fi - # END OF NETWORK 2 - - # overwrite created profile with custom one if exist (debug use only) - DEBUG_CONNMAN_PROFILE="/storage/.config/connman.profile" - [ -f "$DEBUG_CONNMAN_PROFILE" ] && cp $DEBUG_CONNMAN_PROFILE $CONNMAN_PROFILE - [ -f "$DEBUG_CONNMAN_PROFILE" ] && mv $DEBUG_CONNMAN_PROFILE ${DEBUG_CONNMAN_PROFILE}_saved + cat > $CONNMAN_SETTINGS < /dev/null 2>&1 - usleep 250000 +set_ip_address() { + if [ -z "$NET_IPADDRESS" -o "$NET_IPADDRESS" = "0.0.0.0" ]; then + echo "IPv4.method=dhcp" >> $CONNMAN_PROFILE + else + echo "IPv4.method=manual" >> $CONNMAN_PROFILE + echo "IPv4.local_address=$NET_IPADDRESS" >> $CONNMAN_PROFILE + [ -n "$NET_PREFIXLEN" ] && echo "IPv4.netmask_prefixlen=$NET_PREFIXLEN" >> $CONNMAN_PROFILE + [ -n "$NET_GATEWAY" ] && echo "IPv4.gateway=$NET_GATEWAY" >> $CONNMAN_PROFILE + fi + + [ -n "$NET_DNS1" ] && NET_NAMESERVER="$NET_DNS1;" + [ -n "$NET_DNS2" ] && NET_NAMESERVER="${NET_NAMESERVER}$NET_DNS2;" + [ -n "$NET_DNS3" ] && NET_NAMESERVER="${NET_NAMESERVER}$NET_DNS3;" + [ -n "$NET_NAMESERVER" ] && echo "Nameservers=$NET_NAMESERVER" >> $CONNMAN_PROFILE + + ( + local log_file="/tmp/${PROFILE_NAME}.log" + + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40; do + echo "--- $i $PROFILE_NAME ------------" >>$log_file 2>&1 + dbus-send --system --dest=net.connman --print-reply /net/connman/service/${PROFILE_NAME} net.connman.Service.Connect >>$log_file 2>&1 + usleep 500000 + + state=$(connman_state $PROFILE_NAME) + echo "state: <$state>" >>$log_file 2>&1 + + if [ "$state" = "online" -o "$state" = "ready" ]; then + echo "Done." >>$log_file 2>&1 + break + else + usleep 1000000 + fi done + )& +} + +set_wired_interface() { + local NET_MAC="" + + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do + if [ ! -f /sys/class/net/$NET_IFACE/address ]; then + logger -t Connman "### [$i] cannot find /sys/class/net/$NET_IFACE/address ###" + usleep 500000 + else + logger -t Connman "### [$i] found /sys/class/net/$NET_IFACE/address, continue ###" + NET_MAC=`cat /sys/class/net/$NET_IFACE/address | sed 's/://g'` + break + fi + done + + # don't continue if interface is not found + [ -z "$NET_MAC" ] && return + + PROFILE_NAME="ethernet_${NET_MAC}_cable" + CONNMAN_PROFILE=/var/lib/connman/${PROFILE_NAME}/settings + + mkdir -p /var/lib/connman/${PROFILE_NAME} + + echo "[${PROFILE_NAME}]" > $CONNMAN_PROFILE + echo "AutoConnect=true" >> $CONNMAN_PROFILE + if [ "$1" = "1" ]; then + echo "Favorite=true" >> $CONNMAN_PROFILE + else + echo "Favorite=false" >> $CONNMAN_PROFILE + fi + + set_ip_address +} + +set_wireless_interface() { + # we need ssid + [ -z "$NET_SSID" ] && return + + local NET_SSID_HEX=`echo -n "$NET_SSID" | od -tx1 | cut -c8-| tr -d ' \n'` + local NET_MAC="" + + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do + if [ ! -f /sys/class/net/$NET_IFACE/address ]; then + logger -t Connman "### [$i] cannot find /sys/class/net/$NET_IFACE/address ###" + usleep 500000 + else + logger -t Connman "### [$i] found /sys/class/net/$NET_IFACE/address, continue ###" + NET_MAC=`cat /sys/class/net/$NET_IFACE/address | sed 's/://g'` + break + fi + done + + # don't continue if interface is not found + [ -z "$NET_MAC" ] && return + + # NET_SECURITY: ( NONE / WEP / WPA/WPA2 ) + if [ "$NET_SECURITY" = "WEP" -a -n "$NET_PASSPHRASE" ]; then + MODE="managed_wep" + elif [ "$NET_SECURITY" = "WPA/WPA2" -a -n "$NET_PASSPHRASE" ]; then + MODE="managed_psk" + else + MODE="managed_none" + fi + + if [ "$NET_HIDDEN" = "true" ]; then + PROFILE_NAME="wifi_${NET_MAC}_hidden_${MODE}" + else + PROFILE_NAME="wifi_${NET_MAC}_${NET_SSID_HEX}_${MODE}" + fi + + CONNMAN_PROFILE=/var/lib/connman/${PROFILE_NAME}/settings + + mkdir -p /var/lib/connman/${PROFILE_NAME} + + echo "[${PROFILE_NAME}]" > $CONNMAN_PROFILE + echo "Name=$NET_SSID" >> $CONNMAN_PROFILE + echo "SSID=$NET_SSID_HEX" >> $CONNMAN_PROFILE + [ -n "$NET_PASSPHRASE" ] && echo "Passphrase=$NET_PASSPHRASE" >> $CONNMAN_PROFILE + echo "AutoConnect=true" >> $CONNMAN_PROFILE + if [ "$1" = "1" ]; then + echo "Favorite=true" >> $CONNMAN_PROFILE + else + echo "Favorite=false" >> $CONNMAN_PROFILE + fi + set_ip_address +} + +set_interface() { + for i in 1 2; do + if [ "$i" = "2" ]; then + if [ -n "$NET2_NETWORK" -a "$NET2_NETWORK" != "NONE" -a "$NET2_IFACE" != "$NET_IFACE" ]; then + # set second interface + NET_DNS1="$NET2_DNS1" + NET_DNS2="$NET2_DNS2" + NET_DNS3="$NET2_DNS3" + NET_GATEWAY="$NET2_GATEWAY" + NET_HIDDEN="$NET2_HIDDEN" + NET_IFACE="$NET2_IFACE" + NET_IPADDRESS="$NET2_IPADDRESS" + NET_NETWORK="$NET2_NETWORK" + NET_PASSPHRASE="$NET2_PASSPHRASE" + NET_PREFIXLEN="$NET2_PREFIXLEN" + NET_SECURITY="$NET2_SECURITY" + NET_SSID="$NET2_SSID" + else + break + fi + fi + + if [ "$NET_NETWORK" = "WLAN" ]; then + progress "Setup networking $i WLAN" + set_wireless_interface $i + elif [ "$NET_NETWORK" = "LAN" ]; then + progress "Setup networking $i LAN" + set_wired_interface $i + fi + done +} + +( + # starting Connection manager + progress "starting Connection manager" + + while true; do + set_basic + set_interface + set_hwclock + + /usr/sbin/connmand -n > /dev/null 2>&1 + usleep 250000 + done )&