diff --git a/ap-setup.sh b/ap-setup.sh index 93eca0f..ff226be 100755 --- a/ap-setup.sh +++ b/ap-setup.sh @@ -7,35 +7,36 @@ # SPDX-License-Identifier: GPL-2.0 # Wireless Access Point Raspberry Pi Setup + function get_ap_params() { echo "" - wapssidok=0 - while [ "$wapssidok" -ne 1 ] + wapssidok="no" + while [[ "$wapssidok" == "no" ]] do echo "This access point will need an SSID. This is what will appear" echo "as the name of this terminal when other devices connect." echo -n "Please enter the desired SSID for this access point: " read wapssid - if [ "$wapssid" = "" ] + if [[ "$wapssid" = "" ]] then echo "SSID cannot be blank. Try again." else - wapssidok=1 + wapssidok="yes" fi done - wappassok=0 - while [ "$wappassok" -ne 1 ] + wappassok="no" + while [[ "$wappassok" == "no" ]] do echo "You will need to set a passphrase for this access point. It should" echo "be at least 8 characters in length and cannot be blank." echo -n "Please enter the desired passphrase for this access point: " read wappass - wappasslen=`echo -n $wappass | wc -m` - if [ "$wappass" = "" -o "$wappasslen" -lt 8 ] + wappasslen=$(echo -n $wappass | wc -m) + if [[ "$wappass" == "" || $wappasslen -lt 8 ]] then echo "Passphrase doesn't satisfy requirements above. Try again." else - wappassok=1 + wappassok="yes" fi done # Save parameters in config file @@ -43,8 +44,76 @@ function get_ap_params() { sed -i 's,'wappass=.*','wappass="\"$wappass\""',' /etc/piwifiap.conf } -current_user=`whoami` -if [ "$current_user" != "root" ] +function config_systemd-networkd() { + echo "Configuring as wireless access point using systemd-networkd." + get_ap_params + # Save network system in config file + sed -i 's,'network_system=.*','network_system="\"systemd-networkd\""',' /etc/piwifiap.conf + + apt install hostapd + systemctl unmask hostapd + systemctl enable hostapd + echo "[NetDev]" >/etc/systemd/network/bridge-br0.netdev + echo "Name=br0" >>/etc/systemd/network/bridge-br0.netdev + echo "Kind=bridge" >>/etc/systemd/network/bridge-br0.netdev + echo "[Match]" >/etc/systemd/network/br0-member-eth0.network + echo "Name=eth0" >>/etc/systemd/network/br0-member-eth0.network + echo "" >>/etc/systemd/network/br0-member-eth0.network + echo "[Network]" >>/etc/systemd/network/br0-member-eth0.network + echo "Bridge=br0" >>/etc/systemd/network/br0-member-eth0.network + systemctl enable systemd-networkd + mv /etc/dhcpcd.conf /etc/dhcpcd.conf.old + echo "denyinterfaces wlan0 eth0" >/etc/dhcpcd.conf + cat /etc/dhcpcd.conf.old >>/etc/dhcpcd.conf + echo "interface br0" >>/etc/dhcpcd.conf + rfkill unblock wlan + echo "country_code=US" >/etc/hostapd/hostapd.conf + echo "interface=wlan0" >>/etc/hostapd/hostapd.conf + echo "bridge=br0" >>/etc/hostapd/hostapd.conf + echo "ssid=$wapssid" >>/etc/hostapd/hostapd.conf + echo "hw_mode=g" >>/etc/hostapd/hostapd.conf + echo "channel=7" >>/etc/hostapd/hostapd.conf + echo "macaddr_acl=0" >>/etc/hostapd/hostapd.conf + echo "auth_algs=1" >>/etc/hostapd/hostapd.conf + echo "ignore_broadcast_ssid=0" >>/etc/hostapd/hostapd.conf + echo "wpa=2" >>/etc/hostapd/hostapd.conf + echo "wpa_passphrase=$wappass" >>/etc/hostapd/hostapd.conf + echo "wpa_key_mgmt=WPA-PSK" >>/etc/hostapd/hostapd.conf + echo "wpa_pairwise=TKIP" >>/etc/hostapd/hostapd.conf + echo "rsn_pairwise=CCMP" >>/etc/hostapd/hostapd.conf + if dpkg -l|grep webmin >/dev/null 2>&1 + then + wget -c http://github.com/pjz/webmin-modules/releases/download/v1.0/hostap.wbm.gz + gzip -d hostap.wbm.gz + /usr/share/webmin/install-module.pl hostap.wbm + fi + echo "" + echo "" +} + +function config_NetworkManager() { + echo "Configuring as wireless access point using NetworkManager." + rfkill unblock wlan + get_ap_params + + # Clean up a possible failed previous attempt + nmcli con del piwifi-ap >/dev/null 2>&1 + nmcli con del piwifi-ethernet >/dev/null 2>&1 + nmcli con del piwifi-apbridge >/dev/null 2>&1 + + # Save network system in config file + sed -i 's,'network_system=.*','network_system="\"NetworkManager\""',' /etc/piwifiap.conf + + nmcli device wifi hotspot ssid $wapssid password $wappass + nmcli connection add type bridge con-name 'Bridge' ifname bridge0 + nmcli connection add type ethernet slave-type bridge con-name 'Ethernet' ifname eth0 master bridge0 + nmcli connection modify 'Hotspot' master bridge0 + nmcli connection up Bridge + nmcli connection up Hotspot +} + +current_user=$(whoami) +if [[ "$current_user" != "root" ]] then echo "You must have root privileges to run this setup." echo "Try 'sudo $0'" @@ -56,7 +125,7 @@ echo "If this terminal connects to a network using ethernet, it can be configure echo "as a wireless access point for other terminals. Would you like to configure" echo -n "this terminal as an access point? [y/N]: " read wapconf -if [ "$wapconf" = "Y" -o "$wapconf" = "y" ] +if [[ "$wapconf" == "Y" || "$wapconf" == "y" ]] then # Determine if we are using NetworkManager or systemd-networkd echo "" @@ -66,89 +135,10 @@ then cp -Rv apsetup/etc/* /etc if systemctl status dhcpcd.service|grep -q "Active: active (running)" then - echo "Configuring as wireless access point using systemd-networkd." - get_ap_params - # Save network system in config file - sed -i 's,'network_system=.*','network_system="\"systemd-networkd\""',' /etc/piwifiap.conf - - apt install hostapd - systemctl unmask hostapd - systemctl enable hostapd - echo "[NetDev]" >/etc/systemd/network/bridge-br0.netdev - echo "Name=br0" >>/etc/systemd/network/bridge-br0.netdev - echo "Kind=bridge" >>/etc/systemd/network/bridge-br0.netdev - echo "[Match]" >/etc/systemd/network/br0-member-eth0.network - echo "Name=eth0" >>/etc/systemd/network/br0-member-eth0.network - echo "" >>/etc/systemd/network/br0-member-eth0.network - echo "[Network]" >>/etc/systemd/network/br0-member-eth0.network - echo "Bridge=br0" >>/etc/systemd/network/br0-member-eth0.network - systemctl enable systemd-networkd - mv /etc/dhcpcd.conf /etc/dhcpcd.conf.old - echo "denyinterfaces wlan0 eth0" >/etc/dhcpcd.conf - cat /etc/dhcpcd.conf.old >>/etc/dhcpcd.conf - echo "interface br0" >>/etc/dhcpcd.conf - rfkill unblock wlan - echo "country_code=US" >/etc/hostapd/hostapd.conf - echo "interface=wlan0" >>/etc/hostapd/hostapd.conf - echo "bridge=br0" >>/etc/hostapd/hostapd.conf - echo "ssid=$wapssid" >>/etc/hostapd/hostapd.conf - echo "hw_mode=g" >>/etc/hostapd/hostapd.conf - echo "channel=7" >>/etc/hostapd/hostapd.conf - echo "macaddr_acl=0" >>/etc/hostapd/hostapd.conf - echo "auth_algs=1" >>/etc/hostapd/hostapd.conf - echo "ignore_broadcast_ssid=0" >>/etc/hostapd/hostapd.conf - echo "wpa=2" >>/etc/hostapd/hostapd.conf - echo "wpa_passphrase=$wappass" >>/etc/hostapd/hostapd.conf - echo "wpa_key_mgmt=WPA-PSK" >>/etc/hostapd/hostapd.conf - echo "wpa_pairwise=TKIP" >>/etc/hostapd/hostapd.conf - echo "rsn_pairwise=CCMP" >>/etc/hostapd/hostapd.conf - if dpkg -l|grep webmin >/dev/null 2>&1 - then - wget -c http://github.com/pjz/webmin-modules/releases/download/v1.0/hostap.wbm.gz - gzip -d hostap.wbm.gz - /usr/share/webmin/install-module.pl hostap.wbm - fi - echo "" - echo "" + config_systemd-networkd elif systemctl status NetworkManager.service|grep -q "Active: active (running)" then - echo "Configuring as wireless access point using NetworkManager." - rfkill unblock wlan - get_ap_params - - # Clean up a possible failed previous attempt - nmcli con del piwifi-ap >/dev/null 2>&1 - nmcli con del piwifi-ethernet >/dev/null 2>&1 - nmcli con del piwifi-apbridge >/dev/null 2>&1 - - # Save network system in config file - sed -i 's,'network_system=.*','network_system="\"NetworkManager\""',' /etc/piwifiap.conf - - nmcli con add type bridge \ - con-name piwifi-apbridge \ - ifname bridge0 - - nmcli con add type ethernet \ - slave-type bridge \ - con-name piwifi-ethernet \ - ifname eth0 \ - master bridge0 - - nmcli con add type wifi \ - ifname wlan0 \ - con-name piwifi-ap \ - autoconnect yes \ - ssid "$wapssid" \ - slave-type bridge \ - master bridge0 \ - wifi-sec.key-mgmt wpa-psk \ - wifi-sec.psk "$wappass" \ - 802-11-wireless.mode ap \ - 802-11-wireless.band bg - - nmcli con up piwifi-apbridge - nmcli con up piwifi-ethernet - nmcli con up piwifi-ap + config_NetworkManager else echo "Unable to determine what type of network configuration (systemd-networkd" echo "or NetworkManager) your system uses. Automatic setup cannot continue."