diff options
| -rwxr-xr-x | setnet.sh | 1983 | 
1 files changed, 1357 insertions, 626 deletions
| @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU General Public License as published by @@ -19,7 +19,8 @@  #  # ----------------------------------------------------------------------  # -# (c) KatolaZ (katolaz@freaknet.org) -- 2016/12/26 +# Copyleft (C) Vincenzo "KatolaZ" Nicosia (katolaz@freaknet.org) -- +# (2016, 2017)  #  # @@ -28,44 +29,102 @@  ## Initialisation  ##  -VERSION=0.1 +VERSION=0.2 -DIALOGRC=~/.dialogrc +TOPSTR="setnet-${VERSION} [user: $(id -run)]" +DIALOG="dialog --backtitle \"${TOPSTR}\" " -TOPSTR="setnet-0.1 [user: `id -run`]" -DIALOG="dialog --backtitle \"${TOPSTR}\" " +############################### +##                           ## +## Internal config variables ## +##                           ## +############################### + +## +## Required dependencies. If any of those commands is missing, +## the script will exit +## + +HARD_DEPS="ip dhclient dialog netstat" + +## +## Suggested dependencies. The script will issue a warning if any of +## those commands is missing +## +SOFT_DEPS="wpa_cli wpa_supplicant" +## +## Optional dependencies. The script will check if those dependencies +## exist, and if they do, will set a variable HAS_OPTS which contains +## the names of the commands actually found +## + +OPT_DEPS="host ping traceroute netstat pastebinit" +################################# -TMPFILE=$( (tempfile) 2>/dev/null) || TMPFILE=/tmp/setnet_$$ -WPA_PIDFILE=$( (tempfile) 2>/dev/null) || WPA_PIDFILE=/tmp/setnet_wpapid_$$ +##################################### +##                                 ## +## HEIGHT/WIDTH of various dialogs ## +##                                 ## +##################################### + +## +## Regular windows +##  WINDOW_WIDTH=75  WINDOW_HEIGHT=20 +## +## Infoboxes +##  INFO_WIDTH=40  INFO_HEIGHT=10 + +## +## Forms +##  FORM_WIDTH=60  FORM_HEIGHT=12 +## +## Large windows +## + +LARGE_WIDTH=80 +LARGE_HEIGHT=20 + + +################################# + +################################ +##                            ## +## Supported network families ## +##                            ## +################################ +  NET_FAMILIES="inet inet6" +################################# +  ## -## Load setnetrc  +## Load the configuration file "setnetrc"  ## -function load_setnetrc(){ +##function  +load_setnetrc(){  	WPA_FILE=""  	LOGFILE=""  	## If we were given a parameter, is the rc file to load...  	##	  	if [ $# -ge 1 ]; then -		. $1 +		  . "$1"  		return  	fi @@ -78,7 +137,7 @@ function load_setnetrc(){  	##  	if [ -f /etc/setnetrc ]; then -		. /etc/setnetrc +     SETNETRC=/etc/setnetrc  	fi  	## @@ -86,9 +145,10 @@ function load_setnetrc(){  	##  	if [ -f ~/.setnetrc ]; then -		. ~/.setnetrc +     SETNETRC=~/.setnetrc  	fi +  . ${SETNETRC}  	if [ -z ${WPA_FILE} ]; then  		echo "Could not find WPA_FILE defined anywhere. Exiting" @@ -102,7 +162,12 @@ function load_setnetrc(){  } -function cleanup(){ +## +## handler called upon exit/signal (NONE HUP INT TRAP TERM QUIT) +## + +##function  +cleanup(){  	rm -f ${TMPFILE}  	rm -f ${WPA_PIDFILE}  } @@ -117,45 +182,146 @@ function cleanup(){  ##  ## log() takes two arguments, namely the label and the message  ## -## if the label is "_self", print the name of the function which -## called log()  ## -function log(){ +##function  +log(){ +     +    ##local +    LABEL=$1 +    ##local +    MSG=$2 +     +	  echo  "${LABEL}:" "${MSG}" >> "${LOGFILE}" +	   +} -	local LABEL=$1 -	local MSG=$2 +## +## Check whether the shell which called the script is supported, or +## exit. Currently, we support the follwing shells: +## +## - bash +## - busybox +## - dash +## - ksh +## - mksh +## - posh +## - sh +## - yash +## -	if [ ${LABEL} == "_self" ]; then -		LABEL=${FUNCNAME[1]} -	fi -	echo -e "${LABEL}:" "${MSG}" >> "${LOGFILE}" -	 +##function +check_shell(){ + +    ## +    ## FIXME!!! THIS TEST DOES NOT WORK yet... +    ##  +    CUR_SH=$(ps -p $$ -o comm=) +    case ${CUR_SH} in +        ash|bash|busybox|dash|ksh|mksh|posh|sh|yash) +            log "check_shell" "The current shell (${CUR_SH}) is supported" +            return +            ;; +        *) +            log "check_shell" "The current shell (${CUR_SH}) is not supported" +            echo "The current shell (${CUR_SH}) is not supported. Exiting..." +            exit 1 +            ;; +    esac  } -########################################## -function edit_file(){ +## +## Check dependencies +## +## - check if the current shell is supported through check_shell +## +## - each command in HARD_DEPS MUST exist, or the script exits +## +## - each command in SOFT_DEPS SHOULD exist, or the script will log a +##   warning +## +## - each command in OPT_DEPS MIGHT exist, and if it does its name is +##   included in the variable "HAS_OPTS" +## + +##function +check_deps(){ + +    ## FIXME FIRST.... check_shell +     +    for h in ${HARD_DEPS}; do +        _W=$(which ${h}) +        if [ -z "${_W}" ]; then +            echo "Error: required command \"${h}\" not found. Exiting..." +            exit 1 +        fi +        log "check_deps" "NOTICE: required command '${h}'...found" +    done +     +    for s in ${SOFT_DEPS}; do +        _S=$(which ${s}) +        if [ -z "${_S}" ]; then +            log "check_deps" "WARNING: suggested command '${s}' not found! Some functions might not work properly" +        fi +    done + +    HAS_OPTS="" +    for o in ${OPT_DEPS}; do +        _O=$(which ${o}) +        if [ -n "${_O}" ]; then +            HAS_OPTS=" ${HAS_OPTS} ${o} " +            log "check_deps" "NOTICE: optional command '${o}'...found" +        else +            log "check_deps" "NOTICE: optional command '${o}' not found!" +        fi +    done + +    log "check_deps" "HAS_OPTS: \"${HAS_OPTS}\"" +     +} -	local FILEIN=$1 -	log "edit_file" "editing file ${FILEIN}" -	eval "${DIALOG} --title 'Editing file: ${FILEIN}' \ -			--editbox ${FILEIN} ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 2> ${TMPFILE}" +## +## Generic function fo unimplemented features. It just pops up a +## message-box and returns +## -	if [ $? -eq 0 ]; then -		log "edit_file" "Copying ${TMPFILE} into ${FILEIN}" -		if cp ${TMPFILE} ${FILEIN} -		then -			eval "${DIALOG}   --clear --msgbox 'File ${FILEIN} saved successfully' \ +##function +unimplemented(){ + +    LABEL=$1 +     +		eval "${DIALOG}  --msgbox 'Sorry! '$LABEL' not implemented, yet!' \ +						  ${INFO_HEIGHT} ${INFO_WIDTH}" 2>${TMPFILE} +} + + + +########################################## + +##function  +edit_file(){ + +    ##local  +    FILEIN=$1 +	  log "edit_file" "editing file ${FILEIN}" +	  eval "${DIALOG} --title 'Editing file: ${FILEIN}' \ +			--editbox ${FILEIN} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" 2> ${TMPFILE} +     +	  if [ $? -eq 0 ]; then +		    log "edit_file" "Copying ${TMPFILE} into ${FILEIN}" +		    if cp "${TMPFILE}" "${FILEIN}" +		    then +			      eval "${DIALOG}   --clear --msgbox 'File ${FILEIN} saved successfully' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -		else -			eval "${DIALOG}   --clear --msgbox 'Error saving file ${FILEIN}' \ +		    else +			      eval "${DIALOG}   --clear --msgbox 'Error saving file ${FILEIN}' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -		fi -	else -		log "edit_file" "Editing of ${FILEIN} aborted..."xs -		eval "${DIALOG}   --clear --msgbox 'File ${FILEIN} not saved' \ +		    fi +	  else +		    log "edit_file" "Editing of ${FILEIN} aborted..." +		    eval "${DIALOG}   --clear --msgbox 'File ${FILEIN} not saved' \  			   ${INFO_HEIGHT} ${INFO_WIDTH}" -	fi +	  fi  } @@ -164,50 +330,55 @@ function edit_file(){  ##  ## Read all the configured addresses for a given inet family  ## -function get_addr_family(){ +##function  +get_addr_family(){ -	local DEVNAME=$1 -	local DEVFAMILY=$2 - -	NUMADDR=`ip -f ${DEVFAMILY} addr show ${DEVNAME} | grep ${DEVFAMILY} | wc -l` -	ADDR_STR="" -	for i in `seq ${NUMADDR}`; do  -		ADDR=`ip -f ${DEVFAMILY} addr show ${DEVNAME} | grep ${DEVFAMILY} | \ -			tail -n +$i | head -1 | sed -r -e "s:^\ +::g" | cut -d " " -f 2,4,6 |\ -			sed -r -e "s:\ : -- :g"` -		ADDR_STR="${ADDR_STR}\n${DEVFAMILY}: ${ADDR}\n" -	done +##local  +    DEVNAME=$1 +    ##local  +    DEVFAMILY=$2 +     +    NUMADDR=$(ip -f "${DEVFAMILY}" addr show "${DEVNAME}" | grep -c "${DEVFAMILY}") +	  ADDR_STR="" +	  for i in $(seq ${NUMADDR}); do  +		    ADDR=$(ip -f "${DEVFAMILY}" addr show "${DEVNAME}" | grep "${DEVFAMILY}" | \ +			                tail -n +$i | head -1 | sed -r -e "s:^\ +::g" | cut -d " " -f 2,4,6 |\ +			                sed -r -e "s:\ : -- :g") +		    ADDR_STR="${ADDR_STR}\n${DEVFAMILY}: ${ADDR}\n" +	  done  }  ##  ## Show the current configuration of a given device  ## -function show_device_conf(){ +##function  +show_device_conf(){ -	local DEVNAME=$1 -	if [ ${DEVNAME} == "" ]; then +##local  +DEVNAME=$1 +	if [ -z "${DEVNAME}" ]; then  		return -1  	fi -	DEVMAC=`ip link show ${DEVNAME} | tail -n +2 | sed -r 's/^\ +//g' | cut -d " " -f 2` +	DEVMAC=$(ip link show "${DEVNAME}" | tail -n +2 | sed -r 's/^\ +//g' | cut -d " " -f 2)  	DEVCONF="MAC: ${DEVMAC}\n" -	log "_self" "NET_FAMILIES: \"${NET_FAMILIES}\"" +	log "show_device_conf" "NET_FAMILIES: \"${NET_FAMILIES}\""  	for f in ${NET_FAMILIES}; do -		get_addr_family ${DEVNAME} ${f} -		log "_self" "family: ${f} ADDR_STR: \"${ADDR_STR}\"" +		  get_addr_family ${DEVNAME} ${f} +		  log "show_device_conf" "family: ${f} ADDR_STR: \"${ADDR_STR}\""  		if [ -z "${ADDR_STR}" ]; then   			DEVCONF="${DEVCONF}${f}: Unconfigured\n"  		else  			DEVCONF="${DEVCONF}${ADDR_STR}"  		fi -		log "_self" "DEVCONF: ${DEVCONF}" +		log "show_device_conf" "DEVCONF: ${DEVCONF}"  	done -	DEVCONF="${DEVCONF}\n== name servers ==\n`cat /etc/resolv.conf | grep '^nameserver'`" +	DEVCONF="${DEVCONF}\n== name servers ==\n$(grep '^nameserver' /etc/resolv.conf)"  	eval "${DIALOG}   --clear --title 'Current configuration of device: ${DEVNAME}' \  		--msgbox '\n\n${DEVCONF}' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} " @@ -217,16 +388,24 @@ function show_device_conf(){ -function config_ethernet_static(){ +##function  +config_ethernet_static(){ -	local DEV_IP="192.168.1.2" -	local DEV_NET="192.168.1.0" -	local DEV_NETMASK="255.255.255.0" -	local DEV_GW="192.168.1.1" -	local DEV_DNS1="208.67.222.222" -	local DEV_DNS2="208.67.220.220" +##local  +DEV_IP="192.168.1.2" +##local  +DEV_NET="192.168.1.0" +##local  +DEV_NETMASK="255.255.255.0" +##local  +DEV_GW="192.168.1.1" +##local  +DEV_DNS1="208.67.222.222" +##local  +DEV_DNS2="208.67.220.220" -	local DEVNAME=$1 +##local  +DEVNAME=$1  	exec 3>&1	  	eval "${DIALOG}  --clear --form 'Set network for device: ${DEVNAME}'" \ @@ -250,216 +429,232 @@ function config_ethernet_static(){  	## Configure IP -	ip link set ${DEVNAME} down -	ip link set ${DEVNAME} up -	ip address flush dev ${DEVNAME} -	ip address add ${DEV_IP}/${DEV_NETMASK} dev ${DEVNAME} +	ip link set "${DEVNAME}" down +	ip link set "${DEVNAME}" up +	ip address flush dev "${DEVNAME}" +	ip address add "${DEV_IP}/${DEV_NETMASK}" dev "${DEVNAME}"  	## Configure GW -	ip route flush dev ${DEVNAME} -	ip route add ${DEV_NET}/${DEV_NETMASK} dev ${DEVNAME} -	ip route add default via ${DEV_GW} +	ip route flush dev "${DEVNAME}" +	ip route add "${DEV_NET}/${DEV_NETMASK}" dev "${DEVNAME}" +	ip route add default via "${DEV_GW}"  	## Configure DNS  	mv /etc/resolv.conf /etc/resolv.conf.bak -	if [ -n ${DEV_DNS1} ]; then +	if [ -n "${DEV_DNS1}" ]; then  		echo "nameserver ${DEV_DNS1}" >> /etc/resolv.conf  	fi -	if [ -n ${DEV_DNS2} ]; then +	if [ -n "${DEV_DNS2}" ]; then  		echo "nameserver ${DEV_DNS2}" >> /etc/resolv.conf  	fi -	show_device_conf ${DEVNAME} +	show_device_conf "${DEVNAME}"  } -function config_ethernet_dhcp(){ +##function  +config_ethernet_dhcp(){ -	local DEVNAME=$1 +##local  +DEVNAME=$1 -	eval "${DIALOG}  --infobox 'Running \"dhclient ${DEVNAME}\"' ${INFO_HEIGHT} ${INFO_WIDTH}" -	dhclient -r ${DEVNAME} -	dhclient ${DEVNAME} +	eval "${DIALOG}  --msgbox 'Running \"dhclient ${DEVNAME}\"' ${INFO_HEIGHT} ${INFO_WIDTH}" +	dhclient -r ${DEVNAME}  +	dhclient ${DEVNAME}   	show_device_conf ${DEVNAME}  } -function config_ethernet(){ +##function  +config_ethernet(){ -	local DEVNAME=$1 -	 -	while [ 1 -eq 1 ]; do -		eval "${DIALOG}  --clear --cancel-label 'Up' \ +##local  +    DEVNAME=$1 +	   +    while true; do +		    eval "${DIALOG}  --clear --cancel-label 'Up' \  		--menu 'Configuring ${DEVNAME}' ${INFO_HEIGHT} ${INFO_WIDTH} 4 \  		'DHCP' ''\ -		'Static' '' 2>${TMPFILE}" -		if [ $? -eq 1 ]; then -			return -		fi -		ACTION=`<${TMPFILE}` -		case ${ACTION} in -			"Static") -				config_ethernet_static ${DEVNAME} -				;; -			"DHCP") -				config_ethernet_dhcp ${DEVNAME} -				;; -		esac -	done - +		'Static' ''" 2>${TMPFILE} +		    if [ $? -eq 1 ]; then +			      return +		    fi +		    ACTION=$(cat ${TMPFILE}) +		    case ${ACTION} in +			      "Static") +				        config_ethernet_static ${DEVNAME} +				        ;; +			      "DHCP") +				        config_ethernet_dhcp ${DEVNAME} +				        ;; +		    esac +	  done +      } -function wifi_essid_from_mac(){ +##function  +wifi_essid_from_mac(){ -	local DEVNAME=$1 -	local W_MAC=$2 -	 -	W_ESSID=`wpa_cli -i ${DEVNAME} scan_results | grep -E "^${W_MAC}" | \ -       sed -r -e 's/\t/\|/g' | cut -d "|" -f 5` +    ##local  +    DEVNAME=$1 +    ##local  +    W_MAC=$2 +	   +    W_ESSID=$(wpa_cli -i "${DEVNAME}" scan_results | grep -E "^${W_MAC}" | \ +       sed -r -e 's/\t/\|/g' | cut -d "|" -f 5) -	log "${FUNCNAME[0]}" "Recovered ESSID: ${W_ESSID}" +	log "wifi_essid_from_mac" "Recovered ESSID: ${W_ESSID}"  } -function wifi_flags_from_mac(){ -	local DEVNAME=$1 -	local W_MAC=$2 - -	W_FLAGS=`wpa_cli -i ${DEVNAME} scan_results | grep -E "^${W_MAC}" | \ -       sed -r -e 's/\t/\|/g' | cut -d "|" -f 4` -	log "wifi_essid_from_mac" "Recovered W_FLAGS: ${W_FLAGS}" - +##function  +wifi_flags_from_mac(){ +##local  +    DEVNAME=$1 +##local  +    W_MAC=$2 + +    W_FLAGS=$(wpa_cli -i "${DEVNAME}" scan_results | grep -E "^${W_MAC}" | \ +       sed -r -e 's/\t/\|/g' | cut -d "|" -f 4) +	  log "wifi_essid_from_mac" "Recovered W_FLAGS: ${W_FLAGS}" +      } -function wifi_network_list(){ - -	local DEVNAME=$1 -	wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' > ${TMPFILE} - -	NETLIST="" -	LAST_IFS=$IFS -	IFS="|" -	while read NETNUM NETESSID NETBSSID NETFLAGS; do -		IS_DIS=`echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -i disabled | wc -l` -		if [ ${IS_DIS} -eq 1 ]; then -		   STATUS="(DIS)" -		else -		   STATUS="(ENAB)" -		fi -		IS_CUR=`echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -i current | wc -l` -		if [ ${IS_CUR} -eq 1 ]; then -			STATUS="${STATUS}(CUR)" -		fi - -		 -		NETLIST="${NETLIST} ${NETNUM} \"${NETESSID}-${STATUS}\"" -	done < ${TMPFILE} -	IFS=${LAST_IFS} - -	log "_self" "NETLIST: ${NETLIST}" +##function  +wifi_network_list(){ + +##local  +    DEVNAME=$1 +	  wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' > ${TMPFILE} +     +	  NETLIST="" +	  LAST_IFS=$IFS +	  IFS="|" +	  while read NETNUM NETESSID NETBSSID NETFLAGS; do +		    IS_DIS=$(echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -c -i disabled ) +		    if [ ${IS_DIS} -eq 1 ]; then +		        STATUS="(DIS)" +		    else +		        STATUS="(ENAB)" +		    fi +		    IS_CUR=$(echo ${NETFLAGS} | sed -r -e 's/\[//g;s/\]//g' | grep -c -i current ) +		    if [ ${IS_CUR} -eq 1 ]; then +			      STATUS="${STATUS}(CUR)" +		    fi +         +		     +		    NETLIST="${NETLIST} ${NETNUM} \"${NETESSID}-${STATUS}\"" +	  done < ${TMPFILE} +	  IFS=${LAST_IFS} +     +	  log "wifi_network_list" "NETLIST: ${NETLIST}"  }  ##  ## Manage the authentication for a given wifi ESSID  ## -function wifi_authenticate(){ +##function  +wifi_authenticate(){ -	local DEVNAME=$1 -	local W_MAC=$2 - - -	log "${FUNCNAME[0]}" "configuring ${DEVNAME} on ${W_MAC}" -	## This will set the variable W_ESSID appropriately -	wifi_essid_from_mac ${DEVNAME} ${W_MAC} -	 -	## This will set the variable W_FLAGS appropriately -	wifi_flags_from_mac ${DEVNAME} ${W_MAC} - -	 -	log "${FUNCNAME[0]}" "configuring essid: ${W_ESSID} on device: ${DEVNAME}" -	log "${FUNCNAME[0]}" "W_FLAGS: ${W_FLAGS}" - -	 -	NET_EXISTS=`wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ -      | cut -d "|" -f 2 | grep "${W_ESSID}$" | wc -l` -	if [ ${NET_EXISTS} -ne 0 ]; then -		NET_NUM=`wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ -      | cut -d "|" -f 1,2 | grep "${W_ESSID}$" | cut -d "|" -f 1` -		wpa_cli -i ${DEVNAME} remove_network ${NET_NUM} > ${TMPFILE} -		STATUS=`<${TMPFILE}` -		if [ ${STATUS} != "OK" ]; then -			eval "${DIALOG}  --msgbox 'Error while removing existing network:\n$essid: {W_ESSID}'" -			${INFO_HEIGHT} ${INFO_WIDTH} -			return -		fi -	fi - -	HAS_WPA=`echo "${W_FLAGS}" | grep -E "WPA.*-PSK" | wc -l` - -	log "${FUNCNAME[0]}" "HAS_WPA: \"${HAS_WPA}\""  -	 -	### This section will configure WPA-PSK or WPA2-PSK -	if [ ${HAS_WPA} != "0" ]; then -		PSK="" -		PSK_LENGTH=${#PSK} -		while [ ${PSK_LENGTH} -le 7 ]; do -			eval "${DIALOG}  --insecure --inputbox 'Please insert WPA PSK\n(8 characters)' \ -				   ${INFO_HEIGHT} ${INFO_WIDTH} 2> ${TMPFILE}" -			if [ $? -eq 1 ]; then -				eval "${DIALOG}  --clear --msgbox 'Network configuration aborted!!!' \ +##local  +    DEVNAME=$1 +##local  +    W_MAC=$2 + + +    log "wifi_authenticate" "configuring ${DEVNAME} on ${W_MAC}" +	  ## This will set the variable W_ESSID appropriately +	  wifi_essid_from_mac ${DEVNAME} ${W_MAC} +	   +	  ## This will set the variable W_FLAGS appropriately +	  wifi_flags_from_mac ${DEVNAME} ${W_MAC} +     +	   +	  log "wifi_authenticate" "configuring essid: ${W_ESSID} on device: ${DEVNAME}" +	  log "wifi_authenticate" "W_FLAGS: ${W_FLAGS}" +     +	   +	  NET_EXISTS=$(wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ +                        | cut -d "|" -f 2 | grep -c "${W_ESSID}$" ) +	  if [ ${NET_EXISTS} != 0 ]; then +		    NET_NUM=$(wpa_cli -i ${DEVNAME} list_networks | tail -n +2 | sed -r -e 's/\t/\|/g' \ +                         | cut -d "|" -f 1,2 | grep "${W_ESSID}$" | cut -d "|" -f 1) +		    wpa_cli -i ${DEVNAME} remove_network ${NET_NUM} > ${TMPFILE} +		    STATUS=$(cat ${TMPFILE}) +		    if [ "${STATUS}" != "OK" ]; then +			      eval "${DIALOG}  --msgbox 'Error while removing existing network:\n$essid: {W_ESSID}'" +			      ${INFO_HEIGHT} ${INFO_WIDTH} +			      return +		    fi +	  fi + +     +	  HAS_WPA=$(echo "${W_FLAGS}" | grep -E -c "WPA.*-PSK" ) +     +	  log "wifi_authenticate" "HAS_WPA: \"${HAS_WPA}\""  +	   +	  ### This section will configure WPA-PSK or WPA2-PSK +	  if [ "${HAS_WPA}" != "0" ]; then +		    PSK="" +		    PSK_LENGTH=${#PSK} +		    while [ ${PSK_LENGTH} -le 7 ]; do +			      eval "${DIALOG}  --insecure --inputbox 'Please insert WPA PSK\n(8 characters)' \ +				   ${INFO_HEIGHT} ${INFO_WIDTH}"  2> ${TMPFILE} +			      if [ $? -eq 1 ]; then +				        eval "${DIALOG}  --clear --msgbox 'Network configuration aborted!!!' \  					   ${INFO_HEIGHT} ${INFO_WIDTH}" -				return 1 -			fi -			PSK=`<${TMPFILE}` -			PSK_LENGTH=${#PSK} -		done -			 -		 -		NET_NUM=`wpa_cli -i ${DEVNAME} add_network | tail -1` - -		log "${FUNCNAME[0]}" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\""` -		log "${FUNCNAME[0]}" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} psk \"${PSK}\"` -		## remove the password from tmpfile -		echo "" > ${TMPFILE} -		eval "${DIALOG}  --clear --defaultno --yesno \ +				        return 1 +			      fi +			      PSK=$(cat ${TMPFILE}) +			      PSK_LENGTH=${#PSK} +		    done +			   +		     +		    NET_NUM=$(wpa_cli -i ${DEVNAME} add_network | tail -1) +         +		    wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\"" +		    wpa_cli -i ${DEVNAME} set_network ${NET_NUM} psk \"${PSK}\" +		    ## remove the password from tmpfile +		    echo "" > ${TMPFILE} +		    eval "${DIALOG}  --clear --defaultno --yesno \  			   'Network \"${W_ESSID}\" added\nSave configuration file?' \ -			   ${INFO_HEIGHT} ${INFO_WIDTH} 2> ${TMPFILE}" -		if [ $? -eq 0 ]; then -			## Save the config file -			wifi_save_file ${DEVNAME} -		fi -		 -		eval "${DIALOG}  --msgbox 'Network added successfully' ${INFO_HEIGHT} ${INFO_WIDTH}" -		return 0 -	fi -	 -	HAS_ESS=`echo "${W_FLAGS}" | grep -E "ESS" | wc -l` - -	log "_self" "HAS_ESS: \"${HAS_ESS}\"" -	 -	if [ ${HAS_ESS} != "0" ]; then -		NET_NUM=`wpa_cli -i ${DEVNAME} add_network | tail -1` - -		log "_self" "NET_NUM: ${NET_NUM}" -		log "_self" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\""` -		log "_self" `wpa_cli -i ${DEVNAME} set_network ${NET_NUM} key_mgmt NONE` -		eval "${DIALOG}  --clear --defaultno --yesno \ +			   ${INFO_HEIGHT} ${INFO_WIDTH} " 2> ${TMPFILE} +		    if [ $? -eq 0 ]; then +			      ## Save the config file +			      wifi_save_file ${DEVNAME} +		    fi +		     +		    eval "${DIALOG}  --msgbox 'Network added successfully' ${INFO_HEIGHT} ${INFO_WIDTH}" +		    return 0 +	  fi +	   +	  HAS_ESS=$(echo "${W_FLAGS}" | grep -E -c "ESS" ) +     +	  log "wifi_authenticate" "HAS_ESS: \"${HAS_ESS}\"" +	   +	  if [ "${HAS_ESS}" != "0" ]; then +		    NET_NUM=$(wpa_cli -i ${DEVNAME} add_network | tail -1) +         +		    log "wifi_authenticate" "NET_NUM: ${NET_NUM}" +		    wpa_cli -i ${DEVNAME} set_network ${NET_NUM} ssid "\"${W_ESSID}\"" +		    wpa_cli -i ${DEVNAME} set_network ${NET_NUM} key_mgmt NONE +		    eval "${DIALOG}  --clear --defaultno --yesno \  			   'Network \"${W_ESSID}\" added\nSave configuration file?' \ -			   ${INFO_HEIGHT} ${INFO_WIDTH} 2> ${TMPFILE}" -		if [ $? -eq 0 ]; then -			## Save the config file -			wifi_save_file ${DEVNAME} -		fi -		 -		return 0 -	else -		eval " ${DIALOG}  --msgbox 'Error occurred!!!!' ${INFO_HEIGHT} ${INFO_WIDTH}" -		return 0 -	fi -	 -	## No available authentication methods.... - -	eval "${DIALOG}  --msgbox 'No supported authentication method for ${W_ESSID}'" -	return 1 +			   ${INFO_HEIGHT} ${INFO_WIDTH} " 2> ${TMPFILE} +		    if [ $? -eq 0 ]; then +			      ## Save the config file +			      wifi_save_file ${DEVNAME} +		    fi +		     +		    return 0 +	  else +		    eval " ${DIALOG}  --msgbox 'Error occurred!!!!' ${INFO_HEIGHT} ${INFO_WIDTH}" +		    return 0 +	  fi +	   +	  ## No available authentication methods.... +     +	  eval "${DIALOG}  --msgbox 'No supported authentication method for ${W_ESSID}'" +	  return 1  } @@ -469,9 +664,11 @@ function wifi_authenticate(){  ## Configure a new connection from a list of available wi-fi networks  ## -function wifi_add(){ +##function  +wifi_add(){ -	local DEVNAME=$1 +##local  +DEVNAME=$1  	wpa_cli -i ${DEVNAME} scan  	eval "${DIALOG}  --timeout 4 --msgbox 'Scanning for networks...' \ @@ -480,20 +677,20 @@ function wifi_add(){  		sed -r -e 's/\t/|/g' |\  		sort -t "|" -r -n -k 3 > ${TMPFILE} -	wifinets=() +	wifinets=""  	LAST_IFS=$IFS  	IFS="|"  	while read W_MAC W_FREQ W_STRNGT W_FLAGS W_ESSID; do -		log "_self" "W_ESSID: \"${W_ESSID}\"" -		wifinets+=(${W_MAC} "${W_ESSID} -- ${W_FLAGS}") +		log "wifi_add" "W_ESSID: \"${W_ESSID}\"" +		wifinets="${wifinets} ${W_MAC} \"${W_ESSID} -- ${W_FLAGS}\""  	done < ${TMPFILE}  	IFS=${LAST_IFS} -	log "$_self" "Wifi nets: \n${wifinets}\n===" -	dialog  --menu 'Select a network' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ -		   "${wifinets[@]}" 2> ${TMPFILE} +	log "wifi_add" "Wifi nets: \n${wifinets}\n===" +	eval "dialog  --menu 'Select a network' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ +		   ${wifinets} " 2> ${TMPFILE}  	if [ $? -eq 1 ]; then  		return  	fi @@ -502,20 +699,22 @@ function wifi_add(){  	wifi_authenticate ${DEVNAME} ${W_MAC} -	if [ $? -ne 0 ]; then +	if [ $? != "0" ]; then  		eval "${DIALOG}  --msgbox 'Error while configuring ${DEVNAME}' "  	fi  	return $?  } -function wifi_save_file(){ +##function  +wifi_save_file(){ -	local DEVNAME=$1 +##local  +DEVNAME=$1  	wpa_cli -i ${DEVNAME} save_config | tail -1 > ${TMPFILE} -	SAVE_STATUS=`<${TMPFILE}` -	if [ ${SAVE_STATUS} == "OK" ]; then +	SAVE_STATUS=$(cat ${TMPFILE}) +	if [ "${SAVE_STATUS}" = "OK" ]; then  		eval "${DIALOG}  --msgbox 'Current configuration dumped to file ${WPA_FILE}' \  			   ${INFO_HEIGHT} ${INFO_WIDTH}"  	else @@ -524,71 +723,73 @@ function wifi_save_file(){  	fi  } -function wifi_remove(){ - -	local DEVNAME=$1 - -	wifi_network_list ${DEVNAME} - -	eval "${DIALOG} --menu 'Select network to remove' \ -           ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST} \ -		   2> ${TMPFILE}" -	 -	if [ $? -eq 0 ]; then -		## a network has been selected -		NETNUM=`<${TMPFILE}` -		WPA_STATUS=`wpa_cli -i ${DEVNAME} remove_network ${NETNUM} | tail -1 ` -		if [ ${WPA_STATUS} == "OK" ]; then -			eval "${DIALOG}  --clear --defaultno --yesno \ +##function  +wifi_remove(){ + +##local  +    DEVNAME=$1 +     +	  wifi_network_list ${DEVNAME} +     +	  eval "${DIALOG} --menu 'Select network to remove' \ +           ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ +		   2> ${TMPFILE} +	   +	  if [ $? -eq 0 ]; then +		    ## a network has been selected +		    NETNUM=$(cat ${TMPFILE}) +		    WPA_STATUS=$(wpa_cli -i ${DEVNAME} remove_network ${NETNUM} | tail -1 ) +		    if [ "${WPA_STATUS}" = "OK" ]; then +			      eval "${DIALOG}  --clear --defaultno --yesno \  				   'Network ${NETNUM} removed\nSave configuration file?' \ -				   ${INFO_HEIGHT} ${INFO_WIDTH} 2> ${TMPFILE}" -			if [ $? -eq 0 ]; then -				## Save the config file -				wifi_save_file ${DEVNAME} -			fi -			 -			return -		else -			eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} NOT removed' \ +				   ${INFO_HEIGHT} ${INFO_WIDTH}" 2> ${TMPFILE} +			      if [ $? -eq 0 ]; then +				        ## Save the config file +				        wifi_save_file ${DEVNAME} +			      fi +			       +			      return +		    else +			      eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} NOT removed' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -			return -		fi -	else -		eval "${DIALOG}  --clear --msgbox 'No network removed!!!' \ +			      return +		    fi +	  else +		    eval "${DIALOG}  --clear --msgbox 'No network removed!!!' \  			   ${INFO_HEIGHT} ${INFO_WIDTH}" -		return -	fi -	 +		    return +	  fi +	    } -function wifi_restart_wpa(){ +##function  +wifi_restart_wpa(){ -	local DEVNAME=$1 -	local WPA_FILE=$2 +##local  +    DEVNAME=$1 +##local  +    WPA_FILE=$2 -	WPA_PID=`ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" |  -sed -r -e 's/^\ +//g' | cut -d " " -f 1` - -	log "${FUNCNAME[0]}" "WPA_PID: ${WPA_PID}" -	kill -n 9 ${WPA_PID} -	 -	if [ $? -ne 0 ]; then -	   eval "${DIALOG}  --clear --msgbox 'Error killing wpa_supplicant' \ -			  ${INFO_HEIGHT} ${INFO_WIDTH}" -	fi - -	wpa_supplicant -B -i ${DEVNAME} -c ${WPA_FILE} -P${WPA_PIDFILE} -	WPA_PID=`ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | cut -d " " -f 1 ` -	WPA_PID_SAVED=`<${WPA_PIDFILE}` -	if [ [ -n ${WPA_PID} ] || [ ${WPA_PID} != ${WPA_PID_SAVED} ] ]; then -		eval "${DIALOG}  --clear --msgbox 'Error restarting wpa_supplicant' \ +    WPA_PID=$(ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" |  +sed -r -e 's/^\ +//g' | cut -d " " -f 1) +     +	  log "wifi_restart_wpa" "WPA_PID: ${WPA_PID}" +	  kill -9 ${WPA_PID} +     +	  wpa_supplicant -B -i ${DEVNAME} -c ${WPA_FILE} -P${WPA_PIDFILE} 2>/dev/null +	  WPA_PID=$(ps ax | grep wpa_supplicant | grep " -i ${DEVNAME}" | \ +                     sed -r -e 's/^\ +//g' | cut -d " " -f 1 ) +	  WPA_PID_SAVED=$(cat ${WPA_PIDFILE}) +    log "wifi_restart_wpa" "WPA_PID: ${WPA_PID} WPA_PID_SAVED: ${WPA_PID_SAVED}" +	  if [ -n "${WPA_PID}" ] &&  [ "${WPA_PID}" != "${WPA_PID_SAVED}" ]; then +		    eval "${DIALOG}  --clear --msgbox 'Error restarting wpa_supplicant' \  			   ${INFO_HEIGHT} ${INFO_WIDTH}" -	else -		eval "${DIALOG}  --clear --msgbox 'wpa_supplicant restarted successfully' \ +	  else +		    eval "${DIALOG}  --clear --msgbox 'wpa_supplicant restarted successfully' \  			   ${INFO_HEIGHT} ${INFO_WIDTH}" -	fi - +	  fi +      } @@ -598,117 +799,125 @@ sed -r -e 's/^\ +//g' | cut -d " " -f 1`  ## one the used has clicked on  ## -function wifi_enable(){ - -	local DEVNAME=$1 - -	wifi_network_list ${DEVNAME} - -	eval "${DIALOG} --menu 'Select configured network' \ -		   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST} \ -		   2> ${TMPFILE}" -	 -	if [ $? -eq 0 ]; then -		## a network has been selected -		NETNUM=`<${TMPFILE}` -		WPA_STATUS=`wpa_cli -i ${DEVNAME} enable ${NETNUM} | tail -1 ` -		if [ ${WPA_STATUS} == "OK" ]; then -			eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} enabled' \ +##function  +wifi_enable(){ + +##local  +    DEVNAME=$1 +     +	  wifi_network_list ${DEVNAME} +     +	  eval "${DIALOG} --menu 'Select configured network' \ +		   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ +		   2> ${TMPFILE} +	   +	  if [ $? -eq 0 ]; then +		    ## a network has been selected +		    NETNUM=$(cat ${TMPFILE}) +		    WPA_STATUS=$(wpa_cli -i ${DEVNAME} enable ${NETNUM} | tail -1 ) +		    if [ "${WPA_STATUS}" = "OK" ]; then +			      eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} enabled' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -			config_ethernet ${DEVNAME} -			return -		else -			eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} NOT enabled' \ +			      config_ethernet ${DEVNAME} +			      return +		    else +			      eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} NOT enabled' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -			return -		fi -	else -		eval "${DIALOG}  --clear --msgbox 'No network enabled!!!' \ +			      return +		    fi +	  else +		    eval "${DIALOG}  --clear --msgbox 'No network enabled!!!' \  			   ${INFO_HEIGHT} ${INFO_WIDTH}" -		return -	fi +		    return +	  fi  } -function wifi_disable(){ - -	local DEVNAME=$1 -	wifi_network_list ${DEVNAME} -	eval "${DIALOG}  --menu 'Select configured network' \ -          ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST} \ -		   2> ${TMPFILE}" -	 -	if [ $? -eq 0 ]; then -		## a network has been selected -		NETNUM=`<${TMPFILE}` -		WPA_STATUS=`wpa_cli -i ${DEVNAME} disable ${NETNUM} | tail -1 ` -		if [ ${WPA_STATUS} == "OK" ]; then -			eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} disabled' \ +##function  +wifi_disable(){ + +##local  +    DEVNAME=$1 +	  wifi_network_list ${DEVNAME} +	  eval "${DIALOG}  --menu 'Select configured network' \ +          ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 ${NETLIST}" \ +		   2> ${TMPFILE} +	   +	  if [ $? -eq 0 ]; then +		    ## a network has been selected +		    NETNUM=$(cat ${TMPFILE}) +		    WPA_STATUS=$(wpa_cli -i ${DEVNAME} disable ${NETNUM} | tail -1 ) +		    if [ "${WPA_STATUS}" = "OK" ]; then +			      eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} disabled' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -			return -		else -			eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} NOT disabled' \ +			      return +		    else +			      eval "${DIALOG}  --clear --msgbox 'Network ${NETNUM} NOT disabled' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -			return -		fi -	else -		eval "${DIALOG}  --clear --msgbox 'No network disabled!!!' \ +			      return +		    fi +	  else +		    eval "${DIALOG}  --clear --msgbox 'No network disabled!!!' \  			   ${INFO_HEIGHT} ${INFO_WIDTH}" -		return -	fi +		    return +	  fi  } -function wifi_load_file(){ -	 -	local DEVNAME=$1 +##function  +wifi_load_file(){ -	eval "${DIALOG}  --fselect ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH} \ -			   2>${TMPFILE}" -	 -	if [ $? -eq 0 ]; then -		SEL_FILE=`<${TMPFILE}` -		while [ -d ${SEL_FILE} ]; do -			eval "${DIALOG}  --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH} \ -					   2>${TMPFILE}" -			if [ $? -eq 0 ]; then -				SEL_FILE=`<${TMPFILE}` -			else -				eval "${DIALOG}  --clear --infobox 'WPA_FILE was not modified' \ +##local  +    DEVNAME=$1 +	   +	  eval "${DIALOG}  --fselect ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ +			   2>${TMPFILE} +	   +	  if [ $? -eq 0 ]; then +		    SEL_FILE=$(cat ${TMPFILE}) +		    while [ -d "${SEL_FILE}" ]; do +			      eval "${DIALOG}  --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ +					   2>${TMPFILE} +			      if [ $? -eq 0 ]; then +				        SEL_FILE=$(cat ${TMPFILE}) +			      else +				        eval "${DIALOG}  --clear --msgbox 'WPA_FILE was not modified' \  						   ${INFO_HEIGHT} ${INFO_WIDTH}" -				return -			fi -		done -		 -		if [ -f ${SEL_FILE} ]; then -			WPA_FILE=${SEL_FILE} -			eval "${DIALOG}  --clear --defaultno --yesno \ +				        return +			      fi +		    done +		     +		    if [ -f "${SEL_FILE}" ]; then +			      WPA_FILE=${SEL_FILE} +			      eval "${DIALOG}  --clear --defaultno --yesno \  					   'WPA_FILE changed to ${WPA_FILE}\nRestart wpa_supplicant?' \  					   ${INFO_HEIGHT} ${INFO_WIDTH}" -			if [ $? -eq 0 ]; then -				wifi_restart_wpa ${DEVNAME} ${WPA_FILE} -			fi -		else -			eval "${DIALOG}  --clear --infobox 'Invalid file name!\n WPA_FILE *not* changed' \ +			      if [ $? -eq 0 ]; then +				        wifi_restart_wpa ${DEVNAME} ${WPA_FILE} +			      fi +		    else +			      eval "${DIALOG}  --clear --msgbox 'Invalid file name!\n WPA_FILE *not* changed' \  					  ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" -			return  -		fi -	else -		eval "${DIALOG}  --clear --infobox 'WPA_FILE was not modified' \ +			      return  +		    fi +	  else +		    eval "${DIALOG}  --clear --msgbox 'WPA_FILE was not modified' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}" -	fi -	 +	  fi +	    } -function config_wifi(){ - -	local DEVNAME=$1 -	 -	while [ 1 -eq 1 ]; do -		eval "${DIALOG}  --clear --cancel-label 'Up' \ +##function  +config_wifi(){ + +##local  +    DEVNAME=$1 +	   +    while true; do +		    eval "${DIALOG}  --clear --cancel-label 'Up' \  			   --menu 'Configuring ${DEVNAME}\n(Current file: ${WPA_FILE})' \  			   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 12 \  			   'Restart' 'Restart wpa_supplicant' \ @@ -720,49 +929,49 @@ function config_wifi(){  			   'Edit' 'Edit current configuration file' \  			   'Save' 'Save configuration to file'\  			   'Load' 'Load configuration from file'\ -			   'New' 'Create new configuration file'\ -		2>${TMPFILE}" -		if [ $? -eq 1 ]; then -			return -		fi -		ACTION=`<${TMPFILE}` -		case ${ACTION} in -			"Restart") -				## Restart wpa_supplicant -				wifi_restart_wpa ${DEVNAME} ${WPA_FILE} -				;; -			"Enable") -				wifi_enable ${DEVNAME} -				;; -			"Disable") -				wifi_disable ${DEVNAME} -				;; -			"Add") -				wifi_add ${DEVNAME} -				;; -			"Remove") -				wifi_remove ${DEVNAME} -				;; -			"Show") -				eval "${DIALOG}  --title 'Current file: ${WPA_FILE}' \ +			   'New' 'Create new configuration file' " \ +             2>${TMPFILE} +         +		    if [ $? = "1" ]; then +			      return +		    fi +		    ACTION=$(cat ${TMPFILE}) +		    case ${ACTION} in +			      "Restart") +				        ## Restart wpa_supplicant +				        wifi_restart_wpa ${DEVNAME} ${WPA_FILE} +				        ;; +			      "Enable") +				        wifi_enable ${DEVNAME} +				        ;; +			      "Disable") +				        wifi_disable ${DEVNAME} +				        ;; +			      "Add") +				        wifi_add ${DEVNAME} +				        ;; +			      "Remove") +				        wifi_remove ${DEVNAME} +				        ;; +			      "Show") +				        eval "${DIALOG}  --title 'Current file: ${WPA_FILE}' \  					   --textbox ${WPA_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" -				;; -			"Edit") -				edit_file ${WPA_FILE} -				;; -			"Save") -				wifi_save_file ${DEVNAME} -				;; -			"Load") -				wifi_load_file ${DEVNAME} -				;; -			"New") -				eval "${DIALOG}  --msgbox 'Sorry!Not yet implemented!' \ -						  ${INFO_HEIGHT} ${INFO_WIDTH} 2>${TMPFILE}" -				;; -		esac -	done - +				        ;; +			      "Edit") +				        edit_file ${WPA_FILE} +				        ;; +			      "Save") +				        wifi_save_file ${DEVNAME} +				        ;; +			      "Load") +				        wifi_load_file ${DEVNAME} +				        ;; +			      "New") +                unimplemented "New" +				        ;; +		    esac +	  done +      } @@ -771,149 +980,177 @@ function config_wifi(){  ## (Re)-Configure a network device  ## -function configure_device(){ - -	local DEVNAME=$1 -	 -	case ${DEVNAME} in -		eth*) -			config_ethernet ${DEVNAME} -			;; -		wlan*) -			config_wifi ${DEVNAME} -			;; -		*) -			eval "${DIALOG}  --clear --title 'ERROR' --msgbox \ -			'${DEVNAME}: Unsupported device type' \ -			${WINDOW_HEIGHT} ${WINDOW_WIDTH}" -			;; -	esac - +##function  +configure_device(){ + +##local  +    DEVNAME=$1 + +    ## Check if the network device is a wifi -- WEAK +    IS_WIFI=$(iwconfig ${DEVNAME} 2>/dev/null | grep -c "IEEE 802.11") +     +	  case ${IS_WIFI} in +		    0) +			      config_ethernet ${DEVNAME} +			      ;; +		    *) +			      config_wifi ${DEVNAME} +			      ;; +	  esac +      } -function set_device_up(){ +##function  +set_device_up(){ -	local DEVNAME=$1 +##local  +DEVNAME=$1  	ip link set ${DEVNAME} up   } -function set_device_down(){ +##function  +set_device_down(){ -	local DEVNAME=$1 +##local  +DEVNAME=$1  	ip link set ${DEVNAME} down  } -function show_device_menu(){ +##function  +show_device_menu(){ -	local DEVNAME=$1 -	while [ 1 -eq 1 ]; do 	 -		eval "${DIALOG}  --clear --cancel-label 'Up' --menu 'Device: ${DEVNAME}' \ -			   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 8 \ -			   'View' 'View current configuration' \ -			   'Conf' 'Configure device' \ -		       'Start' 'Bring interface up' \ -			   'Stop' 'Put interface down' \ -			   'Restart' 'Restart interface' 2> ${TMPFILE}" -		 -		if [ $? -eq 1 ]; then -			return -		fi -		 -		DEV_ACTION=`<${TMPFILE}` -		case ${DEV_ACTION} in -			"View") -				show_device_conf ${DEVNAME} -				;; -			"Conf") -				configure_device ${DEVNAME} -				;; -			"Start") -				set_device_up ${DEVNAME} -				;; -			"Stop")  -				set_device_down ${DEVNAME} -				;; -			"Restart") -				set_device_down ${DEVNAME} -				set_device_up ${DEVNAME} -				;;	 -			*) -				;; -	 -		esac -	done 	 +##local  +    DEVNAME=$1 +     +    while true; do 	 +        DEV_STATUS=$(ip -o link | cut -d " " -f 2,9 | grep -E "^${DEVNAME}: " | cut -d " " -f 2) +        log "show_device_menu" "DEVNAME: ${DEVNAME} DEV_STATUS: ${DEV_STATUS}" +		    eval "${DIALOG}  --clear --cancel-label 'Up' --menu\ +             'Device: ${DEVNAME}\nStatus: ${DEV_STATUS}' \ +			       ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 8 \ +			       'View' 'View current configuration' \ +			       'Conf' 'Configure device' \ +		         'Start' 'Bring interface up' \ +			       'Stop' 'Put interface down' \ +			       'Restart' 'Restart interface'" 2> ${TMPFILE} +		     +		    if [ $? -eq 1 ]; then +			      return +		    fi +		     +		    DEV_ACTION=$(cat ${TMPFILE}) +		    case ${DEV_ACTION} in +			      "View") +				        show_device_conf ${DEVNAME} +				        ;; +			      "Conf") +				        configure_device ${DEVNAME} +				        ;; +			      "Start") +				        set_device_up ${DEVNAME} +				        ;; +			      "Stop")  +				        set_device_down ${DEVNAME} +				        ;; +			      "Restart") +				        set_device_down ${DEVNAME} +				        set_device_up ${DEVNAME} +				        ;;	 +			      *) +				        ;; +	           +		    esac +	  done 	  }  ##  ## Show all the available network devices  ## -function show_devs() { - -	DEVFILE=/proc/net/dev -  	DEVICES=`ip link show | awk 'NR % 2 == 1' | cut -d ":" -f 2` - -	DEVICE_TAGS="" - -	for i in `echo $DEVICES`; do -		if [ $i != "lo" ]; then -			DEVICE_TAGS="${DEVICE_TAGS} $i $i"  -		fi -	done - - 	eval "${DIALOG}  --clear --cancel-label 'Up' \ +##function  +show_devs() { + +  	DEVICES=$(ip link show | awk 'NR % 2 == 1' | cut -d ":" -f 2) +     +	  DEVICE_TAGS="" +     +	  for i in  $DEVICES; do +		    if [ "$i" != "lo" ]; then +			      DEVICE_TAGS="${DEVICE_TAGS} $i $i"  +		    fi +	  done +     + 	  eval "${DIALOG}  --clear --cancel-label 'Up' \  			   --menu 'Select Interface to configure' ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 4 \ -			   ${DEVICE_TAGS} 2> ${TMPFILE}" -	return $? +			   ${DEVICE_TAGS}" 2> ${TMPFILE} +	  return $?  } -function dev_config_menu(){ - -	while [ 1 -eq 1 ]; do  -		show_devs  -		if [ $? -eq 1 ]; then -			return -		fi -		DEVNAME=`<${TMPFILE}` -		show_device_menu ${DEVNAME}			 -	done +##function  +dev_config_menu(){ +     +	  while  true; do  +		    show_devs  +		    if [ $? -eq 1 ]; then +			      return +		    fi +		    DEVNAME=$(cat ${TMPFILE}) +		    show_device_menu ${DEVNAME}			 +	  done  } -function show_info(){ +##function  +show_info(){  	cat <<EOF > ${TMPFILE} -== setnet.sh 0.1 == +                      -+- setnet.sh ${VERSION} -+-  setnet.sh is a simple state-less tool to manage and configure network -interfaces. It is a shell wrapper around the functionalities of "ip", -"dhclient", "wpa_cli", and can be used to configure network -connections via Ethernet/Wi-Fi interfaces. +interfaces. It is a shell wrapper around the functionalities of +standard command-line tools, including "ip", "dhclient", "wpa_cli", +etc., and can be used to configure network connections via +Ethernet/Wi-Fi interfaces. -Both Static and DHCP-based IP configuration is supported.  +Both Static and DHCP-based IP configuration are supported.   At the moment, only WPA-PSK and open (no key) Wi-Fi connections are  available.  +For more information, please visit the webpage of the project: + +    http://kalos.mine.nu/setnet/ + +Please report bugs at: + +    https://git.devuan.org/KatolaZ/setnet +  EOF  	eval "${DIALOG}  --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}"  	return  } -function show_copyright(){ +##function  +show_copyright(){  	cat <<EOF > ${TMPFILE} -== setnet.sh 0.1 == +                          -+- setnet.sh ${VERSION} -+- + +-------------------------------------------------------------------- + +  Copyleft (C) Vincenzo "KatolaZ" Nicosia <katolaz@freaknet.org>  +               2016, 2017 + +-------------------------------------------------------------------- -(c) KatolaZ (katolaz@freaknet.org) -- 2016  EOF  	eval "${DIALOG}  --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" @@ -921,11 +1158,12 @@ EOF  } -function show_license(){ +##function  +show_license(){  	cat <<EOF > ${TMPFILE} -== setnet.sh 0.1 == +                       -+- setnet.sh ${VERSION} -+-  This program is free software: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by @@ -940,11 +1178,12 @@ General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program.  If not, see <http://www.gnu.org/licenses/>. ----------------------------------------------------------------------- +-------------------------------------------------------------------- - (c) KatolaZ <katolaz@freaknet.org> -- 2016 +   Copyleft (C) Vincenzo "KatolaZ" Nicosia <katolaz@freaknet.org>  +                2016, 2017 ----------------------------------------------------------------------- +--------------------------------------------------------------------  EOF  	eval "${DIALOG}  --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" @@ -953,60 +1192,489 @@ EOF -function about_menu(){ +##function  +about_menu(){ -	while [ 1 -eq 1 ]; do  -		eval "${DIALOG}  --cancel-label 'Up' --menu 'setnet ${VERSION} -- About' \ +	  while  true; do  +		    eval "${DIALOG}  --cancel-label 'Up' --menu 'setnet ${VERSION} -- About' \  			   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \  			   'Info' 'General information' \ -			   'Copyright' 'Copyright information' \ -			   'License' 'How to distribute this program' \ -			   2> ${TMPFILE}" -		if [ $? -eq 1 ];then -			return; +			   'Copyleft' 'Copyleft information' \ +			   'License' 'How to distribute this program' " \ +			   2> ${TMPFILE} +		    if [ $? -eq 1 ];then +			      return; +		    fi +		     +		    ACTION=$(cat ${TMPFILE}) +		    case ${ACTION} in +			      "Info") +				        show_info +				        ;; +			      "Copyleft") +				        show_copyright +				        ;; +			      "License") +				        show_license +				        ;; +		    esac +	  done +} + +##function +notfound(){ + +    CMDNAME=$1 + +     +    eval "${DIALOG} --clear --msgbox 'Sorry! Commmand ${CMDNAME} not found!'" \ +         ${INFO_HEIGHT} ${INFO_WIDTH} +     +} + + +##function +netdiag_DNS(){ + +    DUMPFILE=$1 +     +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n=====\n== DNS Configuration (/etc/resolv.conf)\n=====\n\n" >> ${DUMPFILE} +        cat /etc/resolv.conf >> ${DUMPFILE} +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi + +    ## Dump to dialog +    NAMESERVERS=$(grep '^nameserver' /etc/resolv.conf) +    MSG_STR="Configured name servers in /etc/resolv.conf ==\n\n${NAMESERVERS}" + +    eval "${DIALOG} --clear --title 'DNS servers' --msgbox '${MSG_STR}' "\ +         ${WINDOW_HEIGHT} ${WINDOW_WIDTH} +     +} + +##function +netdiag_resolver(){ + +    DUMPFILE=$1 +     +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n=====\n== Resolver Configuration (/etc/nsswitch.conf)\n=====\n\n" >> ${DUMPFILE} +        grep -v '^#' /etc/nsswitch.conf >> ${DUMPFILE} +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi + +    ## Dump to dialog +    RESOLVER=$(grep -v '^#' /etc/nsswitch.conf) + +    eval "${DIALOG} --clear --title 'Resolver configuration (/etc/nsswitch.conf)' \ +          --msgbox '${RESOLVER}' "\ +         ${WINDOW_HEIGHT} ${WINDOW_WIDTH} +     +} + + +##function +netdiag_routes(){ + +    DUMPFILE=$1 + +    HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") +    if [ ${HAS_NETSTAT} -ne 1 ]; then +        notfound "nestat" +        return +    fi + +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n=====\n== Routing table\n=====\n\n" >> ${DUMPFILE} +        netstat -rn >> ${DUMPFILE} +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi +    ## Dump to dialog +    ROUTES=$(netstat -rn > ${TMPFILE} ) +     +    eval "${DIALOG} --clear --no-collapse --title 'Routing table (netstat -rn) [arrows to scroll]'" \ +         "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ +         ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + +##function +netdiag_ARP(){ + +    DUMPFILE=$1 +    log "netdiag_ARP" "DUMPFILE: '${DUMPFILE}'" +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n=====\n== ARP table\n=====\n\n" >> "${DUMPFILE}" +        cat /proc/net/arp >> "${DUMPFILE}" +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi + +    # Dump to dialog +    ARP=$(cat /proc/net/arp >${TMPFILE}) + +    eval "${DIALOG} --clear --no-collapse --title 'ARP table (/proc/net/arp) [arrows to scroll]'" \ +         "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ +         ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + +##function +netdiag_connections(){ + +    DUMPFILE=$1 + +    +    HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") +    if [ ${HAS_NETSTAT} -ne 1 ]; then +        notfound "nestat" +        return +    fi + +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n=====\n== Active Network Connections\n=====\n\n" >> ${DUMPFILE} +        netstat -tnp | sed -r -e 's/$/\n/g' >> ${DUMPFILE} +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi + +    ## Dump to dialog +    SERV=$(netstat -tnp | sed -r -e 's/$/\n/g' > ${TMPFILE}) +     +    eval "${DIALOG} --clear --no-collapse "\ +         " --title 'Active network connections (netstat -tnp) [arrows to scroll]'" \ +         "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ +         ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + + +##function +netdiag_services(){ + +    DUMPFILE=$1 + +    HAS_NETSTAT=$(echo ${HAS_OPTS} | grep -c " netstat ") +    if [ ${HAS_NETSTAT} -ne 1 ]; then +        notfound "nestat" +        return +    fi + +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n=====\n== Active network services\n=====\n\n" >> ${DUMPFILE} +        netstat -ltnp | sed -r -e 's/$/\n/g' >> ${DUMPFILE} +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi +     + +    SERV=$(netstat -ltnp | sed -r -e 's/$/\n/g' > ${TMPFILE}) +     +    eval "${DIALOG} --clear --no-collapse "\ +         " --title 'Active network services (netstat -ltnp) [arrows to scroll]'" \ +         "--tab-correct --tab-len 4 --textbox ${TMPFILE} "\ +         ${LARGE_HEIGHT} ${LARGE_WIDTH} +} + + +##function +netdiag_ping(){ +     +    HAS_PING=$(echo ${HAS_OPTS} | grep -c " ping ") +    if [ ${HAS_PING} -ne 1 ]; then +        notfound "ping" +        return +    fi +    eval "${DIALOG} --insecure --inputbox 'Host or IP to ping:' \ +				   ${INFO_HEIGHT} ${INFO_WIDTH}"  2> ${TMPFILE} + +    if [ $? -ne 0 ]; then +       	eval "${DIALOG}  --clear --msgbox 'Ping Aborted' \ +					   ${INFO_HEIGHT} ${INFO_WIDTH}" +        return +    else +        PINGIP=$(cat ${TMPFILE}) +        ping -c 5 ${PINGIP} > ${TMPFILE} & +        PINGPID=$! +        eval "${DIALOG} --clear --title 'Ping ${PINGIP}'"\ +             "--tailbox ${TMPFILE} " \ +             ${LARGE_HEIGHT} ${LARGE_WIDTH} +        if [ $? -ne 0 ];then +            kill -9 ${PINGPID} +        fi +    fi + +} + +##function +netdiag_traceroute(){ +     +    HAS_TRACERT=$(echo ${HAS_OPTS} | grep -c " traceroute ") +    if [ ${HAS_TRACERT} -ne 1 ]; then +        notfound "traceroute" +        return +    fi +    eval "${DIALOG} --insecure --inputbox 'Host or IP to trace:' \ +				   ${INFO_HEIGHT} ${INFO_WIDTH}"  2> ${TMPFILE} + +    if [ $? -ne 0 ]; then +       	eval "${DIALOG}  --clear --msgbox 'Traceroute Aborted' \ +					   ${INFO_HEIGHT} ${INFO_WIDTH}" +        return +    else +        TRACEIP=$(cat ${TMPFILE}) +        traceroute ${TRACEIP} > ${TMPFILE} & +        TRCPID=$! +        eval "${DIALOG} --clear --title 'Traceroute ${TRACEIP}'"\ +             "--tailbox ${TMPFILE} " \ +             ${LARGE_HEIGHT} ${LARGE_WIDTH} +        if [ $? -ne 0 ];then +            kill -9 ${TRCPID} +        fi +    fi +} + + +##function +netdiag_query(){ + +    HAST_HOST=$(echo ${HAS_OPTS} | grep -c " host ") +    if [ $? -ne 1 ]; then +        notfound "host" +        return +    fi + +    eval "${DIALOG} --insecure --inputbox 'Hostname or IP to query:' \ +				   ${INFO_HEIGHT} ${INFO_WIDTH}"  2> ${TMPFILE} +     +    if [ $? -ne 0 ]; then +       	eval "${DIALOG}  --clear --msgbox 'DNS query aborted' \ +					   ${INFO_HEIGHT} ${INFO_WIDTH}" +        return +    else +        QUERYIP=$(cat ${TMPFILE}) +        host ${QUERYIP} > ${TMPFILE} & +        QUERYPID=$! +        eval "${DIALOG} --clear --title 'host ${QUERYIP}'"\ +             "--tailbox ${TMPFILE} " \ +             ${LARGE_HEIGHT} ${LARGE_WIDTH} +        if [ $? -ne 0 ];then +            kill -9 ${QUERYPID} +        fi +    fi + +} + +##function +netdiag_devices(){ + +    DUMPFILE=$1 + +    if [ -n "${DUMPFILE}" ]; then +        printf "\n=====\n== Network Devices\n=====\n\n" >> ${DUMPFILE} +        ip addr >> ${DUMPFILE} +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi +} + + + +## +## Main menu for network diagnostics +## + +##function +netdiag_menu(){ +     +	  while  true; do  +		    eval "${DIALOG}  --cancel-label 'Up' --menu 'Network diagnostics' \ +			   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ +			   'ARP' 'Show ARP table'  \ +         'Connections' 'List active network connections' \ +			   'DNS' 'List DNS servers' \ +         'Ping' 'Ping a host'  \ +         'Query' 'DNS Query' \ +         'Resolver' 'Show resolver configuration' \ +			   'Routes' 'Show routing table' \ +         'Services' 'List active network daemons'  \ +         'Traceroute' 'Show the route to a host' " \ +			       2> ${TMPFILE} +		    if [ $? -eq 1 ];then +			      return; +		    fi +		     +		    ACTION=$(cat ${TMPFILE}) +		    case ${ACTION} in +			      "ARP") +				        netdiag_ARP +				        ;; +			      "Connections") +				        netdiag_connections +				        ;; +			      "DNS") +				        netdiag_DNS +				        ;; +            "Ping") +				        netdiag_ping +				        ;; +            "Query") +                netdiag_query +                ;; +			      "Resolver") +				        netdiag_resolver +                ;; +			      "Routes") +				        netdiag_routes +                ;; +			      "Services") +				        netdiag_services +				        ;; +			      "Traceroute") +				        netdiag_traceroute +				        ;; +		    esac +	  done +     +     +} + +##function +dump_file(){ +     +    CONF=$1 + +    log "dump_file" "CONF: ${CONF}" +     +    DUMPFILE="/tmp/network_dump.txt" +     +	  eval "${DIALOG}  --fselect ${DUMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ +			   2>${TMPFILE} +	   +	  if [ $? -eq 0 ]; then +		    SEL_FILE=$(cat ${TMPFILE}) +		    while [ -d "${SEL_FILE}" ]; do +			      eval "${DIALOG}  --fselect ${SEL_FILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" \ +					   2>${TMPFILE} +			      if [ $? -eq 0 ]; then +				        SEL_FILE=$(cat ${TMPFILE}) +			      else +				        eval "${DIALOG}  --clear --msgbox 'Dump aborted' \ +						   ${INFO_HEIGHT} ${INFO_WIDTH}" +				        return +			      fi +		    done +		     +        ## The dump starts here.... +			  DUMPFILE=${SEL_FILE} +        truncate -s 0 ${DUMPFILE} +        echo "===== setnet ${VERSION}" >> ${DUMPFILE} +        echo "===== Date: $(date)" >> ${DUMPFILE} +        echo "===== Network configuration dump: ${CONF} " >> ${DUMPFILE} +        for c in ${CONF}; do +            eval "netdiag_${c} \"${DUMPFILE}\"" +        done +	  else +		    eval "${DIALOG}  --clear --msgbox 'Dump aborted' \ +				   ${INFO_HEIGHT} ${INFO_WIDTH}" +        return +	  fi +		eval "${DIALOG}  --clear --msgbox 'Status dumped to ${DUMPFILE}' \ +						   ${INFO_HEIGHT} ${INFO_WIDTH}" +} + + +##function +dump_pastebin(){ +     +    CONF=$1 + +     + +} + +##function  +dump_menu(){ + +    eval "${DIALOG} --clear --checklist 'Select conf to dump' \ +             ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 10 \ +             'ARP' 'ARP table' on \ +             'devices' 'Device configuration' on \ +             'DNS' 'DNS configuration' on \ +             'resolver' 'System resolver configuration' on \ +             'routes' 'Routing table' on \ +             'connections' 'Active network connections' on \ +             'services' 'Active network services' on " 2> ${TMPFILE} +    if [ $? -ne 0 ]; then +        return +    fi +     +    DUMP_CONF=$(cat ${TMPFILE}) +     +    eval "${DIALOG} --clear --cancel-label 'Up' \ +           --menu 'Dump configuration to:' \ +           ${INFO_HEIGHT} ${INFO_WIDTH} 6 \ +           'File' 'Dump to file' \ +           'Pastebin' 'Dump to pastebin'" \ +         2> ${TMPFILE} +    if [ $? -eq 1 ];then +			  return;  		fi -		ACTION=`<${TMPFILE}` +		ACTION=$(cat ${TMPFILE})  		case ${ACTION} in -			"Info") -				show_info -				;; -			"Copyright") -				show_copyright -				;; -			"License") -				show_license -				;; +			  "File") +            dump_file "${DUMP_CONF}" +				    ;; +			  "Pastebin") +            dump_pastebin "${DUMP_CONF}" +				    ;;  		esac -	done  } -function show_toplevel(){ -	 -	eval "${DIALOG} --clear --cancel-label 'Quit' --menu 'Main Menu' \ +##function  +show_toplevel(){ + +    log "show_toplevel" "TMPFILE: ${TMPFILE}" +	  eval "${DIALOG} --clear --cancel-label 'Quit' --menu 'Main Menu' \  		   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \  		   'Setup' 'Setup interfaces' \ -		   'About' 'Info & Copyright' 2> ${TMPFILE}" -	return $? +       'Info' 'Network diagnostics' \ +       'Dump' 'Dump current network status' \ +       'Log' 'View setnet log' \ +		   'About' 'License & Copyleft'" 2> ${TMPFILE} +     +	  return $?  } -function show_help(){ +##function  +show_help(){ -	local SCRIPTNAME=$1 +##local  +SCRIPTNAME=$1  	echo "Usage: ${SCRIPTNAME} [OPTION]"  	echo "Options:" -	echo -e "\t -c cfg_file\tLoad configuration from cfg_file." -	echo -e "\t -v\t\tPrint version number and exit. " -	echo -e "\t -h\t\tShow this help." +	printf  "\t -c cfg_file\tLoad configuration from cfg_file.\n" +	printf  "\t -v\t\tPrint version number and exit.\n" +	printf  "\t -h\t\tShow this help.\n"  } -function show_version(){ +##function  +show_version(){ -	local SCRIPTNAME=$1 +##local  +SCRIPTNAME=$1  	echo "${SCRIPTNAME} -- version ${VERSION}" -	echo "Copyright (C) Vincenzo \"KatolaZ\" Nicosia (katolaz@freaknet.org) -- 2016" +	echo "Copyleft (C) Vincenzo \"KatolaZ\" Nicosia (katolaz@freaknet.org) -- 2016, 2017"  	echo "This is free software. You can use and redistribute it under the "  	echo "terms of the GNU General Public Licence version 3 or (at your option)"  	echo "any later version." @@ -1016,15 +1684,17 @@ function show_version(){  	echo "FITNESS FOR A PARTICULAR PURPOSE."  } -function show_disclaimer(){ +##function  +show_disclaimer(){  	cat <<EOF > ${TMPFILE} -                == setnet.sh 0.1 == +                -+- setnet.sh ${VERSION} -+- -      (c) KatolaZ (katolaz@freaknet.org) -- 2016 +      Copyleft (C) KatolaZ (katolaz@freaknet.org)  +                    2016, 2017 -    -+- This is the alpha release of setnet.sh -+- +     -+- This is an alpha release of setnet.sh -+-                   THIS IS FREE SOFTWARE          YOU CAN USE AND DISTRIBUTE IT UNDER THE  @@ -1036,86 +1706,147 @@ function show_disclaimer(){     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE          See "About" for more information about  -                 copyright and license +           your right and distribution terms  EOF  	eval "${DIALOG}  --clear --cr-wrap --textbox ${TMPFILE} 23 60"  	return  } +##function +initialise(){ + + +    TMPFILE=$( (tempfile) 2>/dev/null) || TMPFILE=/tmp/setnet_$$ +    WPA_PIDFILE=$( (tempfile) 2>/dev/null) || WPA_PIDFILE=/tmp/setnet_wpapid_$$ +     +	  trap cleanup 0 HUP INT TRAP TERM QUIT + +    if [ -z ${TRUNCATE_LOG} ] || \ +           [ ${TRUNCATE_LOG} = "yes" ] || \ +               [ ${TRUNCATE_LOG} = "YES" ]; then +	      truncate -s 0 ${LOGFILE} +    fi +     +} + -function main(){ +##function +log_show(){ +     +    eval "${DIALOG} --clear --cr-wrap --title 'setnet log file (${LOGFILE})'\ +    --textbox ${LOGFILE} \ +    ${WINDOW_HEIGHT} ${WINDOW_WIDTH}"  +     +} + +##function  +main(){ -	truncate -s 0 ${LOGFILE} -	trap cleanup 0 $SIG_NONE $SIG_HUP $SIG_INT $SIG_TRAP $SIG_TERM  	show_disclaimer -	log "setnet" "Starting afresh on `date`" -	SETNETRC=`realpath ${SETNETRC}` +	log "setnet" "Starting afresh on $(date)" +	SETNETRC=$(realpath ${SETNETRC})  	log "main" "Using config file \"${SETNETRC}\"" -	WPA_FILE=`realpath ${WPA_FILE}` +	WPA_FILE=$(realpath ${WPA_FILE})  	log "main" "Using WPA config file \"${WPA_FILE}\"" -	LOFGILE=`realpath ${LOGFILE}` +	LOFGILE=$(realpath ${LOGFILE})  	log "main" "Using log file \"${LOGFILE}\"" -	while [ 1 -eq 1 ]; do  -		show_toplevel -		if [ $? -eq 1 ]; then -			cleanup -			exit 1 -		fi -		ACTION=`<${TMPFILE}` -		case ${ACTION} in -			"Setup") -				dev_config_menu -				;; -			"About") -				about_menu -				;; -		esac +	while  true; do  +		  show_toplevel + +		  if [ $? -eq 1 ]; then +			    cleanup +			    exit 1 +		  fi +      log "main" "${TMPFILE}" +		  ACTION=$(cat ${TMPFILE}) +      log "main" "ACTION: ${ACTION}" +		  case ${ACTION} in +			    "Setup") +				      dev_config_menu +				      ;; +          "Info") +              netdiag_menu +              ;; +          "Dump") +              dump_menu +              ;; +          "Log") +              log_show +              ;; +			    "About") +				      about_menu +				      ;; +		  esac  	done - +    }  ## -## Get the options +## The script starts here +## + + +## +## Get command-line arguments  ##   SETNETRC=""  while getopts ":c:hv" opt; do -	 -	case $opt in -		c) -			echo "Got option -c ${OPTARG}" -			SETNETRC=`realpath ${OPTARG}` -			echo "SETNETRC: ${SETNETRC}" -			;; -		h) -			show_help `basename $0` -			exit 1 -			;; -		v) -			show_version `basename $0` -			exit 1 -			;; -		\?) -			echo "Invalid option: -${OPTARG}" -			exit 1 -			;; -		:) -			echo "Option -${OPTARG} requires an argument" -			exit 1 -			;; -	esac +	   +	  case $opt in +		    c) +			      #echo "Got option -c ${OPTARG}" +			      SETNETRC=$(realpath ${OPTARG}) +			      #echo "SETNETRC: ${SETNETRC}" +			      ;; +		    h) +			      show_help $(basename $0) +			      exit 1 +			      ;; +		    v) +			      show_version $(basename $0) +			      exit 1 +			      ;; +		    \?) +			      echo "Invalid option: -${OPTARG}" +			      exit 1 +			      ;; +		    :) +			      echo "Option -${OPTARG} requires an argument" +			      exit 1 +			      ;; +	  esac  done +## +## Load the configuration file +##  load_setnetrc ${SETNETRC} -main  +## +## Init stuff +## + +initialise  + +## +## Check dependencies. If we are missing someting essential, then exit. +## + +check_deps + +## +## This is the main loop +## + +main  | 
