Add Joplin, old Mac, and Fedora WiFi runbooks; simplify JA3 Whisky scripts and hotspot recovery.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
41
docs/old_mac/scripts/bootstrap-ssh-fedora.sh
Executable file
41
docs/old_mac/scripts/bootstrap-ssh-fedora.sh
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
# Mac: один раз скопировать SSH-ключ на Fedora (пароль из ~/.config/old_mac/fedora.env).
|
||||
# bash docs/old_mac/scripts/bootstrap-ssh-fedora.sh
|
||||
set -euo pipefail
|
||||
|
||||
ENV="${OLD_MAC_FEDORA_ENV:-$HOME/.config/old_mac/fedora.env}"
|
||||
KEY="$HOME/.ssh/id_ed25519_fedora"
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
[ -f "$ENV" ] || die "нет $ENV — создайте с FEDORA_USER и FEDORA_PASSWORD"
|
||||
# shellcheck disable=SC1090
|
||||
source "$ENV"
|
||||
|
||||
[ -f "$KEY" ] || die "нет ключа — bash docs/old_mac/scripts/setup-remote-mac.sh $FEDORA_USER"
|
||||
command -v sshpass >/dev/null 2>&1 || die "brew install hudochenkov/sshpass/sshpass"
|
||||
|
||||
bash "$(dirname "$0")/setup-remote-mac.sh" "$FEDORA_USER" >/dev/null
|
||||
|
||||
copy_to() {
|
||||
local target="$1"
|
||||
local label="$2"
|
||||
printf 'Пробую %s (%s)…\n' "$label" "$target"
|
||||
if sshpass -p "$FEDORA_PASSWORD" ssh-copy-id -i "$KEY" -o ConnectTimeout=5 \
|
||||
-o StrictHostKeyChecking=accept-new \
|
||||
"${FEDORA_USER}@${target}" 2>/dev/null; then
|
||||
printf '[ok] ключ установлен через %s\n' "$label"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
printf '=== bootstrap SSH key → Fedora ===\n\n'
|
||||
|
||||
copy_to "$FEDORA_BT_IP" "BT PAN" || \
|
||||
copy_to "$FEDORA_IP" "hotspot IP" || \
|
||||
copy_to "$FEDORA_HOST" "mDNS" || \
|
||||
die "не удалось подключиться — см. REMOTE_ACCESS.md (BT PAN или отключить AP isolation)"
|
||||
|
||||
printf '\nПроверка:\n'
|
||||
bash "$(dirname "$0")/connect-fedora.sh" -- 'echo ok && hostname'
|
||||
67
docs/old_mac/scripts/build-delivery-archive.sh
Executable file
67
docs/old_mac/scripts/build-delivery-archive.sh
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env bash
|
||||
# Собрать архив для передачи на Fedora MacBook.
|
||||
# bash docs/old_mac/scripts/build-delivery-archive.sh
|
||||
set -euo pipefail
|
||||
|
||||
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
STAGE="${TMPDIR:-/tmp}/fedora-bcm4322-wifi-fix-$$"
|
||||
ARCHIVE="$OLD_MAC/deliverable/fedora-bcm4322-wifi-fix.tar.gz"
|
||||
PKG="fedora-bcm4322-wifi-fix"
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
[ -f "$OLD_MAC/bundle/bcm4322-offline-bundle/b43/ucode16_mimo.fw" ] \
|
||||
|| die "нет firmware — сначала: bash $OLD_MAC/scripts/download-bcm4322-offline-bundle.sh"
|
||||
|
||||
cleanup() { rm -rf "$STAGE"; }
|
||||
trap cleanup EXIT
|
||||
|
||||
rm -rf "$STAGE"
|
||||
mkdir -p "$STAGE/$PKG/bundle"
|
||||
cp -a "$OLD_MAC/bundle/bcm4322-offline-bundle" "$STAGE/$PKG/bundle/"
|
||||
cp "$OLD_MAC/scripts/install-bcm4322-firmware-fedora.sh" "$STAGE/$PKG/"
|
||||
cp "$OLD_MAC/scripts/prepare-receive-fedora.sh" "$STAGE/$PKG/"
|
||||
cp "$OLD_MAC/RUNBOOK.md" "$STAGE/$PKG/"
|
||||
|
||||
cat >"$STAGE/$PKG/INSTALL.txt" <<'EOF'
|
||||
Fedora 43 — BCM4322 Wi-Fi fix (offline)
|
||||
========================================
|
||||
|
||||
1. Распаковать:
|
||||
tar xzf fedora-bcm4322-wifi-fix.tar.gz
|
||||
cd fedora-bcm4322-wifi-fix
|
||||
|
||||
2. Установить firmware (root):
|
||||
sudo bash install-bcm4322-firmware-fedora.sh
|
||||
|
||||
3. Перезагрузить:
|
||||
sudo reboot
|
||||
|
||||
4. Подключиться к Wi-Fi:
|
||||
nmcli device wifi list
|
||||
nmcli device wifi connect "SSID" password "пароль"
|
||||
|
||||
5. Проверка:
|
||||
ls -la /lib/firmware/b43/ucode16_mimo.fw
|
||||
sudo dmesg | grep -i b43
|
||||
nmcli device
|
||||
|
||||
Подробности: RUNBOOK.md в этом архиве.
|
||||
EOF
|
||||
|
||||
mkdir -p "$OLD_MAC/deliverable"
|
||||
tar czf "$ARCHIVE" -C "$STAGE" "$PKG"
|
||||
SHA="$(shasum -a 256 "$ARCHIVE" | awk '{print $1}')"
|
||||
SIZE="$(stat -f%z "$ARCHIVE" 2>/dev/null || stat -c%s "$ARCHIVE")"
|
||||
|
||||
cat >"$OLD_MAC/deliverable/MANIFEST.txt" <<EOF
|
||||
Package: fedora-bcm4322-wifi-fix.tar.gz
|
||||
Built: $(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
Size: ${SIZE} bytes
|
||||
SHA256: ${SHA}
|
||||
Target: Fedora 43, MacBook Pro Intel, BCM4322 / b43
|
||||
EOF
|
||||
|
||||
printf 'Архив: %s\n' "$ARCHIVE"
|
||||
printf 'Размер: %s bytes\n' "$SIZE"
|
||||
printf 'SHA256: %s\n' "$SHA"
|
||||
54
docs/old_mac/scripts/build-remote-access-archive.sh
Executable file
54
docs/old_mac/scripts/build-remote-access-archive.sh
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
# Собрать архив удалённого доступа для Fedora.
|
||||
set -euo pipefail
|
||||
|
||||
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
STAGE="${TMPDIR:-/tmp}/fedora-remote-access-$$"
|
||||
ARCHIVE="$OLD_MAC/deliverable/fedora-remote-access.tar.gz"
|
||||
PKG="fedora-remote-access"
|
||||
|
||||
# Убедиться что есть pubkey
|
||||
bash "$OLD_MAC/scripts/setup-remote-mac.sh" >/dev/null 2>&1 || true
|
||||
|
||||
cleanup() { rm -rf "$STAGE"; }
|
||||
trap cleanup EXIT
|
||||
|
||||
rm -rf "$STAGE"
|
||||
mkdir -p "$STAGE/$PKG"
|
||||
|
||||
cp "$OLD_MAC/scripts/setup-ssh-fedora.sh" "$STAGE/$PKG/"
|
||||
cp "$OLD_MAC/scripts/setup-bt-pan-fedora.sh" "$STAGE/$PKG/"
|
||||
cp "$OLD_MAC/REMOTE_ACCESS.md" "$STAGE/$PKG/"
|
||||
[ -f "$OLD_MAC/deliverable/mac_pubkey.txt" ] && \
|
||||
cp "$OLD_MAC/deliverable/mac_pubkey.txt" "$STAGE/$PKG/"
|
||||
|
||||
cat >"$STAGE/$PKG/INSTALL.txt" <<'EOF'
|
||||
Fedora — удалённый SSH с Mac (хотспот / BT PAN)
|
||||
================================================
|
||||
|
||||
1. Распаковать:
|
||||
tar xzf fedora-remote-access.tar.gz
|
||||
cd fedora-remote-access
|
||||
|
||||
2. SSH (один раз, root):
|
||||
sudo bash setup-ssh-fedora.sh ВАШ_ЛОГИН
|
||||
|
||||
3a. Если Mac видит fedora.local и ping OK:
|
||||
На Mac: bash connect-fedora.sh
|
||||
|
||||
3b. Если ping FAIL (изоляция хотспота):
|
||||
sudo bash setup-bt-pan-fedora.sh
|
||||
Mac: Bluetooth → fedora → Connect (Network)
|
||||
Mac: bash setup-bt-pan-mac.sh
|
||||
Mac: bash connect-fedora.sh
|
||||
|
||||
Подробно: REMOTE_ACCESS.md
|
||||
EOF
|
||||
|
||||
mkdir -p "$OLD_MAC/deliverable"
|
||||
tar czf "$ARCHIVE" -C "$STAGE" "$PKG"
|
||||
SHA="$(shasum -a 256 "$ARCHIVE" | awk '{print $1}')"
|
||||
|
||||
printf 'Архив: %s\n' "$ARCHIVE"
|
||||
printf 'SHA256: %s\n' "$SHA"
|
||||
printf 'Отправка: bash %s/send-to-fedora-bluetooth.sh %s\n' "$OLD_MAC/scripts" "$ARCHIVE"
|
||||
44
docs/old_mac/scripts/connect-fedora.sh
Executable file
44
docs/old_mac/scripts/connect-fedora.sh
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
# Mac: подключиться к Fedora по SSH (LAN или BT PAN).
|
||||
# bash docs/old_mac/scripts/connect-fedora.sh [ssh args...]
|
||||
set -euo pipefail
|
||||
|
||||
ENV="${OLD_MAC_FEDORA_ENV:-$HOME/.config/old_mac/fedora.env}"
|
||||
KEY="$HOME/.ssh/id_ed25519_fedora"
|
||||
EXTRA_ARGS=("$@")
|
||||
|
||||
if [ -f "$ENV" ]; then
|
||||
# shellcheck disable=SC1090
|
||||
source "$ENV"
|
||||
fi
|
||||
FEDORA_USER="${FEDORA_USER:-p}"
|
||||
|
||||
try_host() {
|
||||
local host="$1"
|
||||
local label="$2"
|
||||
if ssh -i "$KEY" -o ConnectTimeout=3 -o BatchMode=yes \
|
||||
-o StrictHostKeyChecking=accept-new \
|
||||
"$host" "echo ok" >/dev/null 2>&1; then
|
||||
printf '[ok] SSH через %s (%s)\n' "$label" "$host"
|
||||
exec ssh -i "$KEY" -o StrictHostKeyChecking=accept-new "$host" "${EXTRA_ARGS[@]}"
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
[ -f "$KEY" ] || {
|
||||
printf 'Нет ключа %s — сначала: bash docs/old_mac/scripts/setup-remote-mac.sh\n' "$KEY"
|
||||
exit 1
|
||||
}
|
||||
|
||||
printf 'Пробую подключение к Fedora (user %s)…\n' "$FEDORA_USER"
|
||||
|
||||
try_host "fedora-mbp" "ssh config / mDNS" || \
|
||||
try_host "fedora-mbp-bt" "BT PAN" || \
|
||||
try_host "${FEDORA_USER}@${FEDORA_HOST:-fedora.local}" "mDNS" || \
|
||||
try_host "${FEDORA_USER}@${FEDORA_IP:-10.23.120.30}" "hotspot IP" || \
|
||||
try_host "${FEDORA_USER}@${FEDORA_BT_IP:-172.20.99.1}" "BT Fedora IP" || {
|
||||
printf '\nSSH недоступен (ключ не принят или нет сети).\n'
|
||||
printf ' Парольный bootstrap: bash docs/old_mac/scripts/bootstrap-ssh-fedora.sh\n'
|
||||
printf ' Диагностика: bash docs/old_mac/scripts/discover-fedora.sh\n'
|
||||
exit 1
|
||||
}
|
||||
59
docs/old_mac/scripts/connect-rdp-fedora.sh
Executable file
59
docs/old_mac/scripts/connect-rdp-fedora.sh
Executable file
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
# Mac: RDP к Fedora (xrdp, порт 3389).
|
||||
# bash docs/old_mac/scripts/connect-rdp-fedora.sh
|
||||
set -euo pipefail
|
||||
|
||||
ENV="${OLD_MAC_FEDORA_ENV:-$HOME/.config/old_mac/fedora.env}"
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
if [ -f "$ENV" ]; then
|
||||
# shellcheck disable=SC1090
|
||||
source "$ENV"
|
||||
fi
|
||||
|
||||
FEDORA_USER="${FEDORA_USER:-p}"
|
||||
FEDORA_RDP_PORT="${FEDORA_RDP_PORT:-3389}"
|
||||
|
||||
# Порядок хостов: BT PAN → mDNS → hotspot IP
|
||||
HOSTS=(
|
||||
"${FEDORA_BT_IP:-172.20.99.1}"
|
||||
"${FEDORA_HOST:-fedora.local}"
|
||||
"${FEDORA_IP:-10.23.120.30}"
|
||||
)
|
||||
|
||||
reachable() {
|
||||
nc -z -G 2 -w 2 "$1" "$FEDORA_RDP_PORT" 2>/dev/null
|
||||
}
|
||||
|
||||
TARGET=""
|
||||
for h in "${HOSTS[@]}"; do
|
||||
if reachable "$h"; then
|
||||
TARGET="$h"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$TARGET" ]; then
|
||||
printf 'RDP %s недоступен на:\n' "$FEDORA_RDP_PORT"
|
||||
for h in "${HOSTS[@]}"; do printf ' %s:%s\n' "$h" "$FEDORA_RDP_PORT"; done
|
||||
printf '\nПричина: изоляция хотспота или нет BT PAN.\n'
|
||||
printf ' bash %s/discover-fedora.sh\n' "$SCRIPT_DIR"
|
||||
printf ' docs/old_mac/REMOTE_ACCESS.md\n'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf 'RDP → %s:%s (user %s)\n' "$TARGET" "$FEDORA_RDP_PORT" "$FEDORA_USER"
|
||||
|
||||
if command -v xfreerdp >/dev/null 2>&1; then
|
||||
exec xfreerdp "/v:${TARGET}:${FEDORA_RDP_PORT}" "/u:${FEDORA_USER}" +clipboard /dynamic-resolution
|
||||
fi
|
||||
|
||||
if [ -d "/Applications/Microsoft Remote Desktop.app" ]; then
|
||||
exec open -a "Microsoft Remote Desktop"
|
||||
fi
|
||||
|
||||
printf 'Установите клиент:\n'
|
||||
printf ' brew install freerdp\n'
|
||||
printf ' или Microsoft Remote Desktop из App Store\n'
|
||||
printf '\nВручную: %s:%s user %s\n' "$TARGET" "$FEDORA_RDP_PORT" "$FEDORA_USER"
|
||||
exit 1
|
||||
68
docs/old_mac/scripts/discover-fedora.sh
Executable file
68
docs/old_mac/scripts/discover-fedora.sh
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env bash
|
||||
# Mac: найти Fedora в сети хотспота.
|
||||
# bash docs/old_mac/scripts/discover-fedora.sh
|
||||
set -euo pipefail
|
||||
|
||||
SUBNET=""
|
||||
IFACE="en0"
|
||||
|
||||
wifi_ip() {
|
||||
ifconfig "$IFACE" 2>/dev/null | awk '/inet / {print $2; exit}'
|
||||
}
|
||||
|
||||
IP="$(wifi_ip || true)"
|
||||
[ -n "$IP" ] || { printf 'Wi-Fi IP не найден на %s\n' "$IFACE"; exit 1; }
|
||||
|
||||
SUBNET="$(printf '%s\n' "$IP" | awk -F. '{print $1"."$2"."$3}')"
|
||||
printf 'Mac Wi-Fi: %s (подсеть %s.0/24)\n\n' "$IP" "$SUBNET"
|
||||
|
||||
# mDNS
|
||||
printf '%s\n' '--- mDNS ---'
|
||||
for name in fedora.local fedora; do
|
||||
FIP=""
|
||||
if command -v dscacheutil >/dev/null 2>&1; then
|
||||
FIP="$(dscacheutil -q host -a name "$name" 2>/dev/null | awk '/ip_address:/ {print $2; exit}')"
|
||||
fi
|
||||
[ -n "$FIP" ] || FIP="$(ping -c 1 -t 1 "$name" 2>/dev/null | sed -n 's/.*(\([0-9.]*\)).*/\1/p' | head -1)"
|
||||
if [ -n "$FIP" ]; then
|
||||
printf '%s → %s\n' "$name" "$FIP"
|
||||
if ping -c 1 -W 1000 "$FIP" >/dev/null 2>&1; then
|
||||
printf ' ping: ok\n'
|
||||
else
|
||||
printf ' ping: FAIL (вероятна изоляция клиентов хотспота)\n'
|
||||
fi
|
||||
if nc -z -w 2 "$FIP" 22 2>/dev/null; then
|
||||
printf ' ssh:22: open\n'
|
||||
else
|
||||
printf ' ssh:22: closed/unreachable\n'
|
||||
fi
|
||||
if nc -z -w 2 "$FIP" 3389 2>/dev/null; then
|
||||
printf ' rdp:3389: open\n'
|
||||
else
|
||||
printf ' rdp:3389: closed/unreachable\n'
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
printf '%s\n' '--- ARP ---'
|
||||
arp -a 2>/dev/null | grep "$SUBNET" | grep -v 'incomplete' || true
|
||||
|
||||
printf '%s\n' '--- Быстрый sweep (ssh:22) ---'
|
||||
FOUND=0
|
||||
for i in $(seq 1 254); do
|
||||
T="$SUBNET.$i"
|
||||
[ "$T" = "$IP" ] && continue
|
||||
nc -z -G 1 -w 1 "$T" 22 2>/dev/null && printf 'ssh open: %s\n' "$T" && FOUND=1
|
||||
done
|
||||
[ "$FOUND" -eq 0 ] && printf '(ни одного ssh:22 не найдено)\n'
|
||||
|
||||
printf '%s\n' '--- BT PAN fallback ---'
|
||||
printf 'Проверка 172.20.99.1 (Fedora BT PAN)…\n'
|
||||
if ping -c 1 -W 1000 172.20.99.1 >/dev/null 2>&1; then
|
||||
printf ' ping 172.20.99.1: ok\n'
|
||||
else
|
||||
printf ' ping 172.20.99.1: нет (запустите setup-bt-pan-fedora.sh на Fedora)\n'
|
||||
fi
|
||||
|
||||
printf '\nПодсказка: если ping FAIL но mDNS есть — отключите AP isolation на телефоне\n'
|
||||
printf 'или используйте Bluetooth PAN: REMOTE_ACCESS.md §4\n'
|
||||
54
docs/old_mac/scripts/download-bcm4322-offline-bundle.sh
Executable file
54
docs/old_mac/scripts/download-bcm4322-offline-bundle.sh
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
# Скачать и собрать firmware b43 для BCM4322 (запуск на Mac с интернетом).
|
||||
# bash docs/old_mac/scripts/download-bcm4322-offline-bundle.sh
|
||||
set -euo pipefail
|
||||
|
||||
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
BUNDLE_DIR="$OLD_MAC/bundle/bcm4322-offline-bundle"
|
||||
WORK="${TMPDIR:-/tmp}/bcm4322-build-$$"
|
||||
WL_VERSION="6.30.163.46"
|
||||
WL_TARBALL="broadcom-wl-${WL_VERSION}.tar.bz2"
|
||||
WL_OBJECT="broadcom-wl-${WL_VERSION}.wl_apsta.o"
|
||||
WL_URL="https://web.archive.org/web/2023/https://www.lwfinger.com/b43-firmware/${WL_TARBALL}"
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
command -v b43-fwcutter >/dev/null 2>&1 || die "brew install b43-fwcutter"
|
||||
command -v curl >/dev/null 2>&1 || die "curl не найден"
|
||||
|
||||
cleanup() { rm -rf "$WORK"; }
|
||||
trap cleanup EXIT
|
||||
|
||||
mkdir -p "$WORK" "$BUNDLE_DIR"
|
||||
cd "$WORK"
|
||||
|
||||
if [ ! -s "$WL_TARBALL" ]; then
|
||||
printf 'Скачиваю %s …\n' "$WL_URL"
|
||||
curl -fsSL --max-time 180 -o "$WL_TARBALL" "$WL_URL"
|
||||
fi
|
||||
file "$WL_TARBALL" | grep -qi bzip2 || die "скачанный файл не bzip2"
|
||||
|
||||
tar xjf "$WL_TARBALL"
|
||||
[ -f "$WL_OBJECT" ] || die "нет $WL_OBJECT в архиве"
|
||||
|
||||
rm -rf "$WORK/fw-out"
|
||||
mkdir -p "$WORK/fw-out"
|
||||
b43-fwcutter -w "$WORK/fw-out" "$WL_OBJECT"
|
||||
[ -f "$WORK/fw-out/b43/ucode16_mimo.fw" ] || die "нет ucode16_mimo.fw"
|
||||
|
||||
rm -rf "$BUNDLE_DIR/b43"
|
||||
cp -a "$WORK/fw-out/b43" "$BUNDLE_DIR/"
|
||||
|
||||
COUNT="$(find "$BUNDLE_DIR/b43" -type f | wc -l | tr -d ' ')"
|
||||
SHA_UC="$(shasum -a 256 "$BUNDLE_DIR/b43/ucode16_mimo.fw" | awk '{print $1}')"
|
||||
|
||||
cat >"$BUNDLE_DIR/MANIFEST.txt" <<EOF
|
||||
BCM4322 b43 firmware offline bundle
|
||||
Built: $(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
Source: broadcom-wl-${WL_VERSION} via b43-fwcutter
|
||||
Files: ${COUNT}
|
||||
SHA256 b43/ucode16_mimo.fw: ${SHA_UC}
|
||||
EOF
|
||||
|
||||
printf 'Firmware: %s файлов\n' "$COUNT"
|
||||
bash "$(dirname "$0")/build-delivery-archive.sh"
|
||||
63
docs/old_mac/scripts/install-bcm4322-firmware-fedora.sh
Executable file
63
docs/old_mac/scripts/install-bcm4322-firmware-fedora.sh
Executable file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bash
|
||||
# Установить firmware b43 для BCM4322 на Fedora (offline).
|
||||
# Запуск на Fedora MacBook (root):
|
||||
# tar xzf fedora-bcm4322-wifi-fix.tar.gz
|
||||
# cd fedora-bcm4322-wifi-fix
|
||||
# sudo bash install-bcm4322-firmware-fedora.sh
|
||||
set -euo pipefail
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
die "запустите с sudo"
|
||||
fi
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")" && pwd)"
|
||||
SRC="${1:-$ROOT/bundle/bcm4322-offline-bundle}"
|
||||
|
||||
[ -d "$SRC/b43" ] || die "нет каталога $SRC/b43"
|
||||
[ -f "$SRC/b43/ucode16_mimo.fw" ] || die "нет $SRC/b43/ucode16_mimo.fw (BCM4322)"
|
||||
|
||||
DEST="/lib/firmware/b43"
|
||||
BACKUP="/var/lib/bcm4322-firmware-backup-$(date +%Y%m%d-%H%M%S)"
|
||||
|
||||
mkdir -p "$DEST" "$BACKUP"
|
||||
if [ -d "$DEST" ] && [ "$(ls -A "$DEST" 2>/dev/null | wc -l)" -gt 0 ]; then
|
||||
cp -a "$DEST/." "$BACKUP/" 2>/dev/null || true
|
||||
printf 'Резервная копия старых файлов: %s\n' "$BACKUP"
|
||||
fi
|
||||
|
||||
cp -a "$SRC/b43/." "$DEST/"
|
||||
chmod 644 "$DEST"/*.fw 2>/dev/null || true
|
||||
restorecon -Rv /lib/firmware/b43 >/dev/null 2>&1 || true
|
||||
|
||||
COUNT="$(find "$DEST" -maxdepth 1 -name '*.fw' | wc -l | tr -d ' ')"
|
||||
printf 'Установлено %s файлов в %s\n' "$COUNT" "$DEST"
|
||||
printf 'Ключевой файл: %s (%s bytes)\n' "$DEST/ucode16_mimo.fw" "$(stat -c%s "$DEST/ucode16_mimo.fw" 2>/dev/null || stat -f%z "$DEST/ucode16_mimo.fw")"
|
||||
|
||||
printf 'Перезагрузка модуля b43 …\n'
|
||||
modprobe -r b43 2>/dev/null || true
|
||||
sleep 1
|
||||
modprobe b43
|
||||
|
||||
sleep 2
|
||||
if dmesg | tail -50 | grep -qi 'firmware file.*not found'; then
|
||||
die "ядро всё ещё не видит firmware — проверьте: sudo dmesg | grep -i b43"
|
||||
fi
|
||||
|
||||
if command -v nmcli >/dev/null 2>&1; then
|
||||
nmcli device status || true
|
||||
WIFI_DEV="$(nmcli -t -f DEVICE,TYPE device | awk -F: '$2=="wifi"{print $1; exit}')"
|
||||
if [ -n "${WIFI_DEV:-}" ]; then
|
||||
printf 'Wi-Fi интерфейс появился: %s\n' "$WIFI_DEV"
|
||||
nmcli radio wifi on 2>/dev/null || true
|
||||
nmcli device wifi list 2>/dev/null | head -10 || true
|
||||
else
|
||||
printf 'Wi-Fi интерфейс пока не виден — нужна перезагрузка.\n'
|
||||
fi
|
||||
fi
|
||||
|
||||
printf '\nГотово. Дальше:\n'
|
||||
printf ' sudo reboot\n'
|
||||
printf ' nmcli device wifi list\n'
|
||||
printf ' nmcli device wifi connect "SSID" password "пароль"\n'
|
||||
48
docs/old_mac/scripts/prepare-receive-fedora.sh
Executable file
48
docs/old_mac/scripts/prepare-receive-fedora.sh
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
# Запустить НА FEDORA перед отправкой файла с Mac.
|
||||
# bash prepare-receive-fedora.sh
|
||||
set -euo pipefail
|
||||
|
||||
DEST="${1:-$HOME/Downloads}"
|
||||
mkdir -p "$DEST"
|
||||
|
||||
printf '=== Приём файла по Bluetooth (Fedora) ===\n\n'
|
||||
|
||||
# obex user session (GNOME/KDE)
|
||||
if systemctl --user list-unit-files 2>/dev/null | grep -q '^obex.service'; then
|
||||
systemctl --user start obex 2>/dev/null && printf '[ok] obex.service запущен\n' || true
|
||||
fi
|
||||
|
||||
# obexpushd — слушает входящие push (если установлен)
|
||||
if command -v obexpushd >/dev/null 2>&1; then
|
||||
printf '[ok] obexpushd → %s (Ctrl+C после приёма)\n' "$DEST"
|
||||
exec obexpushd -B -n -p "$DEST"
|
||||
fi
|
||||
|
||||
printf 'Автоматический приём недоступен без obexpushd.\n\n'
|
||||
printf 'Сделайте вручную (обязательно ДО отправки с Mac):\n'
|
||||
printf ' 1. Иконка Bluetooth (Blueman) в трее\n'
|
||||
printf ' 2. «Принять файл» / «Receive a File»\n'
|
||||
printf ' 3. Должен появиться диалог «Ожидание входящего файла…»\n\n'
|
||||
printf 'Если Blueman нет:\n'
|
||||
printf ' sudo dnf install blueman bluez-obexd\n'
|
||||
printf ' blueman-applet &\n\n'
|
||||
printf 'Затем на Mac:\n'
|
||||
printf ' bash …/send-to-fedora-bluetooth.sh\n\n'
|
||||
|
||||
# Попытка открыть Blueman (GUI)
|
||||
if command -v blueman-manager >/dev/null 2>&1; then
|
||||
blueman-manager >/dev/null 2>&1 &
|
||||
fi
|
||||
|
||||
printf 'Ожидание файла в: %s\n' "$DEST"
|
||||
printf 'Нажмите Ctrl+C когда файл получен.\n'
|
||||
|
||||
# Держим скрипт живым, пока пользователь жмёт Receive в Blueman
|
||||
while true; do
|
||||
sleep 2
|
||||
if ls "$DEST"/fedora-bcm4322-wifi-fix.tar.gz >/dev/null 2>&1; then
|
||||
printf '\n[ok] Файл получен: %s/fedora-bcm4322-wifi-fix.tar.gz\n' "$DEST"
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
76
docs/old_mac/scripts/send-to-fedora-bluetooth.sh
Executable file
76
docs/old_mac/scripts/send-to-fedora-bluetooth.sh
Executable file
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
# Отправить файл на Fedora MacBook по Bluetooth (с этого Mac).
|
||||
#
|
||||
# Порядок:
|
||||
# 1. FEDORA: Blueman → «Принять файл» (диалог «Ожидание…»)
|
||||
# 2. MAC: bash send-to-fedora-bluetooth.sh [файл] [устройство]
|
||||
# 3. MAC: Bluetooth File Exchange → fedora → Send
|
||||
#
|
||||
# Примеры:
|
||||
# bash docs/old_mac/scripts/send-to-fedora-bluetooth.sh
|
||||
# bash docs/old_mac/scripts/send-to-fedora-bluetooth.sh ~/Desktop/foo.tar.gz
|
||||
# bash docs/old_mac/scripts/send-to-fedora-bluetooth.sh foo.tar.gz fedora
|
||||
set -euo pipefail
|
||||
|
||||
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
DEFAULT_ARCHIVE="$OLD_MAC/deliverable/fedora-bcm4322-wifi-fix.tar.gz"
|
||||
DEFAULT_DEVICE="fedora"
|
||||
BFX="/System/Library/CoreServices/Bluetooth File Exchange.app"
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
usage: $0 [файл] [устройство_bluetooth]
|
||||
|
||||
файл путь к отправляемому файлу (по умолчанию: delivery-архив Wi-Fi fix)
|
||||
устройство имя BT-устройства Fedora (по умолчанию: fedora)
|
||||
|
||||
Перед запуском на Fedora: Blueman → «Принять файл».
|
||||
См. docs/old_mac/BLUETOOTH_FILE_TRANSFER.md
|
||||
EOF
|
||||
}
|
||||
|
||||
FILE=""
|
||||
DEVICE="$DEFAULT_DEVICE"
|
||||
|
||||
case $# in
|
||||
0) FILE="$DEFAULT_ARCHIVE" ;;
|
||||
1)
|
||||
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then usage; exit 0; fi
|
||||
if [ -f "$1" ]; then
|
||||
FILE="$1"
|
||||
else
|
||||
FILE="$DEFAULT_ARCHIVE"
|
||||
DEVICE="$1"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
[ -f "$1" ] || die "файл не найден: $1"
|
||||
FILE="$1"
|
||||
DEVICE="$2"
|
||||
;;
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
|
||||
[ -f "$FILE" ] || die "файл не найден: $FILE"
|
||||
[ -d "$BFX" ] || BFX="/System/Applications/Utilities/Bluetooth File Exchange.app"
|
||||
[ -d "$BFX" ] || die "Bluetooth File Exchange не найден"
|
||||
|
||||
MAC_BT="$(system_profiler SPBluetoothDataType 2>/dev/null || true)"
|
||||
if ! printf '%s\n' "$MAC_BT" | grep -A1 "Connected:" | grep -qi "$DEVICE"; then
|
||||
die "«$DEVICE» не в Connected. На Fedora: Bluetooth on, Trust этого Mac."
|
||||
fi
|
||||
|
||||
printf '\n=== Отправка по Bluetooth ===\n\n'
|
||||
printf 'СНАЧАЛА на Fedora: Blueman → «Принять файл».\n'
|
||||
printf 'Без этого диалог приёма НЕ появится.\n\n'
|
||||
printf 'Файл : %s (%s bytes)\n' "$FILE" "$(stat -f%z "$FILE" 2>/dev/null || stat -c%s "$FILE")"
|
||||
printf 'Куда : %s\n\n' "$DEVICE"
|
||||
printf 'Открываю Bluetooth File Exchange → выберите «%s» → Send.\n\n' "$DEVICE"
|
||||
|
||||
killall "Bluetooth File Exchange" 2>/dev/null || true
|
||||
sleep 0.5
|
||||
open -a "Bluetooth File Exchange" "$FILE"
|
||||
|
||||
printf 'Готово. Подтвердите отправку в окне Bluetooth File Exchange.\n'
|
||||
46
docs/old_mac/scripts/setup-bt-pan-fedora.sh
Executable file
46
docs/old_mac/scripts/setup-bt-pan-fedora.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fedora: поднять Bluetooth PAN (NAP) для прямой сети Mac ↔ Fedora.
|
||||
# Обходит изоляцию клиентов на хотспоте телефона.
|
||||
# sudo bash setup-bt-pan-fedora.sh
|
||||
set -euo pipefail
|
||||
|
||||
PAN_IF="${PAN_IF:-pan0}"
|
||||
PAN_IP="${PAN_IP:-172.20.99.1}"
|
||||
PAN_CIDR="${PAN_CIDR:-24}"
|
||||
MAC_BT_IP="${MAC_BT_IP:-172.20.99.2}"
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
[ "$(id -u)" -eq 0 ] || die "sudo"
|
||||
|
||||
printf '=== Bluetooth PAN (Fedora = сервер) ===\n\n'
|
||||
|
||||
for pkg in bluez bluez-tools; do
|
||||
rpm -q "$pkg" >/dev/null 2>&1 || dnf install -y "$pkg" || true
|
||||
done
|
||||
|
||||
command -v bt-network >/dev/null 2>&1 || die "нет bt-network (dnf install bluez-tools)"
|
||||
|
||||
systemctl start bluetooth
|
||||
sleep 1
|
||||
|
||||
# Остановить старый NAP
|
||||
bt-network -d nap 2>/dev/null || true
|
||||
pkill -f "bt-network -s nap" 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
printf 'Запуск NAP на %s (%s/%s)…\n' "$PAN_IF" "$PAN_IP" "$PAN_CIDR"
|
||||
bt-network -s nap "$PAN_IF" &
|
||||
sleep 2
|
||||
|
||||
ip link set "$PAN_IF" up 2>/dev/null || true
|
||||
ip addr flush dev "$PAN_IF" 2>/dev/null || true
|
||||
ip addr add "${PAN_IP}/${PAN_CIDR}" dev "$PAN_IF"
|
||||
|
||||
printf '\n[ok] PAN сервер на Fedora\n'
|
||||
printf ' Интерфейс: %s = %s/%s\n' "$PAN_IF" "$PAN_IP" "$PAN_CIDR"
|
||||
printf ' Mac после подключения PAN: назначьте %s/24 на bnep0\n' "$MAC_BT_IP"
|
||||
printf ' (или Mac Internet Sharing — см. REMOTE_ACCESS.md)\n\n'
|
||||
printf 'На Mac:\n'
|
||||
printf ' 1. Bluetooth → fedora → Connect / «Сеть» / Network Access Point\n'
|
||||
printf ' 2. bash docs/old_mac/scripts/setup-bt-pan-mac.sh\n'
|
||||
printf ' 3. bash docs/old_mac/scripts/connect-fedora.sh\n'
|
||||
39
docs/old_mac/scripts/setup-bt-pan-mac.sh
Executable file
39
docs/old_mac/scripts/setup-bt-pan-mac.sh
Executable file
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
# Mac: настроить IP на Bluetooth PAN к Fedora (после Connect к NAP).
|
||||
# bash docs/old_mac/scripts/setup-bt-pan-mac.sh
|
||||
set -euo pipefail
|
||||
|
||||
MAC_IP="${MAC_IP:-172.20.99.2}"
|
||||
FEDORA_IP="${FEDORA_IP:-172.20.99.1}"
|
||||
PREFIX=24
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
# Найти bnep/pan интерфейс
|
||||
IFACE=""
|
||||
for cand in bnep0 pan0 bridge100; do
|
||||
if ifconfig "$cand" >/dev/null 2>&1; then
|
||||
IFACE="$cand"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$IFACE" ]; then
|
||||
IFACE="$(ifconfig -l | tr ' ' '\n' | grep -E '^bnep|^pan' | head -1)"
|
||||
fi
|
||||
|
||||
[ -n "$IFACE" ] || die "нет bnep/pan интерфейса — сначала на Fedora: sudo bash setup-bt-pan-fedora.sh, затем Mac Bluetooth → fedora → Connect (Network)"
|
||||
|
||||
printf 'Интерфейс: %s\n' "$IFACE"
|
||||
|
||||
sudo ifconfig "$IFACE" "$MAC_IP" netmask 255.255.255.0 up
|
||||
sudo route add -host "$FEDORA_IP" -interface "$IFACE" 2>/dev/null || true
|
||||
|
||||
printf '\nПроверка ping %s …\n' "$FEDORA_IP"
|
||||
if ping -c 2 -W 1000 "$FEDORA_IP"; then
|
||||
printf '\n[ok] L2/L3 связь Mac ↔ Fedora по BT PAN\n'
|
||||
printf 'SSH: bash docs/old_mac/scripts/connect-fedora.sh\n'
|
||||
else
|
||||
printf '\n[!] ping не прошёл — повторите Connect к fedora в Bluetooth\n'
|
||||
exit 1
|
||||
fi
|
||||
69
docs/old_mac/scripts/setup-remote-mac.sh
Executable file
69
docs/old_mac/scripts/setup-remote-mac.sh
Executable file
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
# Mac: ключ SSH + ssh config для Fedora MacBook.
|
||||
# bash docs/old_mac/scripts/setup-remote-mac.sh [fedora_user]
|
||||
set -euo pipefail
|
||||
|
||||
OLD_MAC="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
FEDORA_USER="${1:-p}"
|
||||
KEY="$HOME/.ssh/id_ed25519_fedora"
|
||||
KEY_PUB="${KEY}.pub"
|
||||
SSH_CONFIG="$HOME/.ssh/config"
|
||||
DELIVERABLE="$OLD_MAC/deliverable"
|
||||
PUBKEY_EXPORT="$DELIVERABLE/mac_pubkey.txt"
|
||||
|
||||
mkdir -p "$DELIVERABLE" "$HOME/.ssh"
|
||||
chmod 700 "$HOME/.ssh"
|
||||
|
||||
if [ ! -f "$KEY" ]; then
|
||||
ssh-keygen -t ed25519 -f "$KEY" -N "" -C "mac-fedora-remote-$(hostname -s)"
|
||||
printf 'Создан ключ: %s\n' "$KEY"
|
||||
fi
|
||||
|
||||
cp "$KEY_PUB" "$PUBKEY_EXPORT"
|
||||
chmod 644 "$PUBKEY_EXPORT"
|
||||
|
||||
MARK_BEGIN="# --- old_mac fedora-mbp (local_machine) ---"
|
||||
MARK_END="# --- end old_mac fedora-mbp ---"
|
||||
BLOCK=$(cat <<EOF
|
||||
$MARK_BEGIN
|
||||
Host fedora-mbp old-mac-fedora fedora
|
||||
User $FEDORA_USER
|
||||
IdentityFile $KEY
|
||||
IdentitiesOnly yes
|
||||
StrictHostKeyChecking accept-new
|
||||
# Hotspot LAN (mDNS)
|
||||
HostName fedora.local
|
||||
# BT PAN: Fedora = 172.20.99.1
|
||||
# HostName 172.20.99.1
|
||||
|
||||
Host fedora-mbp-bt
|
||||
HostName 172.20.99.1
|
||||
User $FEDORA_USER
|
||||
IdentityFile $KEY
|
||||
IdentitiesOnly yes
|
||||
StrictHostKeyChecking accept-new
|
||||
$MARK_END
|
||||
EOF
|
||||
)
|
||||
|
||||
if [ -f "$SSH_CONFIG" ] && grep -q "$MARK_BEGIN" "$SSH_CONFIG"; then
|
||||
awk -v b="$MARK_BEGIN" -v e="$MARK_END" '
|
||||
$0==b {skip=1; next}
|
||||
$0==e {skip=0; next}
|
||||
!skip {print}
|
||||
' "$SSH_CONFIG" >"$SSH_CONFIG.tmp"
|
||||
mv "$SSH_CONFIG.tmp" "$SSH_CONFIG"
|
||||
fi
|
||||
|
||||
printf '\n%s\n' "$BLOCK" >>"$SSH_CONFIG"
|
||||
chmod 600 "$SSH_CONFIG"
|
||||
|
||||
printf '\n=== Mac готов ===\n'
|
||||
printf 'Ключ: %s\n' "$KEY"
|
||||
printf 'Публичный ключ (для Fedora): %s\n' "$PUBKEY_EXPORT"
|
||||
printf 'SSH config: Host fedora-mbp | fedora-mbp-bt\n\n'
|
||||
printf 'Дальше:\n'
|
||||
printf ' 1. Пересобрать архив: bash %s/build-remote-access-archive.sh\n' "$(dirname "$0")"
|
||||
printf ' 2. Отправить на Fedora по BT: bash %s/send-to-fedora-bluetooth.sh\n' "$(dirname "$0")"
|
||||
printf ' 3. На Fedora: sudo bash setup-ssh-fedora.sh %s\n' "$FEDORA_USER"
|
||||
printf ' 4. С Mac: bash %s/connect-fedora.sh\n' "$(dirname "$0")"
|
||||
70
docs/old_mac/scripts/setup-ssh-fedora.sh
Executable file
70
docs/old_mac/scripts/setup-ssh-fedora.sh
Executable file
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fedora: включить SSH и подготовить удалённый доступ.
|
||||
# sudo bash setup-ssh-fedora.sh [имя_пользователя]
|
||||
set -euo pipefail
|
||||
|
||||
USER_NAME="${1:-${SUDO_USER:-$USER}}"
|
||||
SSH_DIR="/home/$USER_NAME/.ssh"
|
||||
AUTH_KEYS="$SSH_DIR/authorized_keys"
|
||||
PUBKEY_FILE="$(dirname "$0")/mac_pubkey.txt"
|
||||
|
||||
die() { printf 'error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
[ "$(id -u)" -eq 0 ] || die "запустите с sudo"
|
||||
|
||||
id "$USER_NAME" >/dev/null 2>&1 || die "пользователь не найден: $USER_NAME"
|
||||
|
||||
printf '=== SSH remote access (Fedora) ===\n\n'
|
||||
|
||||
# openssh-server
|
||||
if ! rpm -q openssh-server >/dev/null 2>&1; then
|
||||
if command -v dnf >/dev/null 2>&1; then
|
||||
dnf install -y openssh-server || die "dnf install openssh-server failed"
|
||||
else
|
||||
die "установите openssh-server вручную"
|
||||
fi
|
||||
fi
|
||||
|
||||
systemctl enable --now sshd
|
||||
systemctl is-active sshd >/dev/null || die "sshd не запустился"
|
||||
|
||||
# firewall
|
||||
if systemctl is-active firewalld >/dev/null 2>&1; then
|
||||
firewall-cmd --permanent --add-service=ssh
|
||||
firewall-cmd --reload
|
||||
printf '[ok] firewalld: ssh разрешён\n'
|
||||
else
|
||||
printf '[info] firewalld не активен — пропуск\n'
|
||||
fi
|
||||
|
||||
# authorized_keys
|
||||
install -d -m 700 -o "$USER_NAME" -g "$USER_NAME" "$SSH_DIR"
|
||||
touch "$AUTH_KEYS"
|
||||
chown "$USER_NAME:$USER_NAME" "$AUTH_KEYS"
|
||||
chmod 600 "$AUTH_KEYS"
|
||||
|
||||
if [ -s "$PUBKEY_FILE" ]; then
|
||||
if ! grep -qF "$(awk '{print $1,$2}' "$PUBKEY_FILE")" "$AUTH_KEYS" 2>/dev/null; then
|
||||
cat "$PUBKEY_FILE" >>"$AUTH_KEYS"
|
||||
printf '[ok] добавлен ключ из mac_pubkey.txt\n'
|
||||
else
|
||||
printf '[ok] ключ из mac_pubkey.txt уже есть\n'
|
||||
fi
|
||||
else
|
||||
printf '[!] mac_pubkey.txt пуст — добавьте ключ Mac вручную:\n'
|
||||
printf ' echo "ssh-ed25519 AAAA... mac-fedora" >> %s\n' "$AUTH_KEYS"
|
||||
fi
|
||||
|
||||
# hostname для mDNS
|
||||
if command -v hostnamectl >/dev/null 2>&1; then
|
||||
hostnamectl set-hostname fedora 2>/dev/null || true
|
||||
fi
|
||||
|
||||
printf '\n--- Сеть ---\n'
|
||||
ip -4 -o addr show scope global 2>/dev/null | awk '{print $2, $4}' || true
|
||||
printf 'hostname: %s\n' "$(hostname -f 2>/dev/null || hostname)"
|
||||
|
||||
printf '\n--- Готово ---\n'
|
||||
printf 'С Mac: ssh %s@<IP>\n' "$USER_NAME"
|
||||
printf 'mDNS: ssh %s@fedora.local\n' "$USER_NAME"
|
||||
printf '\nЕсли с Mac не пингуется — изоляция хотспота или используйте BT PAN (см. REMOTE_ACCESS.md).\n'
|
||||
Reference in New Issue
Block a user