point_of_sale/tools/posbox/configuration/connect_to_server_wifi.sh

153 lines
4.6 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
# Write the server configuration
# call with ESSID and optionally a password
# when called without an ESSID, it will attempt
# to reconnect to a previously chosen network
function connect () {
SERVER="${1}"
CURRENT_SERVER_FILE=/home/pi/odoo-remote-server.conf
HOSTS=/root_bypass_ramdisks/etc/hosts
HOST_FILE=/root_bypass_ramdisks/etc/hostname
HOSTNAME="$(hostname)"
TOKEN_FILE=/home/pi/token
TOKEN="${3}"
IOT_NAME="${2}"
IOT_NAME="${IOT_NAME//[^[:ascii:]]/}"
IOT_NAME="${IOT_NAME//[^a-zA-Z0-9-]/}"
if [ -z "$IOT_NAME" ]
then
IOT_NAME="${HOSTNAME}"
fi
sudo mount -o remount,rw /
sudo mount -o remount,rw /root_bypass_ramdisks
if [ ! -z "${1}" ]
then
echo "${SERVER}" > ${CURRENT_SERVER_FILE}
echo "${TOKEN}" > ${TOKEN_FILE}
fi
if [ "${IOT_NAME}" != "${HOSTNAME}" ]
then
sudo sed -i "s/${HOSTNAME}/${IOT_NAME}/g" ${HOSTS}
echo "${IOT_NAME}" > /tmp/hostname
sudo cp /tmp/hostname "${HOST_FILE}"
echo "interface=wlan0" > /root_bypass_ramdisks/etc/hostapd/hostapd.conf
echo "ssid=${IOT_NAME}" >> /root_bypass_ramdisks/etc/hostapd/hostapd.conf
echo "channel=1" >> /root_bypass_ramdisks/etc/hostapd/hostapd.conf
sudo hostname "${IOT_NAME}"
fi
sudo mount -o remount,ro /
sudo mount -o remount,ro /root_bypass_ramdisks
WPA_PASS_FILE="/tmp/wpa_pass.txt"
PERSISTENT_WIFI_NETWORK_FILE="/home/pi/wifi_network.txt"
CURRENT_WIFI_NETWORK_FILE="/tmp/current_wifi_network.txt" # used to repair connection when we lose it
LOST_WIFI_FILE="/tmp/lost_wifi.txt"
ESSID="${4}"
PASSWORD="${5}"
PERSIST="${6}"
NO_AP="${7}"
sleep 3
sudo pkill -f keep_wifi_alive.sh
WIFI_WAS_LOST=$?
# make network choice persistent
if [ -n "${ESSID}" ] ; then
if [ -n "${PERSIST}" ] ; then
logger -t posbox_connect_to_server_wifi "Making network selection permanent"
sudo mount -o remount,rw /
echo "${ESSID}" > ${PERSISTENT_WIFI_NETWORK_FILE}
echo "${PASSWORD}" >> ${PERSISTENT_WIFI_NETWORK_FILE}
sudo mount -o remount,ro /
fi
else
logger -t posbox_connect_to_server_wifi "Reading configuration from ${PERSISTENT_WIFI_NETWORK_FILE}"
ESSID=$(head -n 1 "${PERSISTENT_WIFI_NETWORK_FILE}" | tr -d '\n')
PASSWORD=$(tail -n 1 "${PERSISTENT_WIFI_NETWORK_FILE}" | tr -d '\n')
fi
echo "${ESSID}" > ${CURRENT_WIFI_NETWORK_FILE}
echo "${PASSWORD}" >> ${CURRENT_WIFI_NETWORK_FILE}
logger -t posbox_connect_to_server_wifi "Connecting to ${ESSID}"
sudo service hostapd stop
sudo killall nginx
current_iotbox_version=$(cat "/var/odoo/iotbox_version")
# Above this version we need the NetworkManager
required_version="23.09"
if [[ "$current_iotbox_version" > "$required_version" ]]; then
logger -t posbox_connect_to_server_wifi "USING NETWORK MANAGER"
# Necessary when comming from the access point
sudo ip address del 10.11.12.1/24 dev wlan0
sudo nmcli g reload
if [ -z "${PASSWORD}" ] ; then
sudo nmcli d wifi connect "${ESSID}"
else
sudo nmcli d wifi connect "${ESSID}" password "${PASSWORD}"
fi
sudo service nginx restart
else
logger -t posbox_connect_to_server_wifi "USING WPA_SUPPLICANT"
sudo service nginx restart
sudo service dnsmasq stop
sudo pkill wpa_supplicant
sudo ifconfig wlan0 down
sudo ifconfig wlan0 0.0.0.0 # this is how you clear the interface's configuration
sudo ifconfig wlan0 up
if [ -z "${PASSWORD}" ] ; then
sudo iwconfig wlan0 essid "${ESSID}"
else
# Necessary in stretch: https://www.raspberrypi.org/forums/viewtopic.php?t=196927
sudo cp /etc/wpa_supplicant/wpa_supplicant.conf "${WPA_PASS_FILE}"
sudo chmod 777 "${WPA_PASS_FILE}"
sudo wpa_passphrase "${ESSID}" "${PASSWORD}" >> "${WPA_PASS_FILE}"
sudo wpa_supplicant -B -i wlan0 -c "${WPA_PASS_FILE}"
fi
sudo systemctl daemon-reload
sudo service dhcpcd restart
fi
# give dhcp some time
timeout 30 sh -c 'until ifconfig wlan0 | grep "inet " ; do sleep 0.1 ; done'
TIMEOUT_RETURN=$?
if [ ${TIMEOUT_RETURN} -eq 124 ] && [ -z "${NO_AP}" ] ; then
logger -t posbox_connect_to_server_wifi "Failed to connect, forcing Posbox AP"
sudo /home/pi/odoo/addons/point_of_sale/tools/posbox/configuration/wireless_ap.sh "force" &
else
if [ ${TIMEOUT_RETURN} -ne 124 ] ; then
rm -f "${LOST_WIFI_FILE}"
fi
if [ ! -f "${LOST_WIFI_FILE}" ] ; then
logger -t posbox_connect_to_server_wifi "Restarting odoo"
fi
if [ ${WIFI_WAS_LOST} -eq 0 ] ; then
touch "${LOST_WIFI_FILE}"
fi
logger -t posbox_connect_to_server_wifi "Starting wifi keep alive script"
/home/pi/odoo/addons/point_of_sale/tools/posbox/configuration/keep_wifi_alive.sh &
fi
if [ "${IOT_NAME}" != "${HOSTNAME}" ]
then
sudo reboot
else
sudo service odoo restart
fi
}
connect "${1}" "${2}" "${3}" "${4}" "${5}" "${6}" "${7}" &