From c0b4a23c06b91072a34ea314888b49fadf23a6e4 Mon Sep 17 00:00:00 2001 From: Yamozha Date: Sat, 16 Jan 2021 16:27:24 +0200 Subject: [PATCH] added hotspot script we need to install this before bundling into an img --- autohotspot | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++ hotspot.conf | 19 +++++ hotspot.sh | 12 ++++ init.py | 2 + 4 files changed, 227 insertions(+) create mode 100644 autohotspot create mode 100644 hotspot.conf create mode 100644 hotspot.sh diff --git a/autohotspot b/autohotspot new file mode 100644 index 00000000..e29c6062 --- /dev/null +++ b/autohotspot @@ -0,0 +1,194 @@ + +#!/bin/bash +#version 0.961-N/HS + +#You may share this script on the condition a reference to RaspberryConnect.com +#must be included in copies or derivatives of this script. + +#A script to switch between a wifi network and a non internet routed Hotspot +#Works at startup or with a seperate timer or manually without a reboot +#Other setup required find out more at +#http://www.raspberryconnect.com + +wifidev="wlan0" #device name to use. Default is wlan0. +#use the command: iw dev ,to see wifi interface name + +IFSdef=$IFS +cnt=0 +#These four lines capture the wifi networks the RPi is setup to use +wpassid=$(awk '/ssid="/{ print $0 }' /etc/wpa_supplicant/wpa_supplicant.conf | awk -F'ssid=' '{ print $2 }' | sed 's/\r//g'| awk 'BEGIN{ORS=","} {print}' | sed 's/\"/''/g' | sed 's/,$//') +IFS="," +ssids=($wpassid) +IFS=$IFSdef #reset back to defaults + + +#Note:If you only want to check for certain SSIDs +#Remove the # in in front of ssids=('mySSID1'.... below and put a # infront of all four lines above +# separated by a space, eg ('mySSID1' 'mySSID2') +#ssids=('mySSID1' 'mySSID2' 'mySSID3') + +#Enter the Routers Mac Addresses for hidden SSIDs, seperated by spaces ie +#( '11:22:33:44:55:66' 'aa:bb:cc:dd:ee:ff' ) +mac=() + +ssidsmac=("${ssids[@]}" "${mac[@]}") #combines ssid and MAC for checking + +createAdHocNetwork() +{ + echo "Creating Hotspot" + ip link set dev "$wifidev" down + ip a add 10.0.0.5/24 brd + dev "$wifidev" + ip link set dev "$wifidev" up + dhcpcd -k "$wifidev" >/dev/null 2>&1 + systemctl start dnsmasq + systemctl start hostapd +} + +KillHotspot() +{ + echo "Shutting Down Hotspot" + ip link set dev "$wifidev" down + systemctl stop hostapd + systemctl stop dnsmasq + ip addr flush dev "$wifidev" + ip link set dev "$wifidev" up + dhcpcd -n "$wifidev" >/dev/null 2>&1 +} + +ChkWifiUp() +{ + echo "Checking WiFi connection ok" + sleep 20 #give time for connection to be completed to router + if ! wpa_cli -i "$wifidev" status | grep 'ip_address' >/dev/null 2>&1 + then #Failed to connect to wifi (check your wifi settings, password etc) + echo 'Wifi failed to connect, falling back to Hotspot.' + wpa_cli terminate "$wifidev" >/dev/null 2>&1 + createAdHocNetwork + fi +} + + +chksys() +{ + #After some system updates hostapd gets masked using Raspbian Buster, and above. This checks and fixes + #the issue and also checks dnsmasq is ok so the hotspot can be generated. + #Check Hostapd is unmasked and disabled + if systemctl -all list-unit-files hostapd.service | grep "hostapd.service masked" >/dev/null 2>&1 ;then + systemctl unmask hostapd.service >/dev/null 2>&1 + fi + if systemctl -all list-unit-files hostapd.service | grep "hostapd.service enabled" >/dev/null 2>&1 ;then + systemctl disable hostapd.service >/dev/null 2>&1 + systemctl stop hostapd >/dev/null 2>&1 + fi + #Check dnsmasq is disabled + if systemctl -all list-unit-files dnsmasq.service | grep "dnsmasq.service masked" >/dev/null 2>&1 ;then + systemctl unmask dnsmasq >/dev/null 2>&1 + fi + if systemctl -all list-unit-files dnsmasq.service | grep "dnsmasq.service enabled" >/dev/null 2>&1 ;then + systemctl disable dnsmasq >/dev/null 2>&1 + systemctl stop dnsmasq >/dev/null 2>&1 + fi +} + + +FindSSID() +{ +#Check to see what SSID's and MAC addresses are in range +ssidChk=('NoSSid') +i=0; j=0 +until [ $i -eq 1 ] #wait for wifi if busy, usb wifi is slower. +do + ssidreply=$((iw dev "$wifidev" scan ap-force | egrep "^BSS|SSID:") 2>&1) >/dev/null 2>&1 + #echo "SSid's in range: " $ssidreply + printf '%s\n' "${ssidreply[@]}" + echo "Device Available Check try " $j + if (($j >= 10)); then #if busy 10 times goto hotspot + echo "Device busy or unavailable 10 times, going to Hotspot" + ssidreply="" + i=1 + elif echo "$ssidreply" | grep "No such device (-19)" >/dev/null 2>&1; then + echo "No Device Reported, try " $j + NoDevice + elif echo "$ssidreply" | grep "Network is down (-100)" >/dev/null 2>&1 ; then + echo "Network Not available, trying again" $j + j=$((j + 1)) + sleep 2 + elif echo "$ssidreply" | grep "Read-only file system (-30)" >/dev/null 2>&1 ; then + echo "Temporary Read only file system, trying again" + j=$((j + 1)) + sleep 2 + elif echo "$ssidreply" | grep "Invalid exchange (-52)" >/dev/null 2>&1 ; then + echo "Temporary unavailable, trying again" + j=$((j + 1)) + sleep 2 + elif echo "$ssidreply" | grep -v "resource busy (-16)" >/dev/null 2>&1 ; then + echo "Device Available, checking SSid Results" + i=1 + else #see if device not busy in 2 seconds + echo "Device unavailable checking again, try " $j + j=$((j + 1)) + sleep 2 + fi +done + +for ssid in "${ssidsmac[@]}" +do + if (echo "$ssidreply" | grep -F -- "$ssid") >/dev/null 2>&1 + then + #Valid SSid found, passing to script + echo "Valid SSID Detected, assesing Wifi status" + ssidChk=$ssid + return 0 + else + #No Network found, NoSSid issued" + echo "No SSid found, assessing WiFi status" + ssidChk='NoSSid' + fi +done +} + +NoDevice() +{ + #if no wifi device,ie usb wifi removed, activate wifi so when it is + #reconnected wifi to a router will be available + echo "No wifi device connected" + wpa_supplicant -B -i "$wifidev" -c /etc/wpa_supplicant/wpa_supplicant.conf >/dev/null 2>&1 + exit 1 +} + +chksys +FindSSID + +#Create Hotspot or connect to valid wifi networks +if [ "$ssidChk" != "NoSSid" ] +then + if systemctl status hostapd | grep "(running)" >/dev/null 2>&1 + then #hotspot running and ssid in range + KillHotspot + echo "Hotspot Deactivated, Bringing Wifi Up" + wpa_supplicant -B -i "$wifidev" -c /etc/wpa_supplicant/wpa_supplicant.conf >/dev/null 2>&1 + ChkWifiUp + elif { wpa_cli -i "$wifidev" status | grep 'ip_address'; } >/dev/null 2>&1 + then #Already connected + echo "Wifi already connected to a network" + else #ssid exists and no hotspot running connect to wifi network + echo "Connecting to the WiFi Network" + wpa_supplicant -B -i "$wifidev" -c /etc/wpa_supplicant/wpa_supplicant.conf >/dev/null 2>&1 + ChkWifiUp + fi +else #ssid or MAC address not in range + if systemctl status hostapd | grep "(running)" >/dev/null 2>&1 + then + echo "Hostspot already active" + elif { wpa_cli status | grep "$wifidev"; } >/dev/null 2>&1 + then + echo "Cleaning wifi files and Activating Hotspot" + wpa_cli terminate >/dev/null 2>&1 + ip addr flush "$wifidev" + ip link set dev "$wifidev" down + rm -r /var/run/wpa_supplicant >/dev/null 2>&1 + createAdHocNetwork + else #"No SSID, activating Hotspot" + createAdHocNetwork + fi +fi diff --git a/hotspot.conf b/hotspot.conf new file mode 100644 index 00000000..17539118 --- /dev/null +++ b/hotspot.conf @@ -0,0 +1,19 @@ +#2.4GHz setup wifi 80211 b,g,n +interface=wlan0 +driver=nl80211 +ssid=Pesho's IPhone +hw_mode=g +channel=8 +wmm_enabled=0 +macaddr_acl=0 +auth_algs=1 +ignore_broadcast_ssid=0 +wpa=2 +wpa_passphrase=youfinnagetpwned +wpa_key_mgmt=WPA-PSK +wpa_pairwise=CCMP TKIP +rsn_pairwise=CCMP + +country_code=BG +ieee80211n=1 +ieee80211d=1 diff --git a/hotspot.sh b/hotspot.sh new file mode 100644 index 00000000..4983c286 --- /dev/null +++ b/hotspot.sh @@ -0,0 +1,12 @@ +# run this script with sudo +# https://www.raspberryconnect.com/projects/65-raspberrypi-hotspot-accesspoints/158-raspberry-pi-auto-wifi-hotspot-switch-direct-connection + +apt-get -Y install hostapd +apt-get -Y install dnsmasq +systemctl unmask hostapd +systemctl disable hostapd +systemctl disable dnsmasq +mv hotspot.conf /etc/hostapd/hostapd.conf +chmod +x autohotspot +mv autohotspot /usr/bin/autohotspot +(crontab -l 2>/dev/null; echo "*/5 * * * * sudo /usr/bin/autohotspot >/dev/null 2>&1") | crontab -e diff --git a/init.py b/init.py index 16a13b85..a42b364c 100644 --- a/init.py +++ b/init.py @@ -1 +1,3 @@ +import subprocess + print("This is an init script")