[ create a new paste ] login | about

Link: http://codepad.org/XCq33YTs    [ raw code | fork ]

Plain Text, pasted on Mar 18:
#!/bin/bash

umask 0077

readonly SCAN_RESULT=/tmp/connman.scan
readonly STORAGE_PATH=/var/lib/connman
readonly VPN_STORAGE_PATH=/var/lib/connman-vpn

get_services() {
	if [[ -f $SCAN_RESULT ]]; then
		dmenu_notify "another connman_dmenu is running"
		exit 1
	fi
	: > $SCAN_RESULT
	trap "rm -f $SCAN_RESULT" EXIT
	connmanctl enable wifi &>/dev/null
	connmanctl scan wifi &>/dev/null
	local line
	while IFS= read -r line; do
		[[ "$line" =~ ^(.+)\ ([^\ ]+)$ ]] || continue
		local name="${BASH_REMATCH[1]// /_}"
		local service_id="${BASH_REMATCH[2]}"
		[[ "$service_id" =~ ^(wifi|vpn)_ ]] && echo "$name $service_id"
	done < <(connmanctl services | sed 's/^.\{4\}//g' | tr -s ' ') >> $SCAN_RESULT
}

count_services() {
	[[ -f $SCAN_RESULT ]] && wc -l < $SCAN_RESULT || echo 0
}

# $1 = index
index_to_name() {
	[[ -f $SCAN_RESULT ]] || exit 1
	awk -v line="$1" 'NR == line { print $1 }' $SCAN_RESULT
}

# $1 = index
index_to_service() {
	[[ -f $SCAN_RESULT ]] || exit 1
	awk -v line="$1" 'NR == line { print $2 }' $SCAN_RESULT
}

# $1 = service id
get_service_security() {
	cut -d _ -f 5 <<<"$1"
}

# $1 = service id
get_service_signal() {
	connmanctl services "$1" | awk '$1 == "Strength" { print $3 }'
}

# $1 = service id
get_service_state() {
	connmanctl services "$1" | awk '$1 == "State" { print $3 }'
}

create_dmenu() {
	[[ -f $SCAN_RESULT ]] || exit 1
	echo "setup vpn pptp"
	local order=1
	local line
	IFS=$'\n'
	for line in $(< $SCAN_RESULT); do
		local name
		local service_id
		local security=vpn
		local signal=""
		local disconnect=""
		IFS=' ' read -r name service_id <<< "$line"
		[[ ! "$(get_service_state "$service_id")" =~ ^(idle|failure)$ ]] && disconnect="(disconnect)"

		if [[ "$service_id" =~ ^wifi_ ]]; then
			security="$(get_service_security "$service_id")"
			signal="$(get_service_signal "$service_id")"
		fi
		printf '%2s  %-40s%9s %-3s %s\n' "$order" "$name" "$security" "$signal" "$disconnect"
		(( order++ ))
	done
}

# $1 = msg
dmenu_notify() {
	: | dmenu -p "$1 (press enter)"
}

# $1 = question
# $2 = var name
dmenu_ask() {
	IFS= read -r "$2" < <(: | dmenu -p "$1")
	if [[ ! "${!2}" ]]; then
		dmenu_notify "Invalid $2"
		exit 1
	fi
}

if (( EUID != 0 )); then
	dmenu_notify "Please run it as root"
	exit 1
fi

get_services
index="$(create_dmenu | dmenu -l "$(( $(count_services) + 1))" -i -p "Select wifi service" | sed 's/^ *//g' | cut -d ' ' -f 1)"

if [[ "$index" == setup ]] ; then
	# create vpn mode
	dmenu_ask "Name this PPTP VPN" name
	name="${name// /_}"
	dmenu_ask "Please provide VPN domain" domain
	dmenu_ask "Please provide identity" identity
	dmenu_ask "Please provide password" password
	cat > "${VPN_STORAGE_PATH}/${name}.config" <<-EOF
	[provider_$name]
	Type = PPTP
	Name = $name
	Host = $(dig +short "$domain")
	Domain = $domain
	PPTP.User = $identity
	PPTP.Password = $password
	EOF
	dmenu_notify "VPN $name is created"
	exit 0
fi

service_id="$(index_to_service "$index")"
[[ "$service_id" ]] || exit 1

name="$(index_to_name "$index")"
echo "$name { $service_id }"

if [[ ! "$(get_service_state "$service_id")" =~ ^(idle|failure)$ ]]; then
	connmanctl disconnect "$service_id"
	dmenu_notify "$name disconnected"
	exit 0
fi

security="$(get_service_security "$service_id")"

# create service file for encryption
if [[ "$security" =~ ^(ieee8021x|psk|wep)$ ]]; then
	config_file="${STORAGE_PATH}/${name}-${security}.config"
	if [[ -f "$config_file" && no != "$(echo -e "yes\nno" | dmenu -p "Use previous profile?")" ]]; then
		echo "use old profile: $config_file"
	else
		dmenu_ask "Please provide password" password
		case "$security" in
		ieee8021x)
			dmenu_ask "Please provide identity" identity
			case "$(echo -e "PEAP/MSCHAPV2\nTTLS/PAP" | dmenu -p "What is your EAP?")" in
			PEAP/MSCHAPV2)
				eap=peap
				phase2=MSCHAPV2
    ;;
			TTLS/PAP)
				eap=ttls
				phase2=pap
    ;;
			*)
				dmenu_notify "Invalid EAP"
				exit 1
    ;;
			esac
			cat > "$config_file" <<-EOF
			[service_$service_id]
			Type = wifi
			Name = $name
			EAP = $eap
			Phase2 = $phase2
			Identity = $identity
			Passphrase = $password
			EOF
   ;;
		psk|wep)
			cat > "$config_file" <<-EOF
			[service_$service_id]
			Type = wifi
			Name = $name
			Passphrase = $password
			EOF
   ;;
		esac
	fi
fi

connman_msg="$(timeout 10 connmanctl connect "$service_id" 2>&1 | head -n 1)"
if grep -qi ^connected <<<"$connman_msg" ; then
	dmenu_notify "connected to $name"
else
	error_msg="automatic timeout for connman_dmenu"
	[[ "$connman_msg" ]] && error_msg="$(cut -d ' ' -f 3- <<<"$connman_msg")"
	dmenu_notify "cannot connect to $name ($error_msg)"
fi



Create a new paste based on this one


Comments: