diff options
| -rwxr-xr-x | setnet.dash | 377 | 
1 files changed, 327 insertions, 50 deletions
| diff --git a/setnet.dash b/setnet.dash index bb92fdd..e005efa 100755 --- a/setnet.dash +++ b/setnet.dash @@ -19,7 +19,8 @@  #  # ----------------------------------------------------------------------  # -# Copyleft (c) KatolaZ (katolaz@freaknet.org) -- (2016, 2017) +# Copyleft (C) Vincenzo "KatolaZ" Nicosia (katolaz@freaknet.org) -- +# (2016, 2017)  #  # @@ -55,6 +56,14 @@ HARD_DEPS="ip dhclient dialog netstat"  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 arping traceroute netstat pastebinit" +  #################################  ##################################### @@ -226,11 +235,14 @@ check_shell(){  ##  ## - check if the current shell is supported through check_shell  ## -## - each command in HARD_DEPS MUST exists, or the script exits +## - each command in HARD_DEPS MUST exist, or the script exits  ## -## - each command in SOFT_DEPS SHOULD exists, od the script will log a +## - 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(){ @@ -239,19 +251,29 @@ check_deps(){      for h in ${HARD_DEPS}; do          _W=$(which ${h}) -        if [ -z $_W ]; then +        if [ -z ${_W} ]; then              echo "Error: required command \"${h}\" not found. Exiting..."              exit 1          fi -        log "check_deps" "${h}...found" +        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: ${s} not found! Some functions might not work properly" +        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" +        fi +    done +      }  ## @@ -430,9 +452,9 @@ config_ethernet_dhcp(){  ##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}  } @@ -855,7 +877,7 @@ wifi_load_file(){  			      if [ $? -eq 0 ]; then  				        SEL_FILE=$(cat ${TMPFILE})  			      else -				        eval "${DIALOG}  --clear --infobox 'WPA_FILE was not modified' \ +				        eval "${DIALOG}  --clear --msgbox 'WPA_FILE was not modified' \  						   ${INFO_HEIGHT} ${INFO_WIDTH}"  				        return  			      fi @@ -870,12 +892,12 @@ wifi_load_file(){  				        wifi_restart_wpa ${DEVNAME} ${WPA_FILE}  			      fi  		    else -			      eval "${DIALOG}  --clear --infobox 'Invalid file name!\n WPA_FILE *not* changed' \ +			      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' \ +		    eval "${DIALOG}  --clear --msgbox 'WPA_FILE was not modified' \  				   ${INFO_HEIGHT} ${INFO_WIDTH}"  	  fi @@ -957,22 +979,20 @@ config_wifi(){  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 +    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 +      } @@ -1002,8 +1022,12 @@ show_device_menu(){  ##local       DEVNAME=$1 +          while true; do 	 -		    eval "${DIALOG}  --clear --cancel-label 'Up' --menu 'Device: ${DEVNAME}' \ +        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' \ @@ -1082,18 +1106,27 @@ 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 @@ -1104,9 +1137,15 @@ 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, 2017  EOF  	eval "${DIALOG}  --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" @@ -1119,7 +1158,7 @@ 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 @@ -1134,11 +1173,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, 2017 +   Copyleft (C) Vincenzo "KatolaZ" Nicosia <katolaz@freaknet.org>  +                2016, 2017 ----------------------------------------------------------------------- +--------------------------------------------------------------------  EOF  	eval "${DIALOG}  --clear --cr-wrap --textbox ${TMPFILE} ${WINDOW_HEIGHT} ${WINDOW_WIDTH}" @@ -1177,8 +1217,31 @@ about_menu(){  }  ##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======== DNS Configuration (/etc/resolv.conf)\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}" @@ -1188,10 +1251,49 @@ netdiag_DNS(){  }  ##function +netdiag_resolver(){ + +    DUMPFILE=$1 +     +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n======== Resolver Configuration (/etc/nsswitch.conf)\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(){ -    ROUTES=$(netstat -rn > ${TMPFILE} ) +    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======== Routing table\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} @@ -1200,6 +1302,17 @@ netdiag_routes(){  ##function  netdiag_ARP(){ +    DUMPFILE=$1 +    log "netdiag_ARP" "DUMPFILE: '${DUMPFILE}'" +    if [ -n "${DUMPFILE}" ]; then +        ## Dump to file +        printf "\n======== ARP table\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]'" \ @@ -1210,8 +1323,26 @@ netdiag_ARP(){  ##function  netdiag_connections(){ -    SERV=$(netstat -tnp | sed -r -e 's/$/\n/g' > ${TMPFILE}) +    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======== Active Network Connections\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} "\ @@ -1222,6 +1353,23 @@ netdiag_connections(){  ##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======== Active network services\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 "\ @@ -1234,6 +1382,11 @@ netdiag_services(){  ##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} @@ -1258,6 +1411,11 @@ netdiag_ping(){  ##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} @@ -1281,7 +1439,13 @@ netdiag_traceroute(){  ##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} @@ -1303,6 +1467,20 @@ netdiag_query(){  } +##function +netdiag_devices(){ + +    DUMPFILE=$1 + +    if [ -n "${DUMPFILE}" ]; then +        printf "\n======== Network Devices\n" >> ${DUMPFILE} +        ip addr >> ${DUMPFILE} +        echo "==================================" >> ${DUMPFILE} +        return 0 +    fi +} + +  ##  ## Main menu for network diagnostics @@ -1319,6 +1497,7 @@ netdiag_menu(){  			   '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' " \ @@ -1344,6 +1523,9 @@ netdiag_menu(){              "Query")                  netdiag_query                  ;; +			      "Resolver") +				        netdiag_resolver +                ;;  			      "Routes")  				        netdiag_routes                  ;; @@ -1359,6 +1541,96 @@ netdiag_menu(){  } +##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 " >> ${DUMPFILE} +        for c in ${CONF}; do +            eval "netdiag_${c} \"${DUMPFILE}\"" +        done +	  else +		    eval "${DIALOG}  --clear --msgbox 'Dump aborted' \ +				   ${INFO_HEIGHT} ${INFO_WIDTH}" +	  fi +} + + +##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=$(cat ${TMPFILE}) +		case ${ACTION} in +			  "File") +            dump_file "${DUMP_CONF}" +				    ;; +			  "Pastebin") +            dump_pastebin "${DUMP_CONF}" +				    ;; +		esac +} +  ##function   show_toplevel(){ @@ -1368,6 +1640,7 @@ show_toplevel(){  		   ${WINDOW_HEIGHT} ${WINDOW_WIDTH} 6 \  		   'Setup' 'Setup interfaces' \         'Info' 'Network diagnostics' \ +       'Dump' 'Dump current network status' \  		   'About' 'License & Copyleft'" 2> ${TMPFILE}  	  return $? @@ -1407,11 +1680,12 @@ show_disclaimer(){  	cat <<EOF > ${TMPFILE} -                == setnet.sh 0.1 == +                -+- setnet.sh ${VERSION} -+- -      (c) KatolaZ (katolaz@freaknet.org) -- 2016, 2017 +      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  @@ -1423,7 +1697,7 @@ 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" @@ -1437,7 +1711,7 @@ initialise(){      TMPFILE=$( (tempfile) 2>/dev/null) || TMPFILE=/tmp/setnet_$$      WPA_PIDFILE=$( (tempfile) 2>/dev/null) || WPA_PIDFILE=/tmp/setnet_wpapid_$$ -	  trap cleanup 0 NONE HUP INT TRAP TERM QUIT +	  trap cleanup 0 HUP INT TRAP TERM QUIT      if [ -z ${TRUNCATE_LOG} ] || \             [ ${TRUNCATE_LOG} = "yes" ] || \ @@ -1479,6 +1753,9 @@ main(){            "Info")                netdiag_menu                ;; +          "Dump") +              dump_menu +              ;;  			    "About")  				      about_menu  				      ;; @@ -1503,9 +1780,9 @@ while getopts ":c:hv" opt; do  	  case $opt in  		    c) -			      echo "Got option -c ${OPTARG}" +			      #echo "Got option -c ${OPTARG}"  			      SETNETRC=$(realpath ${OPTARG}) -			      echo "SETNETRC: ${SETNETRC}" +			      #echo "SETNETRC: ${SETNETRC}"  			      ;;  		    h)  			      show_help $(basename $0) | 
