#!/bin/sh
# @vasm : VWIRELESSSET
# @level: root
# @description: quick add a wireless connection, all defaults
# 
# (c) JohnVan, 2004
# (c) VLocity Linux, 2004
#
# Released under GNU GPL

VDIR=$(dirname $0)
. $VDIR/vasm-functions

check_root

# Path to files
wdir=/etc/wireless

# Paths to binaries
CHMOD=/bin/chmod

# Defaults

defchmod=600

######################################################################################
## MAIN



promptDesc() 
{
# Ask description
while [ 1 ]; do
  TITLE="Connection Description"
  TEXT="Enter short description:"

  inputwizard "$TEXT" "$TITLE" "$INFO"
  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS

  tINFO=$(cat $freply)

  if [ -z "$tINFO" ]; then
    continue
  else
    INFO=$tINFO
    return 0
  fi
done
}

MenuEncrypt() {
  # Ask about encryption

  DIMENSION="12 68 3"
  TITLE="Encryption Method"
  TEXT="\n
What type of encryption?\n
Select one:"

  $WCMD $LEFT_ALIGN --backtitle "$BACKTITLE" --title "$TITLE" --menu "$TEXT" $DIMENSION \
  "Plaintext" "No encryption - not secure " \
  "WEP"  "Simple form of encryption available on most cards" \
  "WPA/RSN" "Stronger form of encryption" \
  2> $freply

  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS
  
  tEncryption=$(cat $freply)
  
  if [ $tEncryption == "WEP" ]; then
    while [ 1 ]; do
    TEXT="Enter Encryption key as HEX 4567-89AB-C or STRING s:password\n"
      
    inputwizard "$TEXT" "$TITLE" "$KEY"
    STATUS=$?
    [ $STATUS != 0 ] && return $STATUS

    tKEY=$(cat $freply)
      if [ -z "$tKEY" ]; then
      	continue   
      elif [ "`echo $tKEY | grep -e '[^0-9A-Fa-f]'`" ]; then
      	if [ ! "`echo $tKEY | grep -e '^s:*'`" ]; then 
    	   retrybox "KEY '$tKEY' contains illegal characters"
	fi
      fi
      KEY=$tKEY
      Encryption=$tEncryption
      return 0
    done
  elif [ $tEncryption == "WPA/RSN" ]; then
    TEXT="Enter Private Shared Key\n"
    while [ 1 ]; do      
    	inputwizard "$TEXT" "$TITLE" "$PSKEY"
    	STATUS=$?
    	[ $STATUS != 0 ] && return $STATUS
    
    	tPSKEY=$(cat $freply)
    	len=`echo ${#tPSKEY}`
	if [ $len -gt 7 -a $len -lt 64 ]; then
		PSKEY=$tPSKEY
		Encryption=$tEncryption
		return 0
	fi
	retrybox "Passphrase length must be between 8 & 63 characters in length"
    done	
  else
    	Encryption=$tEncryption
  fi
}

menuSave() {
DIMENSION="12 60 2"
TITLE="OKAY TO SAVE?"
TEXT="\n
Is it okay to save information"

$DCMD $LEFT_ALIGN --backtitle "$BACKTITLE" --title "$TITLE" --menu "$TEXT" $DIMENSION \
  "Yes" "I'm Satisfied " \
  "No"  "Do not save" \
  2> $freply
  
  STATUS=$?
  [ $STATUS != 0 ] && return $STATUS
  
  SAVE=$(cat $freply)
  if [ $SAVE = "No" ]; then exit 1 ; fi
  
  if [ $NEWESSID = "YES" ]; then # copy over blank template
  	cp $wdir/blankessid.conf $wdir/$ESSID.essid.conf
  else # create backup copy
  	cp $wdir/$ESSID.essid.conf $wdir/$ESSID.essid.bkp
	if [ -f $wdir/$ESSID.wpa.conf ]; then
		cp $wdir/$ESSID.wpa.conf $wdir/$ESSID.wpa.bkp
	fi
  fi
  
  write_ESSID_Conf 
  if [ $Encryption = "WPA/RSN" ]; then write_WPA_Conf; fi
}

write_ESSID_Conf(){
echo "writing ESSID configuration file for $ESSID"

  ESSID_file=$wdir/$ESSID.essid.conf
  cat $ESSID_file | sed "
  s|^ESSID=.*|ESSID=\"$ESSID\"|
  s#^INFO=.*#INFO=\"$INFO\"# 
  s#^NWID=.*#NWID=\"$NWID\"# 
  s#^MODE=.*#MODE=\"$MODE\"# 
  s#^FREQ=.*#FREQ=\"$FREQ\"# 
  s#^CHANNEL=.*#CHANNEL=\"$CHANNEL\"# 
  s#^SENS=.*#SENS=\"$SENS\"#
  s#^RATE=.*#RATE=\"$RATE\"# 
  s#^RTS=.*#RTS=\"$RTS\"# 
  s#^FRAG=.*#FRAG=\"$FRAG\"#
  s#^IWCONFIG=.*#IWCONFIG=\"$IWCONFIG\"# 
  s#^IWSPY=.*#IWSPY=\"$IWSPY\"#
  s#^IWPRIV=.*#IWPRIV=\"$IWPRIV\"# 
  s#^KEY=.*#KEY=\"$KEY\"# " > $ESSID_file
  if [ $? != 0 ]; then cp $wdir/$ESSID.essid.bkp ESSID_file; echo "FAILED" ; fi
  if [ $Encryption="WPA/RSN" ]; then 
  	cat $ESSID_file | sed "
 	s#^WPA=.*#WPA=yes#
	s|^WPACONF=.*|WPACONF=$wdir/$ESSID.wpa.conf|" > $ESSID_file
  if [ $? != 0 ]; then cp $wdir/$ESSID.essid.bkp ESSID_file; echo "FAILED" ; fi
  fi
  $CHMOD $defchmod $ESSID_file
}


write_WPA_Conf(){
echo "writing WPA Supplicant configuration file for $ESSID"
WPA_file=$wdir/$ESSID.wpa.conf
if [ "$NEWESSID" = "YES" ]; then
	echo "ctrl_interface=/var/run/wpa_supplicant # for wpa_cli support" > $WPA_file
	echo "ap_scan=1" >> $WPA_file
	wpa_passphrase "$ESSID" "$PSKEY" 1>> $WPA_file
else
	hexpsk=`wpa_passphrase "$ESSID" "$PSKEY"|grep [^#]psk`
	cat $WPA_file | sed "
	s/#psk=.*/#psk=\"$PSKEY\"/
	s/[^#]psk=.*/$hexpsk/" > $WPA_file
fi

$CHMOD $defchmod $ESSID_file
}

menuParams() {
  while [ 1 ]; do
  	DIMENSION="20 76 10"
  	TITLE="ADD CONNECTION"
 
	TEXT="\n
Basic Parameters are completed.\n
you may enter optional parameters then select DONE:\n"
	
	$DCMD $LEFT_ALIGN --backtitle "$BACKTITLE" --title "$TITLE" --menu "$TEXT" $DIMENSION \
	"DONE" "Finished Making Changes" \
	"INFO" "= \"$INFO\" --- DESCRIPTION" \
	"ENCRYPTION" "= $Encryption $PSKEY $KEY --- Change Encryption" \
	"NWID" "= \"$NWID\" --- NWID/Domain (cell identifier) : 89AB, 100, off" \
	"MODE" "= \"$MODE\" --- Operation mode : Ad-Hoc, Managed, Master, Repeater, Secondary, auto" \
	"FREQ" "= \"$FREQ\" --- 2.422G, 2.46G (frequency)" \
	"CHANNEL" "= \"$CHANNEL\" --- 1, 2 ,3" \
	"SENS" "= \"$SENS\" --- Sensitivity (cell size + roaming speed) : 1, 2, 3 ; -70 (dBm)" \
	"RATE" "= \"$RATE\" --- Bit rate : auto, 1M, 11M" \
	"RTS" "= \"$RTS\" --- RTS threshold : off, 500" \
	"FRAG" "= \"$FRAG\" --- Fragmentation threshold : off, 1000" \
	"IWCONFIG" "= \"$IWCONFIG\" --- Other iwconfig parameters : power off, ap 01:23:45:67:89:AB" \
	"IWSPY" "= \"$IWSPY\" --- iwspy parameters : + 01:23:45:67:89:AB" \
	"IWPRIV" "= \"$IWPRIV\" --- iwpriv parameters : set_port 2, set_histo 50 60" \
	2> $freply
        
	STATUS=$?
	[ $STATUS != 0 ] && return $STATUS
	choice=$(cat $freply)
	
	case $choice in
		INFO)
			promptDesc
		;;
		ENCRYPTION)
			MenuEncrypt
		;;
		NWID) inputwizard "NWID/Domain (cell identifier) : 89AB, 100, off" "NWID" "$NWID" 
		    	STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			NWID=$(cat $freply)
		;;
		MODE) inputwizard "Operation mode : Ad-Hoc, Managed, Master, Repeater, Secondary, auto" "Set Mode" "$MODE" 
		    	STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			NWID=$(cat $freply)
		;;
		FREQ) inputwizard "2.422G, 2.46G (frequency)" "Set Freq" "$FREQ" 
		    	STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			FREQ=$(cat $freply)
		;;
		CHANNEL) inputwizard "CHANNEL --- 1, 2 ,3" "Set Channel" "$CHANNEL" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			CHANNEL=$(cat $freply)
		;; 
		SENS) inputwizard "Sensitivity (cell size + roaming speed) : 1, 2, 3 ; -70 (dBm)" "Set Sensitivity" "$SENS" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			SENS=$(cat $freply)
		;;
		RATE) inputwizard "Bit rate : auto, 1M, 11M, 54M" "Set Bit Rate" "$RATE" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			RATE=$(cat $freply)
		;;
		RTS) inputwizard "RTS threshold : off, 500" "Set RTS Threshold" "$RTS" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			RTS=$(cat $freply)
		;;
		FRAG) inputwizard "Fragmentation threshold : off, 1000" "Set Fragmentation Threshold" "$FRAG" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			FRAG=$(cat $freply)
		;;
		IWCONFIG) inputwizard "Other iwconfig parameters : power off, ap 01:23:45:67:89:AB" "Other Iwconfig" "$IWCONFIG" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			IWCONFIG=$(cat $freply)
		;;
		IWSPY) inputwizard "iwspy parameters : + 01:23:45:67:89:AB" "Set IWSPY Parameters" "$IWSPY" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			IWSPY=$(cat $freply)
		;;
		IWPRIV) inputwizard "iwpriv parameters : set_port 2, set_histo 50 60" "Set IWPRIV Parameters" "$IWPRIV" 
			STATUS=$?
    			[ $STATUS != 0 ] && return $STATUS
    			IWPRIV=$(cat $freply)
		;;
		DONE)
			return 0
		;;

	esac
  done
}

# Main Program

# if a new connection prompt for basic info
ESSID=$1

# else if existing connection get parameters from file(s).
if [ -f "$wdir"/"$ESSID".essid.conf ]; then
	. "$wdir"/"$ESSID".essid.conf
	NEWESSID="NO"
	if [ "$WPA" == "yes" ]; then 
		Encryption="WPA/RSN"
		tmp="`grep \#psk $wdir/$ESSID.wpa.conf`" 
		if [ ! -z tmp ]; then 
			PSKEY=`echo $tmp | cut -f 2 -d '='`
			PSKEY=`echo $PSKEY | cut -f2 -d '"'`
			echo $PSKEY
		else
			tmp="`grep psk $wdir/$ESSID.wpa.conf`"
			if [ ! -z tmp ]; then 
				PSKEY="`echo $tmp | cut -f 2 -d '='`"
				echo $tmp
			fi
		fi
	elif [ -z $KEY ]; then 
		Encryption="Plaintext"
	else Encryption="WEP"
	fi
	wizard menuParams menuSave
else
	. $wdir/blankessid.conf
	NEWESSID="YES"
	ESSID=$1
	while [ 1 ]; do
		wizard promptDesc MenuEncrypt menuParams menuSave
	done
fi


