archboot/usr/bin/archboot-network.sh

227 lines
8.8 KiB
Bash
Raw Normal View History

2023-07-12 12:17:36 +02:00
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
2023-07-13 16:03:02 +02:00
# written by Tobias Powalowski <tpowa@archlinux.org>
. /usr/lib/archboot/basic-common.sh
2023-07-17 08:41:14 +02:00
_TITLE="Archboot ${_RUNNING_ARCH} | Basic Setup | Network Configuration"
2023-07-13 16:03:02 +02:00
2023-07-13 16:24:37 +02:00
_printk()
{
case ${1} in
"on") echo 4 >/proc/sys/kernel/printk ;;
"off") echo 0 >/proc/sys/kernel/printk ;;
esac
}
2023-07-20 07:22:53 +02:00
_online_switch() {
2023-07-20 07:39:32 +02:00
if _dialog --title " Offline Mode " --defaultno --yesno "Do you want to switch to Online Mode?" 5 45; then
2023-07-20 07:22:53 +02:00
rm /var/cache/pacman/pkg/archboot.db
2023-07-20 07:38:28 +02:00
else
2023-07-21 15:50:38 +02:00
_cleanup
2023-07-20 07:22:53 +02:00
fi
}
2023-07-12 12:17:36 +02:00
_net_interfaces() {
find /sys/class/net/* -type l ! -name 'lo' -printf '%f ' -exec cat {}/address \;
}
2023-07-14 12:23:15 +02:00
_essid_list() {
2023-07-12 12:17:36 +02:00
# only show lines with signal '*'
# kill spaces from the end and replace spaces with + between
# '+' character is one of 6 forbidden characters in SSID standard
2023-07-14 21:28:23 +02:00
for dev in $(iwctl station "${_INTERFACE}" get-networks | grep '\*' | cut -c 1-41 | sed -e 's|\ *.$||g' -e 's|^.*\ \ ||g' -e 's| |\+|g'); do
2023-07-12 12:17:36 +02:00
echo "${dev}"
[[ "${1}" ]] && echo "${1}"
done
}
2023-07-14 21:05:47 +02:00
_wireless() {
2023-07-12 12:17:36 +02:00
_WLAN_HIDDEN=""
_WLAN_SSID=""
_WLAN_KEY=""
_WLAN_AUTH=""
2023-07-14 21:05:47 +02:00
# disconnect the interface first!
iwctl station "${_INTERFACE}" disconnect &>"${_NO_LOG}"
# clean old keys first!
rm -f /var/lib/iwd/* &>"${_NO_LOG}"
_CONTINUE=""
while [[ -z "${_CONTINUE}" ]]; do
# scan the area
_dialog --no-mouse --infobox "Scanning for SSIDs with interface ${_INTERFACE}..." 3 50
2023-07-14 21:29:28 +02:00
iwctl station "${_INTERFACE}" scan &>"${_NO_LOG}"
2023-07-14 21:05:47 +02:00
sleep 5
#shellcheck disable=SC2086,SC2046
2023-07-17 08:51:36 +02:00
if _dialog --cancel-label "${_LABEL}" --title " SSID Scan Result " --menu "Empty spaces in your SSID are replaced by '+' char" 13 60 6 \
2023-07-14 21:05:47 +02:00
$(_essid_list _) \
"HIDDEN" "SSID" "RESCAN" "SSIDs" 2>"${_ANSWER}"; then
_WLAN_SSID=$(cat "${_ANSWER}")
_CONTINUE=1
if grep -q 'RESCAN' "${_ANSWER}"; then
2023-07-13 16:03:02 +02:00
_CONTINUE=""
2023-07-12 12:17:36 +02:00
fi
2023-07-14 21:05:47 +02:00
else
_abort
fi
done
_WLAN_CONNECT="connect"
if [[ "${_WLAN_SSID}" == "HIDDEN" ]]; then
_dialog --no-cancel --title " HIDDEN SSID " --inputbox "" 7 65 "secret" 2>"${_ANSWER}"
_WLAN_SSID=$(cat "${_ANSWER}")
_WLAN_CONNECT="connect-hidden"
_WLAN_HIDDEN=1
fi
# replace # with spaces again
#shellcheck disable=SC2001,SC2086
_WLAN_SSID="$(echo ${_WLAN_SSID} | sed -e 's|\+|\ |g')"
# expect hidden network has a WLAN_KEY
#shellcheck disable=SC2143
if ! [[ "$(iwctl station "${_INTERFACE}" get-networks | grep -w "${_WLAN_SSID}" | cut -c 42-49 | grep -q 'open')" ]] \
|| [[ "${_WLAN_CONNECT}" == "connect-hidden" ]]; then
_dialog --no-cancel --title " Connection Key " --inputbox "" 7 50 "Secret-WirelessKey" 2>"${_ANSWER}"
_WLAN_KEY=$(cat "${_ANSWER}")
fi
# time to connect
_dialog --no-mouse --infobox "Connecting to SSID='${_WLAN_SSID}' with interface ${_INTERFACE}..." 3 70
2023-07-14 21:05:47 +02:00
_printk off
if [[ -z "${_WLAN_KEY}" ]]; then
iwctl station "${_INTERFACE}" "${_WLAN_CONNECT}" "${_WLAN_SSID}" &>"${_NO_LOG}" && _WLAN_AUTH=1
else
iwctl --passphrase="${_WLAN_KEY}" station "${_INTERFACE}" "${_WLAN_CONNECT}" "${_WLAN_SSID}" &>"${_NO_LOG}" && _WLAN_AUTH=1
fi
sleep 3
_printk on
if [[ -n "${_WLAN_AUTH}" ]]; then
_dialog --no-mouse --infobox "Authentification to SSID='${_WLAN_SSID}' was successful." 3 70
2023-07-14 21:05:47 +02:00
sleep 3
return 0
else
_dialog --title " ERROR " --no-mouse --infobox "Authentification to SSID='${_WLAN_SSID}' failed. Please configure again!" 3 70
2023-07-14 21:05:47 +02:00
sleep 5
return 1
2023-07-12 12:17:36 +02:00
fi
}
2023-07-14 19:37:40 +02:00
_network() {
2023-07-20 07:22:53 +02:00
if [[ -e "/var/cache/pacman/pkg/archboot.db" ]]; then
2023-07-21 15:50:38 +02:00
_online_switch
2023-07-20 07:22:53 +02:00
fi
2023-07-12 12:17:36 +02:00
_NETPARAMETERS=""
while [[ -z "${_NETPARAMETERS}" ]]; do
# select network interface
_INTERFACE=""
_INTERFACES=$(_net_interfaces)
while [[ -z "${_INTERFACE}" ]]; do
#shellcheck disable=SC2086
2023-07-17 08:51:36 +02:00
if _dialog --cancel-label "${_LABEL}" --title " Network Interface " --menu "" 11 40 5 ${_INTERFACES} 2>"${_ANSWER}"; then
2023-07-13 16:09:20 +02:00
_INTERFACE=$(cat "${_ANSWER}")
else
_abort
fi
2023-07-12 12:17:36 +02:00
done
2023-07-18 09:21:40 +02:00
echo "${_INTERFACE}" >/.network-interface
2023-07-12 12:17:36 +02:00
# iwd renames wireless devices to wlanX
if echo "${_INTERFACE}" | grep -q wlan; then
_CONNECTION="wireless"
else
_CONNECTION="ethernet"
fi
# profile name
_NETWORK_PROFILE=""
2023-07-14 19:37:40 +02:00
_dialog --no-cancel --title " Network Profile Name " --inputbox "" 6 40 "${_INTERFACE}-${_CONNECTION}" 2>"${_ANSWER}"
_NETWORK_PROFILE=/etc/systemd/network/$(cat "${_ANSWER}").network
2023-07-12 12:17:36 +02:00
# wifi setup first
2023-07-13 16:03:02 +02:00
_CONTINUE=""
2023-07-14 20:52:14 +02:00
while [[ -z "${_CONTINUE}" && "${_CONNECTION}" == "wireless" ]]; do
2023-07-14 21:05:47 +02:00
if _wireless; then
2023-07-13 16:03:02 +02:00
_CONTINUE=1
else
2023-07-14 20:52:14 +02:00
_CONTINUE=""
2023-07-13 16:03:02 +02:00
fi
2023-07-13 16:09:20 +02:00
done
2023-07-12 12:17:36 +02:00
# dhcp switch
_IP=""
2023-07-13 16:03:02 +02:00
if _dialog --yesno "Do you want to use DHCP?" 5 40; then
2023-07-12 12:17:36 +02:00
_IP="dhcp"
_IPADDR=""
_GW=""
_DNS=""
else
_IP="static"
2023-07-14 20:15:36 +02:00
_dialog --no-cancel --title " IP Address And Netmask " --inputbox "" 7 40 "192.168.1.23/24" 2>"${_ANSWER}"
2023-07-14 19:37:40 +02:00
_IPADDR=$(cat "${_ANSWER}")
_dialog --no-cancel --title " Gateway " --inputbox "" 7 40 "192.168.1.1" 2>"${_ANSWER}"
_GW=$(cat "${_ANSWER}")
_dialog --no-cancel --title " Domain Name Server " --inputbox "" 7 40 "192.168.1.1" 2>"${_ANSWER}"
_DNS=$(cat "${_ANSWER}")
2023-07-12 12:17:36 +02:00
fi
2023-07-13 16:03:02 +02:00
# http/ftp proxy settings
2023-07-14 19:37:40 +02:00
_dialog --no-cancel --title " Proxy Server " --inputbox "\nhttp://name:port\nhttp://ip:port\nhttp://username:password@ip:port\n\n Leave the field empty if no proxy is needed to install." 12 65 "" 2>"${_ANSWER}"
_PROXY=$(cat "${_ANSWER}")
2023-07-12 12:17:36 +02:00
_PROXIES="http_proxy https_proxy ftp_proxy rsync_proxy HTTP_PROXY HTTPS_PROXY FTP_PROXY RSYNC_PROXY"
2023-07-15 08:00:29 +02:00
_dialog --title " Summary " --yesno "Interface: ${_INTERFACE}\nConnection: ${_CONNECTION}\nNetwork profile: ${_NETWORK_PROFILE}\nSSID: ${_WLAN_SSID}\nHidden: ${_WLAN_HIDDEN}\nKey: ${_WLAN_KEY}\ndhcp or static: ${_IP}\nIP address: ${_IPADDR}\nGateway: ${_GW}\nDNS server: ${_DNS}\nProxy setting: ${_PROXY}" 0 0 && _NETPARAMETERS=1
2023-07-12 12:17:36 +02:00
done
# write systemd-networkd profile
echo "#$_NETWORK_PROFILE generated by archboot setup" > "${_NETWORK_PROFILE}"
#shellcheck disable=SC2129
echo "[Match]" >> "${_NETWORK_PROFILE}"
echo "Name=${_INTERFACE}" >> "${_NETWORK_PROFILE}"
echo "" >> "${_NETWORK_PROFILE}"
echo "[Network]" >> "${_NETWORK_PROFILE}"
2023-07-27 18:51:23 +02:00
echo "MulticastDNS=yes" >> "${_NETWORK_PROFILE}"
2023-07-12 12:17:36 +02:00
[[ "${_IP}" == "dhcp" ]] && echo "DHCP=yes" >> "${_NETWORK_PROFILE}"
if [[ "${_CONNECTION}" == "wireless" ]]; then
#shellcheck disable=SC2129
echo "IgnoreCarrierLoss=3s" >>"${_NETWORK_PROFILE}"
fi
if [[ "${_IP}" == "static" ]]; then
#shellcheck disable=SC2129
echo "Address=${_IPADDR}" >>"${_NETWORK_PROFILE}"
echo "Gateway=${_GW}" >>"${_NETWORK_PROFILE}"
echo "DNS=${_DNS}" >>"${_NETWORK_PROFILE}"
fi
# set proxies
if [[ -z "${_PROXY}" ]]; then
for i in ${_PROXIES}; do
unset "${i}"
done
else
for i in ${_PROXIES}; do
export "${i}"="${_PROXY}"
2023-07-17 21:33:52 +02:00
echo "export ${i}=${_PROXY}" >> /etc/profile.d/proxy.sh
chmod a+x "${_DESTDIR}"/etc/profile.d/proxy.sh
2023-07-12 12:17:36 +02:00
done
fi
if [[ -e /etc/systemd/network/10-wired-auto-dhcp.network ]]; then
echo "Disabled Archboot's bootup wired auto dhcp browsing." >"${_LOG}"
rm /etc/systemd/network/10-wired-auto-dhcp.network
fi
echo "Using setup's network profile ${_NETWORK_PROFILE} now..." >"${_LOG}"
systemctl restart systemd-networkd
2023-07-27 18:45:03 +02:00
systemctl restart systemd-resolved
# add sleep here for systemd-resolve get correct values
2023-07-26 21:56:52 +02:00
_COUNT=0
while true; do
sleep 1
2023-07-26 21:56:52 +02:00
if getent hosts www.google.com &>"${_LOG}"; then
2023-08-01 19:27:34 +02:00
_progress "100" "Network configuration completed successfully."
2023-07-26 21:56:52 +02:00
sleep 2
2023-07-26 22:01:26 +02:00
return 0
2023-07-26 21:56:52 +02:00
fi
_COUNT=$((_COUNT+1))
# abort after 10 seconds
2023-08-01 19:27:34 +02:00
_progress "$((${_COUNT}*10))" "Waiting $((10-${_COUNT})) seconds for network link to come up..."
[[ "${_COUNT}" == 10 ]] && break
2023-08-01 19:27:34 +02:00
done | _dialog --no-mouse --gauge "Waiting 10 seconds for network link to come up..." 6 60 0
2023-07-12 12:17:36 +02:00
if ! getent hosts www.google.com &>"${_LOG}"; then
_dialog --title " ERROR " --no-mouse --infobox "Your network is not working correctly, please configure again!" 3 60
2023-07-26 21:56:52 +02:00
sleep 3
2023-07-14 19:37:40 +02:00
return 1
2023-07-12 12:17:36 +02:00
fi
}
_check
2023-07-14 19:37:40 +02:00
while true; do
_network && break
done
_cleanup
2023-07-12 12:17:36 +02:00
# vim: set ft=sh ts=4 sw=4 et: