summaryrefslogtreecommitdiffstats
path: root/hacks
diff options
context:
space:
mode:
authorAhmed Abdelhalim <[email protected]>2026-04-20 14:43:52 +0200
committerAhmed Abdelhalim <[email protected]>2026-04-20 14:48:09 +0200
commit8ee10fb59163977fb95fa688fcd6ee2409b48f02 (patch)
treef1c285250060eb74a0315b53b9424e808289b19a /hacks
parent5c2f4c0d74bcc321f3c34526c427456d3b03e9b9 (diff)
Add mac ubuntu install tasks
Add the hack scripts to download and install wifi drivers on Mac For ubuntu ISO, unlike archlinux, it doesn't ship with the wl drivers required for wifi to work on ubuntu, this is a hack workaround to download the missing dependencies on an external USB and use it on the Live ISO to install the missing drivers, allowing for the rest of automation to take place. Assisted-by: Claude (Sonnet 4.6)
Diffstat (limited to 'hacks')
-rwxr-xr-xhacks/ubuntu/install-wl.sh57
-rwxr-xr-xhacks/ubuntu/mac-drivers.sh101
2 files changed, 158 insertions, 0 deletions
diff --git a/hacks/ubuntu/install-wl.sh b/hacks/ubuntu/install-wl.sh
new file mode 100755
index 0000000..04e1768
--- /dev/null
+++ b/hacks/ubuntu/install-wl.sh
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# Builds and loads the Broadcom BCM4360 wl driver on a Ubuntu live ISO.
+# Must be run with access to the debs downloaded by mac-drivers.sh.
+# gcc/make/binutils are extracted from the downloaded debs — not assumed pre-installed.
+#
+# Usage: bash install-wl.sh <path-to-debs-dir>
+
+usage() {
+ echo "Usage: $0 <debs-dir>"
+ echo " debs-dir: directory containing broadcom-sta-dkms and linux-headers debs"
+ exit 1
+}
+
+[[ $# -ne 1 ]] && usage
+
+DEBS_DIR="$1"
+KERNEL_VERSION="$(uname -r)"
+
+if [[ ! -d "$DEBS_DIR" ]]; then
+ echo "ERROR: $DEBS_DIR is not a directory" >&2
+ exit 1
+fi
+
+echo "Extracting packages to / (overlayfs — changes are in RAM, lost on reboot)..."
+for deb in "$DEBS_DIR"/*.deb; do
+ echo " $(basename "$deb")"
+ sudo dpkg -x "$deb" /
+done
+
+SRC_DIR=$(find /usr/src -maxdepth 1 -name "broadcom-sta-*" -type d 2>/dev/null | head -1)
+if [[ -z "$SRC_DIR" ]]; then
+ echo "ERROR: broadcom-sta source not found in /usr/src/ after extraction" >&2
+ exit 1
+fi
+
+if [[ ! -d "/lib/modules/$KERNEL_VERSION/build" ]]; then
+ echo "ERROR: /lib/modules/$KERNEL_VERSION/build not found" >&2
+ echo " Expected linux-headers-$KERNEL_VERSION to be extracted" >&2
+ exit 1
+fi
+
+echo "Building wl.ko for kernel $KERNEL_VERSION from $SRC_DIR..."
+sudo KBUILD_NOPEDANTIC=1 make \
+ -C "/lib/modules/$KERNEL_VERSION/build" \
+ M="$SRC_DIR" \
+ -j1
+
+echo "Unloading conflicting modules..."
+sudo rmmod wl 2>/dev/null || true
+sudo rmmod b43 ssb bcma brcmfmac brcmutil 2>/dev/null || true
+
+echo "Loading wl.ko..."
+sudo insmod "$SRC_DIR/wl.ko"
+sudo rfkill unblock all
+echo "Done."
diff --git a/hacks/ubuntu/mac-drivers.sh b/hacks/ubuntu/mac-drivers.sh
new file mode 100755
index 0000000..248e9c0
--- /dev/null
+++ b/hacks/ubuntu/mac-drivers.sh
@@ -0,0 +1,101 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+usage() {
+ echo "Usage: $0 <kernel-version>"
+ echo " kernel-version: output of 'uname -r' on target machine"
+ echo " Example: $0 6.11.0-17-generic"
+ exit 1
+}
+
+[[ $# -ne 1 ]] && usage
+
+KERNEL_VERSION="$1"
+OUTPUT_DIR="/tmp/bcmwl-drivers"
+BASE_URL="http://archive.ubuntu.com/ubuntu"
+DISTRO="noble"
+INDEX_DIR=$(mktemp -d)
+
+cleanup() { rm -rf "$INDEX_DIR"; }
+
+fetch_index() {
+ local pocket="$1" component="$2"
+ local dest="${INDEX_DIR}/${pocket}-${component}.txt"
+ echo "Fetching ${pocket}/${component} index..." >&2
+ curl -fsSL "${BASE_URL}/dists/${pocket}/${component}/binary-amd64/Packages.gz" \
+ | gzip -d > "$dest"
+ echo "$dest"
+}
+
+pkg_field() {
+ local index="$1" pkg_name="$2" field="$3"
+ awk '/^Package: '"$pkg_name"'$/{found=1} found && /^'"$field"':/{print; found=0; exit}' "$index"
+}
+
+pkg_filename() {
+ pkg_field "$1" "$2" "Filename" | awk '{print $2}'
+}
+
+download_pkg() {
+ local pkg_name="$1"
+ local filename=""
+ for index in "${INDEXES[@]}"; do
+ filename=$(pkg_filename "$index" "$pkg_name")
+ [[ -n "$filename" ]] && break
+ done
+ if [[ -z "$filename" ]]; then
+ echo "WARNING: $pkg_name not found in any index, skipping" >&2
+ return 0
+ fi
+ local deb
+ deb=$(basename "$filename")
+ if [[ -f "${OUTPUT_DIR}/${deb}" ]]; then
+ echo " (cached) $deb"
+ return 0
+ fi
+ echo "Downloading $deb..."
+ curl -fL -o "${OUTPUT_DIR}/${deb}" "${BASE_URL}/${filename}"
+}
+
+# Create out directory and configure trap signal
+mkdir -p "$OUTPUT_DIR"
+trap cleanup EXIT
+
+# Fetch indexes
+main_index=$(fetch_index "$DISTRO" "main")
+main_updates=$(fetch_index "${DISTRO}-updates" "main")
+restricted_updates=$(fetch_index "${DISTRO}-updates" "restricted")
+INDEXES=("$main_updates" "$main_index" "$restricted_updates")
+
+# Kernel headers
+download_pkg "linux-headers-${KERNEL_VERSION}"
+
+# Auto-discover base headers from Depends: field
+BASE_HEADERS_PKG=$(pkg_field "$main_updates" "linux-headers-${KERNEL_VERSION}" "Depends" \
+ | grep -o 'linux-hwe-[^ ,)]*' | head -1)
+if [[ -n "$BASE_HEADERS_PKG" ]]; then
+ echo "Base headers: $BASE_HEADERS_PKG"
+ download_pkg "$BASE_HEADERS_PKG"
+fi
+
+# Broadcom source
+download_pkg "broadcom-sta-dkms"
+
+# Build tools (not pre-installed on Ubuntu live ISO)
+echo "Downloading build tools..."
+for pkg in \
+ make \
+ gcc-13-base \
+ cpp-13-x86-64-linux-gnu cpp-13 cpp-x86-64-linux-gnu cpp \
+ gcc-13-x86-64-linux-gnu gcc-13 gcc-x86-64-linux-gnu gcc \
+ binutils-common libsframe1 libbinutils libctf-nobfd0 libctf0 \
+ libjansson4 libgprofng0 binutils-x86-64-linux-gnu binutils \
+ libcc1-0 libisl23 libmpfr6 libmpc3 libgcc-13-dev lto-disabled-list; do
+ download_pkg "$pkg"
+done
+
+# Copy install script alongside the debs
+cp "$(dirname "$0")/install-wl.sh" "$OUTPUT_DIR/"
+chmod +x "$OUTPUT_DIR/install-wl.sh"
+echo ""
+echo "Downloaded to $OUTPUT_DIR:"