2023-07-12 12:17:36 +02:00
#!/usr/bin/env bash
2023-08-11 17:19:18 +02:00
# SPDX-License-Identifier: GPL-3.0-or-later
2023-07-13 16:03:02 +02:00
# written by Tobias Powalowski <tpowa@archlinux.org>
2023-09-03 22:02:48 +02:00
. /usr/lib/archboot/common.sh
2024-03-20 16:48:05 +01:00
_TITLE = " archboot.com | ${ _RUNNING_ARCH } | ${ _RUNNING_KERNEL } | 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( ) {
2024-07-10 21:40:20 +02:00
#shellcheck disable=SC2016
2024-06-27 17:50:40 +02:00
fd -E '/lo' . '/sys/class/net' -x rg '(.*)' -r '{/} $1' { } /address | sort -u
2023-07-12 12:17:36 +02:00
}
2023-08-31 09:31:34 +02:00
_essid_scan( ) {
iwctl station " ${ _INTERFACE } " scan & >" ${ _NO_LOG } "
_COUNT = 0
while true; do
sleep 1
_COUNT = $(( _COUNT+1))
# abort after 5 seconds
2023-08-31 09:33:45 +02:00
_progress " $(( _COUNT*20)) " " Scanning $(( 5 - _COUNT)) second(s) for SSIDs with interface ${ _INTERFACE } ... "
2023-08-31 09:31:34 +02:00
[ [ " ${ _COUNT } " = = 5 ] ] && break
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-08-27 08:24:04 +02:00
# unblock all interfaces!
rfkill unblock all
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
2023-08-31 09:35:18 +02:00
_essid_scan | _dialog --title " Network Configuration " --no-mouse --gauge " Scanning 5 second(s) for SSIDs with interface ${ _INTERFACE } ... " 6 60
2024-06-27 16:16:31 +02:00
# only show lines with signal '*'
# kill spaces from the end and replace spaces with + between
2023-07-14 21:05:47 +02:00
#shellcheck disable=SC2086,SC2046
2024-06-30 20:42:32 +02:00
if _dialog --cancel-label " ${ _LABEL } " --title " SSID Scan Result " --menu "Empty spaces in your SSID are replaced by '+' char" 13 60 6 \
"RESCAN" "SSIDs" "HIDDEN" "SSID" $( iwctl station " ${ _INTERFACE } " get-networks | \
2024-06-27 16:11:57 +02:00
rg -o ' {6}(.{34}).*\*' -r '$1' | \
2024-07-06 19:43:56 +02:00
sd ' ' '+' | sd '\++$' ' _' ) 2>" ${ _ANSWER } " ; then
2023-07-14 21:05:47 +02:00
_WLAN_SSID = $( cat " ${ _ANSWER } " )
_CONTINUE = 1
2024-06-26 21:13:13 +02:00
if rg -q 'RESCAN' " ${ _ANSWER } " ; then
2024-07-11 13:27:28 +02:00
_dialog --title " Intel Wireless Daemon " --no-mouse --infobox "Restarting IWD Daemon..." 3 50
2024-07-11 13:22:28 +02:00
systemctl restart iwd
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
2024-06-30 20:42:32 +02:00
# replace # with spaces again
#shellcheck disable=SC2001,SC2086
_WLAN_SSID = " $( echo ${ _WLAN_SSID } | sd '\+' ' ' ) "
2023-07-14 21:05:47 +02:00
# expect hidden network has a WLAN_KEY
#shellcheck disable=SC2143
2024-06-26 21:26:59 +02:00
if ! [ [ " $( iwctl station " ${ _INTERFACE } " get-networks | rg -q " ${ _WLAN_SSID } .*open " ) " ] ] \
2023-07-14 21:05:47 +02:00
|| [ [ " ${ _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
2023-08-30 21:14:52 +02:00
_dialog --title " Network Configuration " --no-mouse --infobox " Connecting to ' ${ _WLAN_SSID } '\nwith interface ${ _INTERFACE } ... " 4 50
2023-07-14 21:05:47 +02:00
_printk off
if [ [ -z " ${ _WLAN_KEY } " ] ] ; then
2023-08-31 09:31:34 +02:00
echo "" | iwctl station " ${ _INTERFACE } " " ${ _WLAN_CONNECT } " " ${ _WLAN_SSID } " & >" ${ _NO_LOG } " && _WLAN_AUTH = 1
2023-07-14 21:05:47 +02:00
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
2023-09-20 20:08:59 +02:00
_dialog --title " Success " --no-mouse --infobox " Authentification to ' ${ _WLAN_SSID } ' was successful. " 3 70
2023-08-03 16:10:09 +02:00
sleep 2
2023-07-14 21:05:47 +02:00
return 0
else
2023-08-31 09:31:34 +02:00
_dialog --title " ERROR " --no-mouse --infobox " Authentification to ${ _WLAN_SSID } ' failed.\nPlease configure again! " 4 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
2024-06-26 21:13:13 +02:00
if echo " ${ _INTERFACE } " | rg -q 'wlan' ; then
2023-07-12 12:17:36 +02:00
_CONNECTION = "wireless"
else
_CONNECTION = "ethernet"
fi
# profile name
_NETWORK_PROFILE = ""
2024-06-19 15:10:11 +02:00
_dialog --no-cancel --title " Network Profile Name " --inputbox "" 7 40 " ${ _INTERFACE } - ${ _CONNECTION } " 2>" ${ _ANSWER } "
2023-07-14 19:37:40 +02:00
_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-08-03 16:10:09 +02:00
if _dialog --title " Network Configuration " --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-08-03 16:10:09 +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-08-31 18:44:56 +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." 13 65 "" 2>" ${ _ANSWER } "
2023-07-14 19:37:40 +02:00
_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
2024-08-14 23:40:55 +02:00
echo " # $_NETWORK_PROFILE generated by Archboot setup " > " ${ _NETWORK_PROFILE } "
2023-07-12 12:17:36 +02:00
#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
2023-07-26 22:07:09 +02:00
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))
2023-07-26 22:07:09 +02:00
# abort after 10 seconds
2023-08-04 16:15:43 +02:00
_progress " $(( _COUNT*10)) " " Waiting $(( 10 - _COUNT)) seconds for network link to come up... "
2023-07-26 22:07:09 +02:00
[ [ " ${ _COUNT } " = = 10 ] ] && break
2023-08-03 16:10:09 +02:00
done | _dialog --title " Network Configuration " --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
2023-07-28 17:06:26 +02:00
_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
}
2023-07-17 08:34:15 +02:00
_check
2023-07-14 19:37:40 +02:00
while true; do
_network && break
done
2023-07-17 08:34:15 +02:00
_cleanup