From e6ee41b03cdf8f5675d6e52b45a28523610443bf Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Tue, 3 Jan 2017 01:26:36 +0000 Subject: setnet.dash moved to setnet.sh -- Fixed a few bugs --- setnet.sh | 1983 ++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 1357 insertions(+), 626 deletions(-) diff --git a/setnet.sh b/setnet.sh index 3a173c0..7e39341 100755 --- a/setnet.sh +++ b/setnet.sh @@ -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 < ${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 < ${TMPFILE} -== setnet.sh 0.1 == + -+- setnet.sh ${VERSION} -+- + +-------------------------------------------------------------------- + + Copyleft (C) Vincenzo "KatolaZ" Nicosia + 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 < ${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 . ----------------------------------------------------------------------- +-------------------------------------------------------------------- - (c) KatolaZ -- 2016 + Copyleft (C) Vincenzo "KatolaZ" Nicosia + 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 < ${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 -- cgit v1.2.3