diff --git a/ap.sh b/ap.sh new file mode 100644 index 0000000..0ac0444 --- /dev/null +++ b/ap.sh @@ -0,0 +1,392 @@ +#!/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' <