commit 428102c71b811fef64cb64ea23e83510e3c56153 Author: Kiritan Flux Date: Wed Jun 10 11:19:36 2015 +0100 init diff --git a/bash-ini-parser/bash-ini-parser b/bash-ini-parser/bash-ini-parser new file mode 100644 index 0000000..27aa743 --- /dev/null +++ b/bash-ini-parser/bash-ini-parser @@ -0,0 +1,197 @@ +# +# based on http://theoldschooldevops.com/2008/02/09/bash-ini-parser/ +# + +PREFIX="cfg_section_" + +function debug { + return #abort debug + echo $* + echo --start-- + echo "${ini[*]}" + echo --end-- + echo +} + +function cfg_parser { + shopt -p extglob &> /dev/null + CHANGE_EXTGLOB=$? + if [ $CHANGE_EXTGLOB = 1 ] + then + shopt -s extglob + fi + ini="$(<$1)" # read the file + ini="${ini//[/\\[}" # escape [ + debug + ini="${ini//]/\\]}" # escape ] + debug + IFS=$'\n' && ini=( ${ini} ) # convert to line-array + debug + ini=( ${ini[*]//;*/} ) # remove comments with ; + debug + ini=( ${ini[*]/#+([[:space:]])/} ) # remove init whitespace + debug "whitespace around" + ini=( ${ini[*]/*([[:space:]])=*([[:space:]])/=} ) # remove whitespace around = + debug + ini=( ${ini[*]/#\\[/\}$'\n'"$PREFIX"} ) # set section prefix + debug + ini=( ${ini[*]/%\\]/ \(} ) # convert text2function (1) + debug + ini=( ${ini[*]/=/=\( } ) # convert item to array + debug + ini=( ${ini[*]/%/ \)} ) # close array parenthesis + debug + ini=( ${ini[*]/%\\ \)/ \\} ) # the multiline trick + debug + ini=( ${ini[*]/%\( \)/\(\) \{} ) # convert text2function (2) + debug + ini=( ${ini[*]/%\} \)/\}} ) # remove extra parenthesis + ini=( ${ini[*]/%\{/\{$'\n''cfg_unset ${FUNCNAME/#'$PREFIX'}'$'\n'} ) # clean previous definition of section + debug + ini[0]="" # remove first element + debug + ini[${#ini[*]} + 1]='}' # add the last brace + debug + eval "$(echo "${ini[*]}")" # eval the result + EVAL_STATUS=$? + if [ $CHANGE_EXTGLOB = 1 ] + then + shopt -u extglob + fi + return $EVAL_STATUS +} + +function cfg_writer { + SECTION=$1 + OLDIFS="$IFS" + IFS=' '$'\n' + if [ -z "$SECTION" ] + then + fun="$(declare -F)" + else + fun="$(declare -F $PREFIX$SECTION)" + if [ -z "$fun" ] + then + echo "section $SECTION not found" >2 + exit 1 + fi + fi + fun="${fun//declare -f/}" + for f in $fun; do + [ "${f#$PREFIX}" == "${f}" ] && continue + item="$(declare -f ${f})" + item="${item##*\{}" # remove function definition + item="${item##*FUNCNAME*$PREFIX\};}" # remove clear section + item="${item/\}}" # remove function close + item="${item%)*}" # remove everything after parenthesis + item="${item});" # add close parenthesis + vars="" + while [ "$item" != "" ] + do + newvar="${item%%=*}" # get item name + vars="$vars $newvar" # add name to collection + item="${item#*;}" # remove readed line + done + eval $f + echo "[${f#$PREFIX}]" # output section + for var in $vars; do + eval 'local length=${#'$var'[*]}' # test if var is an array + if [ $length == 1 ] + then + echo $var=\"${!var}\" #output var + else + echo ";$var is an array" # add comment denoting var is an array + eval 'echo $var=\"${'$var'[*]}\"' # output array var + fi + done + done + IFS="$OLDIFS" +} + +function cfg_unset { + SECTION=$1 + OLDIFS="$IFS" + IFS=' '$'\n' + if [ -z "$SECTION" ] + then + fun="$(declare -F)" + else + fun="$(declare -F $PREFIX$SECTION)" + if [ -z "$fun" ] + then + echo "section $SECTION not found" >2 + return + fi + fi + fun="${fun//declare -f/}" + for f in $fun; do + [ "${f#$PREFIX}" == "${f}" ] && continue + item="$(declare -f ${f})" + item="${item##*\{}" # remove function definition + item="${item##*FUNCNAME*$PREFIX\};}" # remove clear section + item="${item/\}}" # remove function close + item="${item%)*}" # remove everything after parenthesis + item="${item});" # add close parenthesis + vars="" + while [ "$item" != "" ] + do + newvar="${item%%=*}" # get item name + vars="$vars $newvar" # add name to collection + item="${item#*;}" # remove readed line + done + for var in $vars; do + unset $var + done + done + IFS="$OLDIFS" +} + +function cfg_clear { + SECTION=$1 + OLDIFS="$IFS" + IFS=' '$'\n' + if [ -z "$SECTION" ] + then + fun="$(declare -F)" + else + fun="$(declare -F $PREFIX$SECTION)" + if [ -z "$fun" ] + then + echo "section $SECTION not found" >2 + exit 1 + fi + fi + fun="${fun//declare -f/}" + for f in $fun; do + [ "${f#$PREFIX}" == "${f}" ] && continue + unset -f ${f} + done + IFS="$OLDIFS" +} + +function cfg_update { + SECTION=$1 + VAR=$2 + OLDIFS="$IFS" + IFS=' '$'\n' + fun="$(declare -F $PREFIX$SECTION)" + if [ -z "$fun" ] + then + echo "section $SECTION not found" >2 + exit 1 + fi + fun="${fun//declare -f/}" + item="$(declare -f ${fun})" + #item="${item##* $VAR=*}" # remove var declaration + item="${item/\}}" # remove function close + item="${item} + $VAR=(${!VAR}) + " + item="${item} + }" # close function again + + eval "function $item" +} + + +# vim: filetype=sh diff --git a/config.sh b/config.sh new file mode 100755 index 0000000..0f9753a --- /dev/null +++ b/config.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# PiPilot Config Script + +INI_FILE="${1:-config.ini}" +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +PARSER=$DIR/bash-ini-parser/bash-ini-parser + +echo +echo "::::: PiPilot Configuration :::::" +echo + +if [ -f $INI_FILE ] ; +then + # INI initialization + echo "Detected INI file: $INI_FILE" + if [ -f $PARSER ]; + then + source $PARSER + echo "Loaded bash-ini-parser (https://github.com/albfan/bash-ini-parser)" + cfg_parser "$INI_FILE" + echo "Parsed $INI_FILE" + + #Network Setup + + cfg_section_network + + if [ $device = "wifi" ]; + then + NET_DEV="wlan0" + echo "Network device set to: '$NET_DEV'" + if nmcli d wifi list | grep "*" | grep $ssid; + then + echo "Already connected to wifi: $ssid" + else + ifconfig $NET_DEV down + echo "Disconnecting wifi" + if nmcli c | grep $ssid; + then + nmcli c delete $ssid + fi + set -e + echo "Connecting to wifi: $ssid" + nmcli device wifi connect "$ssid" password "$key" ifname $NET_DEV + set +e + fi + else + NET_DEV="eth0" + echo "Network device set to: '$NET_DEV'" + fi + + if [ $inet = "dhcp" ]; + then + echo "Waiting for IP lease from DHCP server" + ifconfig $NET_DEV up 0.0.0.0 0.0.0.0 + dhclient $NET_DEV + else + echo "Setting static IP to: $ip, Netmask: $netmask, Network: $net, Gateway: $gateway" + ifconfig $NET_DEV down + ifconfig $NET_DEV $ip netmask $netmask up + route add -net $net netmask $netmask gw $gateway dev $NET_DEV + fi + + fi +fi + +echo +echo "::::: PiPilot Done! :::::" +echo \ No newline at end of file