#!/bin/bash # The script configures simultaneous AP and Managed Mode Wifi on Raspberry Pi # Distribution Raspbian Buster # works on: # -Raspberry Pi Zero W # -Raspberry Pi 3 B+ # -Raspberry Pi 3 A+ # Licence: GPLv3 # Author: Mickael Lehoux # Repository: https://github.com/MkLHX/AP_STA_RPI_SAME_WIFI_CHIP # Special thanks to: https://github.com/lukicdarkoo/rpi-wifi # set -exv # Error management set -o errexit set -o pipefail set -o nounset DEFAULT='\033[0;39m' WHITE='\033[0;02m' RASPBERRY='\033[0;35m' GREEN='\033[1;32m' RED='\033[1;31m' _welcome() { VERSION="1.7.2" echo -e "${RASPBERRY}\n" echo -e " " echo -e " /888888 /8888888 /888888 /88888888 /888888 " echo -e " /88__ 88| 88__ 88 /88 /88__ 88|__ 88__//88__ 88" echo -e "| 88 \ 88| 88 \ 88 | 88 | 88 \__/ | 88 | 88 \ 88" echo -e "| 88888888| 8888888/ /88888888 | 888888 | 88 | 88888888" echo -e "| 88__ 88| 88____/ |__ 88__/ \____ 88 | 88 | 88__ 88" echo -e "| 88 | 88| 88 | 88 /88 \ 88 | 88 | 88 | 88" echo -e "| 88 | 88| 88 |__/ | 888888/ | 88 | 88 | 88" echo -e "|__/ |__/|__/ \______/ |__/ |__/ |__/" echo -e " " echo -e " version ${VERSION} " echo -e " By https://github.com/MkLHX " echo -e "${GREEN} " echo -e "Manage AP + STA modes on Raspberry Pi with the same wifi chip\n\n " } _logger() { echo -e "${GREEN}" echo "${1}" echo -e "${DEFAULT}" } _usage() { cat 1>&2 < [] --client [] --country # configure AP + STA ap_sta_config.sh --ap ap_ssid ap_passphrases --client client_ssid client_passphrase --country FR # configure AP + STA and change the wifi mode ap_sta_config.sh --ap ap_ssid ap_passphrases --client client_ssid client_passphrase --country FR --hwmode b # update the AP configuration ap_sta_config.sh --ap ap_ssid ap_passphrases --ap-only # update the STA (client) configuration ap_sta_config.sh --client client_ssid client_passphrase --country FR --sta-only # logs are written in /var/log/ap_sta_wifi folder PARAMETERS: -a, --ap AP SSID & password -c, --client Client SSID & password -i, --ip AP IP (by default ip pattern 192.168.10.x) -cy, --country ISO3166 Country Code (by default FR) -hw, --hwmode Mode Wi-Fi a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g (by default g) FLAGS: -ao, --ap-only Set only AP -so, --sta-only Set only STA -n, --no-internet Disable IP forwarding -h, --help Show this help EOF exit 0 } POSITIONAL=() while [[ $# -gt 0 ]]; do key="$1" case $key in -c | --client) CLIENT_SSID="$2" CLIENT_PASSPHRASE="$3" shift shift shift ;; -a | --ap) AP_SSID="$2" AP_PASSPHRASE="$3" shift shift shift ;; -i | --ip) ARG_AP_IP="$2" shift shift ;; -cy | --country) ARG_COUNTRY_CODE="$2" shift shift ;; -hw | --hwmode) ARG_WIFI_MODE="$2" shift shift ;; -n | --no-internet) NO_INTERNET="true" shift ;; -ao | --ap-only) AP_ONLY="true" shift ;; -so | --sta-only) STA_ONLY="true" shift ;; -h | --help) _usage shift ;; *) POSITIONAL+=("$1") shift ;; esac done set -- "${POSITIONAL[@]}" if [ $(id -u) != 0 ]; then echo -e "${RED}" echo "You need to be root to run this script! Please run 'sudo bash $0'" echo -e "${DEFAULT}" exit 1 fi # check if crontabs are initialized if [[ 1 -eq $(crontab -l | grep -cF "no crontab for root") ]]; then echo -e ${RED} echo "this script need to use crontab." echo "you have to initialize and configure crontabs before run this script!" echo "run 'sudo crontab -e'" echo "select EDITOR nano or whatever" echo "edit crontab by adding '# a comment line' or whatever" echo "save and exit 'ctrl + s' & 'crtl + x'" echo "restart the script 'sudo bash $0'" echo -e "${DEFAULT}" exit 1 fi (test -v AP_SSID && test -v CLIENT_SSID && test -v ARG_COUNTRY_CODE) || (test -v AP_SSID && test -v AP_ONLY) || (test -v CLIENT_SSID && test -v ARG_COUNTRY_CODE && test -v STA_ONLY) || _usage WIFI_MODE=${ARG_WIFI_MODE:-'g'} COUNTRY_CODE=${ARG_COUNTRY_CODE:-'FR'} AP_IP=${ARG_AP_IP:-'192.168.10.1'} AP_IP_BEGIN=$(echo "${AP_IP}" | sed -e 's/\.[0-9]\{1,3\}$//g') MAC_ADDRESS="$(cat /sys/class/net/wlan0/address)" if ! test -v AP_ONLY; then AP_ONLY="false" fi if ! test -v STA_ONLY; then STA_ONLY="false" fi # welcome cli user _welcome if test true != "${STA_ONLY}" && test true == "${AP_ONLY}"; then # Install dependencies _logger "check if dependencies needed" # keep order of dependencies installation if [[ $(dpkg -l | grep -c cron) == 0 ]]; then apt-get -y update apt-get -y install cron fi if [[ $(dpkg -l | grep -c dhcpcd) == 0 ]]; then apt-get -y update apt-get -y install dhcpcd fi if [[ $(dpkg -l | grep -c hostapd) == 0 ]]; then apt-get -y update apt-get -y install hostapd fi if [[ $(dpkg -l | grep -c dnsmasq) == 0 ]]; then apt-get -y update apt-get -y install dnsmasq fi fi if test true != "${STA_ONLY}"; then # Populate `/etc/udev/rules.d/70-persistent-net.rules` _logger "Populate /etc/udev/rules.d/70-persistent-net.rules" bash -c 'cat > /etc/udev/rules.d/70-persistent-net.rules' < /etc/dnsmasq.conf' < /etc/hostapd/hostapd.conf' < /etc/default/hostapd' < /etc/wpa_supplicant/wpa_supplicant.conf' < /etc/network/interfaces' < /bin/manage-ap0-iface.sh' < /bin/rpi-wifi.sh' <