#!/bin/env bash interface=""; server="dhcpd" ip="10.5.6.11" range="24" interface_internet="" # For Wifi teth ssid=🦄🌈 passphrase=chocolat # Todo : List interface ✓ # Select first ✓ # Select dhcpd or dnsmasq ✓ # Select ip range ✓ # Select ip ✓ # Help ✓ # Install from Makefile ✓ # Add support for tethapp # dnsmasq config overwrite # Default interface is the first non-wireless interfaces (sorted alpha-num) function guess_wifi { for i in `ls /sys/class/net/`; do if [ -d "/sys/class/net/$i/wireless" ] ; then _interface="$i" fi done echo "${_interface}" } function guess_nowifi { for i in `ls /sys/class/net/`; do if [ ! -d "/sys/class/net/$i/wireless" ] ; then if [ "$interface" ] ; then if [[ "$i" < "$înterface" ]] ; then interface="$i" fi else interface="$i" fi fi done } function guess_internet { options=($(ip route show | grep 'default' | \ sed 's/.*dev/dev/' | sed 's/scope//' | \ sed 's/src \([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}//g' | \ sed 's/link//' | tr -s ' ' | cut -d' ' -f 2)) PS3='Choose internet interface: ' select opt in "${options[@]}" do if [ -n "$opt" ]; then echo "$opt" break fi done } if [ "$1" == "dns" ] ; then server="dnsmasq" shift elif [ "$1" == "teth" ] ; then interface_internet=$(guess_internet) shift elif [ "$1" == "teth_dns" ] || [ "$1" == "teth_dnsmasq" ] ; then interface_internet=$(guess_internet) server="dnsmasq" shift elif [ "$1" == "teth_wifi_dnsmasq" ] ; then interface_internet=$(guess_internet) interface=$(guess_wifi) server="dnsmasq" hotspot="yes" shift elif [ "$1" == "quit" ] || [ "$1" == "close" ] ; then sudo pkill dnsmasq exit elif [ "$1" == "help" ] || [ "$1" == "-h" ] || [ "$1" == "--help" ] ; then echo 'Usage : autoDHCP [interface] [ip/range] [dns]' echo '' echo 'You also put the server type at the start of the command' echo 'Ex :' echo '> autoDHCP wlp3s0 10.5.5.11/24' echo '> autoDHCP eth0 192.168.0.1 dns' echo '> autoDHCP dns eth0 192.168.0.1/30' exit fi if [ "$1" ] ; then interface="$1" echo "Interface set to ${interface}" fi if [ "$2" ] ; then if [[ "$2" =~ .*/.* ]] ; then ip=$(echo $2 | cut -d'/' -f1) range="`echo $2 | cut -d'/' -f2 `" echo "Range set to ${range}" else ip="$2" fi echo "Ip set to ${ip}" fi if [ "$3" == "dns" ] ; then server="dnsmasq" fi IFS='.' read -r -a ipList <<< "$ip" mask=$(( 4294967295 >> 32-${range} << 32-${range} )) ipRaw=$(( ipList[0]*2**24 + ipList[1]*2**16 + ipList[2]*2**8 + ipList[3] )) ipNetRaw=$(( ipRaw & mask )) ipNet="$(( ipNetRaw >> 24 )).$(( ipNetRaw >> 16 & 255 )).$(( ipNetRaw >> 8 & 255)).$(( ipNetRaw & 255))" if [ -z "$interface" ] ; then guess_nowifi fi ######################################################################### ######################## ACTION ######################################### ######################################################################### sudo ip l set "$interface" up sudo ip addr add "${ip}/${range}" dev "$interface" #sudo ip r a "${ip}/${range}" dev "$interface" src "${ip}" if [ "$server" == "dhcpd" ] ; then sudo /usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid "$interface" elif [ "$server" == "dnsmasq" ] ; then echo 'Configure dnsmasq' pidFile=$(mktemp) ip_start=$(echo "${ip}" | sed 's/\(\([0-9]\{1,3\}\.\)\{3\}\)[0-9]\{1,3\}/\1/') ip_start_tmp=$(echo "${ip}" | sed 's/\(\([0-9]\{1,3\}\.\)\{3\}\)//') ip_start_tmp=$((ip_start_tmp+1)) dhcp_range=$(echo ${ip_start}{$ip_start_tmp\,,254}),12h echo "$dhcp_range" cat <<< $( echo " interface=${interface} listen-address=${ip} dhcp-range=${dhcp_range}" ) > /tmp/dnsmasq.conf if sudo dnsmasq --conf-file=/tmp/dnsmasq.conf --pid-file="${pidFile}"; then echo 'Ok dnsmasq prêt' echo "PID : ${pidFile}" else echo 'Erreur : Impossible de démarrer dnsmasq' echo 'Abandon' exit 1 fi else echo "Server name ${server} unknow" fi if [ -n "$interface_internet" ] ; then echo "Routage des connections internet (${interface_internet} => ${interface})" sudo sysctl net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -o "${interface_internet}" -j MASQUERADE sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i "${interface}" -o "${interface_internet}" -j ACCEPT fi if [ "${hotspot}" == "yes" ] ; then echo "Configuration de hostapd" cat <<< $( echo " interface=${interface} ssid=${ssid} wpa=1 wpa_passphrase=${passphrase} channel=11 hw_mode=g logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 ctrl_interface=/var/run/hostapd ctrl_interface_group=0 beacon_int=100 dtim_period=2 max_num_sta=255 rts_threshold=2347 fragm_threshold=2346 macaddr_acl=0 auth_algs=3 ignore_broadcast_ssid=0 wmm_enabled=1 wmm_ac_bk_cwmin=4 wmm_ac_bk_cwmax=10 wmm_ac_bk_aifs=7 wmm_ac_bk_txop_limit=0 wmm_ac_bk_acm=0 wmm_ac_be_aifs=3 wmm_ac_be_cwmin=4 wmm_ac_be_cwmax=10 wmm_ac_be_txop_limit=0 wmm_ac_be_acm=0 wmm_ac_vi_aifs=2 wmm_ac_vi_cwmin=3 wmm_ac_vi_cwmax=4 wmm_ac_vi_txop_limit=94 wmm_ac_vi_acm=0 wmm_ac_vo_aifs=2 wmm_ac_vo_cwmin=2 wmm_ac_vo_cwmax=3 wmm_ac_vo_txop_limit=47 wmm_ac_vo_acm=0 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP wpa=2 vht_oper_chwidth=3 eap_message=hello eapol_key_index_workaround=0 eap_server=0" ) > /tmp/hostapd.conf echo "Lancement du hostpot Wifi" if sudo hostapd /tmp/hostapd.conf ; then echo 'Yeah, i wish you enjoyed it' else echo 'Error: there is a problem with hostapd' fi else echo 'Should be ready ;)' sleep 100d fi echo 'Clean des iptables' sudo iptables --flush sudo iptables -t nat --flush echo 'Clean config' rm /tmp/dnsmasq_hotspot.conf /tmp/hostapd.conf /tmp/dnsmasq.conf 2> /dev/null if [ "${server}" == "dnsmasq" ] ; then echo 'Switch off dnsmasq' sudo kill $(cat $pidFile) fi echo 'Bye 💋' echo 'Have a nice day <3'