diff --git a/.gitignore b/.gitignore index 7c06943..4f960ef 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,9 @@ Desktop.ini # *.tar.gz # *.rar -# --- Local overrides (keep repo-agnostic) --- +# --- old_mac local secrets --- +.config/old_mac/ +docs/old_mac/.env +docs/old_mac/**/.env *.local *.local.* diff --git a/docs/apps/anytype/scripts/diagnose-phone-usb-mac.sh b/docs/apps/anytype/scripts/diagnose-phone-usb-mac.sh new file mode 100755 index 0000000..ef4a370 --- /dev/null +++ b/docs/apps/anytype/scripts/diagnose-phone-usb-mac.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Диагностика: Mac не видит телефон по USB (заряжается, но нет data / USB-модема). +# Использование: +# ./docs/apps/anytype/scripts/diagnose-phone-usb-mac.sh +# ./docs/apps/anytype/scripts/diagnose-phone-usb-mac.sh watch # опрос каждые 2 с + +set -e + +watch="${1:-}" + +scan() { + printf '\n=== %s ===\n' "$(date '+%H:%M:%S')" + echo "--- USB (iPhone / Android) ---" + if system_profiler SPUSBDataType 2>/dev/null | grep -qiE 'iPhone|iPad|Apple Mobile|Android|MTP|PTP|Vendor ID: 0x05ac|Vendor ID: 0x18d1|Vendor ID: 0x04e8|Vendor ID: 0x2717'; then + system_profiler SPUSBDataType 2>/dev/null | grep -B1 -A6 -iE 'iPhone|iPad|Apple Mobile|Android|MTP|PTP|Vendor ID: 0x05ac|Vendor ID: 0x18d1|Vendor ID: 0x04e8|Vendor ID: 0x2717' + else + echo "Телефон в USB-дереве НЕ найден (только зарядка или кабель/порт без data)." + fi + echo "--- usbmuxd (iPhone) ---" + pgrep -lf usbmuxd 2>/dev/null || echo "usbmuxd не запущен" + if command -v idevice_id >/dev/null 2>&1; then + echo "idevice_id -l: $(idevice_id -l 2>&1 || true)" + fi + echo "--- Сетевые интерфейсы (ожидаем iPhone USB / RNDIS) ---" + networksetup -listallnetworkservices 2>/dev/null | grep -iE 'iphone|usb|rndis|android' || echo "(службы USB-модема нет)" + echo "--- Совет ---" + echo "1) Кабель с передачей данных (не «только зарядка»)" + echo "2) Порт Mac напрямую, не через хаб (сейчас виден Genesys USB Hub)" + echo "3) iPhone: Разблокировать → «Доверять» → Настройки → Режим модема → USB" + echo "4) Android: USB → «Передача файлов» или «USB-модем»" +} + +if [ "$watch" = "watch" ]; then + echo "Следим за USB. Переподключите телефон. Ctrl+C для выхода." + while true; do scan; sleep 2; done +else + scan +fi diff --git a/docs/apps/joplin/README.md b/docs/apps/joplin/README.md new file mode 100644 index 0000000..bb14bdd --- /dev/null +++ b/docs/apps/joplin/README.md @@ -0,0 +1,84 @@ +# Joplin — локальный синк Mac ↔ телефон (WebDAV, без Docker) + +Синхронизация через **rclone WebDAV** только в локальной сети. Данные на Mac в `~/JoplinSync`. Облака Joplin/Dropbox не используются. + +--- + +## Быстрый старт (Mac) + +```bash +brew install rclone # если ещё нет +chmod +x ./docs/apps/joplin/scripts/joplin-webdav-*.sh +./docs/apps/joplin/scripts/joplin-webdav-install.sh +``` + +Показать URL и статус: + +```bash +./docs/apps/joplin/scripts/joplin-webdav-status.sh +``` + +Учётка: `~/.config/joplin-webdav/env` (права `600`, **не коммитить**). + +Остановка / запуск: + +```bash +./docs/apps/joplin/scripts/joplin-webdav-stop.sh +./docs/apps/joplin/scripts/joplin-webdav-serve.sh +``` + +**После смены пароля в `~/.config/joplin-webdav/env`** — обязательно перезапуск (иначе rclone держит старый пароль → **401**): + +```bash +./docs/apps/joplin/scripts/joplin-webdav-reload.sh +``` + +Пароль в Joplin на телефоне и Mac должен **совпадать с `JOPLIN_WEBDAV_PASS` в env**, не со старым из установки. + +Автозапуск при входе: LaunchAgent `com.eternal.joplin-webdav` (ставится install-скриптом). + +--- + +## Настройка Joplin (Mac и телефон) + +1. **Настройки → Синхронизация** +2. Внизу: **Self-hosting → Click here to select one** +3. **WebDAV** +4. Заполнить: + +| Поле | Значение | +|------|----------| +| WebDAV URL | **Mac:** `http://127.0.0.1:8080` · **Телефон:** `http://10.219.227.100:8080` (статический IP на Mac — [STABLE_SETUP](../../connectivity/apps/joplin/STABLE_SETUP.md)) | +| Логин | `joplin` | +| Пароль | из `~/.config/joplin-webdav/env` → `JOPLIN_WEBDAV_PASS` | + +5. **Проверить конфигурацию синхронизации** → OK → синхронизировать. + +**Важно:** Mac и телефон в **одной сети** (хотспот телефона). URL с `http://`, не `https://`. Без слэша в конце URL. + +Опционально: **Настройки → Шифрование** — E2EE (мастер-пароль), на сервере только шифротекст. + +--- + +## Приватность + +- Заметки на телефоне — в песочнице **Joplin**, не «доступ ко всем файлам». +- WebDAV слушает `0.0.0.0:8080` только пока запущен rclone; не открывайте порт в интернет. +- При включённом фаерволе macOS разрешите вход для **rclone** или порта **8080** в локальной сети. + +--- + +## Если не коннектится с телефона + +1. `./docs/apps/joplin/scripts/joplin-webdav-status.sh` — процесс и IP. +2. На телефоне в браузере: `http://IP_MAC:8080` (может запросить логин — значит сеть доходит). +3. Синк сломался — [RUNBOOK](../../connectivity/apps/joplin/RUNBOOK.md); стабильная схема без смены URL — [STABLE_SETUP](../../connectivity/apps/joplin/STABLE_SETUP.md). +4. Логи: `~/Library/Logs/joplin-webdav/` + +--- + +## Связанное + +- **[Runbook: синк сломался (хотспот, логи, ETIMEDOUT)](../../connectivity/apps/joplin/RUNBOOK.md)** +- [Anytype (P2P, без WebDAV)](../anytype/README.md) +- [diagnose-phone-usb-mac.sh](../anytype/scripts/diagnose-phone-usb-mac.sh) — если понадобится USB diff --git a/docs/apps/joplin/scripts/joplin-android-hotspot-setup.sh b/docs/apps/joplin/scripts/joplin-android-hotspot-setup.sh new file mode 100755 index 0000000..24dee6c --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-android-hotspot-setup.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Полная настройка Joplin для Android-хотспота (Mac = клиент Wi‑Fi). +# .local с телефона не работает → alias *.100 + LaunchAgent. +# +# ./joplin-android-hotspot-setup.sh install + +set -e + +ROOT="$(CDPATH= cd -- "$(dirname "$0")" && pwd)" + +echo "=== Joplin: Android-хотспот (Mac клиент) ===" +echo "" +echo "Почему не eternals.local:" +echo " Android, раздающий хотспот, не резолвит .local имён подключённых устройств." +echo " rclone.log — только 127.0.0.1, запросов с телефона нет." +echo "" + +"$ROOT/joplin-hotspot-alias-install.sh" +echo "" +echo "Поднимаем alias (sudo)..." +"$ROOT/joplin-hotspot-alias.sh" ensure +echo "" +"$ROOT/joplin-hotspot-alias.sh" status +echo "" +echo "=== На телефоне в Joplin WebDAV ===" +grep '^JOPLIN_PHONE_URL=' "${JOPLIN_WEBDAV_CONFIG:-$HOME/.config/joplin-webdav/env}" 2>/dev/null \ + | cut -d= -f2- || phone_url=$("$ROOT/joplin-hotspot-alias.sh" status | awk '/URL на телефоне/{getline; print}' | tr -d ' ') +echo " $(grep '^JOPLIN_PHONE_URL=' "$HOME/.config/joplin-webdav/env" 2>/dev/null | cut -d= -f2-)" +echo "" +echo "При смене подсети (10.219→10.74) URL меняется — alias LaunchAgent поднимет *.100," +echo "новый URL: ./joplin-hotspot-alias.sh status" diff --git a/docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh b/docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh new file mode 100755 index 0000000..4bb13ad --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# Одноразово: passwordless sudo только для joplin-hotspot-alias.sh ensure +set -e + +SCRIPT="$(CDPATH= cd -- "$(dirname "$0")" && pwd)/joplin-hotspot-alias.sh" +DEST="/etc/sudoers.d/joplin-hotspot-alias" +USER_NAME="$(whoami)" + +[ -x "$SCRIPT" ] || chmod +x "$SCRIPT" + +TMP="$(mktemp)" +trap 'rm -f "$TMP"' EXIT + +cat >"$TMP" <"$PLIST" < + + + + Label + com.eternal.joplin-hotspot-alias + ProgramArguments + + $ALIAS + ensure + + StartInterval + 60 + RunAtLoad + + StandardOutPath + $HOME/Library/Logs/joplin-webdav/alias-launchd.out.log + StandardErrorPath + $HOME/Library/Logs/joplin-webdav/alias-launchd.err.log + + +EOF + +launchctl bootout "gui/$(id -u)/com.eternal.joplin-hotspot-alias" 2>/dev/null || true +launchctl bootstrap "gui/$(id -u)" "$PLIST" +launchctl enable "gui/$(id -u)/com.eternal.joplin-hotspot-alias" 2>/dev/null || true + +echo "LaunchAgent com.eternal.joplin-hotspot-alias установлен (каждые 60 с)." +echo "Для работы без пароля один раз:" +echo " $ROOT/joplin-hotspot-alias-install-sudo.sh" +echo "Сейчас:" +"$ALIAS" status diff --git a/docs/apps/joplin/scripts/joplin-hotspot-alias.sh b/docs/apps/joplin/scripts/joplin-hotspot-alias.sh new file mode 100755 index 0000000..cd5b18b --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-hotspot-alias.sh @@ -0,0 +1,149 @@ +#!/bin/sh +# Стабильный URL для Joplin на телефоне при Android-хотспоте: http://<подсеть>.100:8080 +# Alias *.100 на en0 (DHCP primary не трогаем). LaunchAgent поднимает alias после reconnect. +# +# ./joplin-hotspot-alias.sh status +# ./joplin-hotspot-alias.sh ensure +# +# Passwordless: ./joplin-hotspot-alias-install-sudo.sh + +set -e + +CONFIG="${JOPLIN_WEBDAV_CONFIG:-$HOME/.config/joplin-webdav/env}" +WIFI_DEV="${WIFI_DEVICE:-en0}" +PORT="${JOPLIN_WEBDAV_PORT:-8080}" +LOG="$HOME/Library/Logs/joplin-webdav/alias.log" + +ipv4_subnet() { + printf '%s\n' "$1" | awk -F. '{print $1"."$2"."$3}' +} + +ipv4_last_octet() { + printf '%s\n' "$1" | awk -F. '{print $4}' +} + +default_gateway() { + route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}' +} + +load_config() { + if [ -f "$CONFIG" ]; then + # shellcheck disable=SC1090 + . "$CONFIG" + fi + PORT="${JOPLIN_WEBDAV_PORT:-$PORT}" +} + +joplin_phone_ip() { + load_config + gw="$(default_gateway 2>/dev/null || true)" + [ -n "$gw" ] || return 1 + subnet="$(ipv4_subnet "$gw")" + if [ -n "${JOPLIN_STATIC_IP:-}" ]; then + last="$(ipv4_last_octet "$JOPLIN_STATIC_IP")" + else + last=100 + fi + printf '%s\n' "${subnet}.${last}" +} + +phone_url() { + ip="$(joplin_phone_ip 2>/dev/null || true)" + [ -n "$ip" ] || return 1 + printf 'http://%s:%s\n' "$ip" "$PORT" +} + +has_ip_on_dev() { + ip="$1" + dev="$2" + ifconfig "$dev" 2>/dev/null | grep -q "inet ${ip} " +} + +log_msg() { + mkdir -p "$(dirname "$LOG")" + printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >>"$LOG" +} + +run_priv() { + if [ "$(id -u)" -eq 0 ]; then + "$@" + else + sudo "$@" + fi +} + +write_phone_url_env() { + url="$(phone_url 2>/dev/null || true)" + [ -n "$url" ] && [ -f "$CONFIG" ] || return 0 + if grep -q '^JOPLIN_PHONE_URL=' "$CONFIG" 2>/dev/null; then + sed -i '' "s|^JOPLIN_PHONE_URL=.*|JOPLIN_PHONE_URL=$url|" "$CONFIG" 2>/dev/null \ + || sed -i "s|^JOPLIN_PHONE_URL=.*|JOPLIN_PHONE_URL=$url|" "$CONFIG" + else + printf 'JOPLIN_PHONE_URL=%s\n' "$url" >>"$CONFIG" + fi +} + +cmd_status() { + load_config + target="$(joplin_phone_ip 2>/dev/null || true)" + primary="$(ipconfig getifaddr "$WIFI_DEV" 2>/dev/null || true)" + gw="$(default_gateway 2>/dev/null || true)" + url="$(phone_url 2>/dev/null || true)" + + echo "mode: Android-хотспот (alias *.100)" + echo "device: $WIFI_DEV" + echo "primary: ${primary:-(none)}" + echo "gateway: ${gw:-(none)}" + echo "joplin IP: ${target:-(no gateway)}" + + if [ -n "$target" ] && has_ip_on_dev "$target" "$WIFI_DEV"; then + echo "alias: OK" + elif [ -n "$target" ] && [ "$primary" = "$target" ]; then + echo "alias: OK (primary)" + elif [ -n "$target" ]; then + echo "alias: MISSING — телефон не достучится" + echo " fix: $0 ensure" + fi + + if [ -n "$url" ]; then + echo "" + echo "URL на телефоне (работает с Android-хотспота):" + echo " $url" + echo "" + echo "⚠ http://*.local:8080 с телефона НЕ работает (Android не резолвит mDNS клиентов хотспота)" + fi +} + +cmd_ensure() { + target="$(joplin_phone_ip 2>/dev/null || true)" + if [ -z "$target" ]; then + log_msg "skip: no gateway" + exit 0 + fi + primary="$(ipconfig getifaddr "$WIFI_DEV" 2>/dev/null || true)" + if [ -z "$primary" ]; then + log_msg "skip: no primary IP" + exit 0 + fi + if [ "$primary" = "$target" ] || has_ip_on_dev "$target" "$WIFI_DEV"; then + write_phone_url_env + exit 0 + fi + log_msg "add alias $target on $WIFI_DEV (primary $primary)" + run_priv ifconfig "$WIFI_DEV" inet "$target" netmask 255.255.255.0 alias + write_phone_url_env + echo "alias OK: $target" + echo "URL на телефоне: $(phone_url)" +} + +usage() { + echo "Usage: $(basename "$0") status|ensure" >&2 + exit 1 +} + +case "${1:-ensure}" in + status) cmd_status ;; + ensure) cmd_ensure ;; + -h|--help) usage ;; + *) usage ;; +esac diff --git a/docs/apps/joplin/scripts/joplin-mdns-setup.sh b/docs/apps/joplin/scripts/joplin-mdns-setup.sh new file mode 100755 index 0000000..1725e2c --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-mdns-setup.sh @@ -0,0 +1,165 @@ +#!/bin/sh +# Стабильный URL для Joplin на телефоне: http://.local:8080 +# Не зависит от подсети хотспота (10.219.x → 10.74.x). Alias *.100 не нужен. +# +# ./joplin-mdns-setup.sh status +# ./joplin-mdns-setup.sh install # записать URL в env (rename опционально) +# ./joplin-mdns-setup.sh verify + +set -e + +CONFIG="${JOPLIN_WEBDAV_CONFIG:-$HOME/.config/joplin-webdav/env}" +PORT="${JOPLIN_WEBDAV_PORT:-8080}" +WIFI_DEV="${WIFI_DEVICE:-en0}" +# Пусто = текущий LocalHostName Mac (у вас часто Eternals → eternals.local) +PREFERRED_HOST="${JOPLIN_MDNS_HOST:-}" + +load_config() { + if [ -f "$CONFIG" ]; then + # shellcheck disable=SC1090 + . "$CONFIG" + fi + PORT="${JOPLIN_WEBDAV_PORT:-$PORT}" + PREFERRED_HOST="${JOPLIN_MDNS_HOST:-$PREFERRED_HOST}" +} + +current_local_hostname() { + scutil --get LocalHostName 2>/dev/null || true +} + +mdns_host() { + load_config + if [ -n "$PREFERRED_HOST" ]; then + printf '%s\n' "$PREFERRED_HOST" + else + current_local_hostname + fi +} + +mdns_fqdn() { + printf '%s.local\n' "$(mdns_host | tr '[:upper:]' '[:lower:]')" +} + +phone_url() { + host="$(mdns_host | tr '[:upper:]' '[:lower:]')" + printf 'http://%s.local:%s\n' "$host" "$PORT" +} + +primary_ip() { + ipconfig getifaddr "$WIFI_DEV" 2>/dev/null || true +} + +resolve_mdns_ip() { + host="$(mdns_fqdn)" + dscacheutil -q host -a name "$host" 2>/dev/null \ + | awk '/ip_address:/ {print $2}' | grep -v '^127\.' | head -1 +} + +cmd_status() { + load_config + local_name="$(current_local_hostname)" + host="$(mdns_host)" + ip="$(primary_ip)" + resolved="$(resolve_mdns_ip 2>/dev/null || true)" + url="$(phone_url)" + + echo "LocalHostName: ${local_name:-?}" + echo "mDNS host: $host → $(mdns_fqdn)" + echo "primary $WIFI_DEV: ${ip:-(none)}" + echo "mDNS → IP: ${resolved:-(none)}" + echo "" + echo "mDNS URL (НЕ для Android-хотспота — телефон не резолвит .local клиентов):" + echo " $url" + echo "URL на Mac: http://127.0.0.1:${PORT}" + echo "Телефон-хотспот: ./joplin-hotspot-alias.sh status" + + if [ -n "$PREFERRED_HOST" ] && [ "$local_name" != "$PREFERRED_HOST" ]; then + echo "" + echo "⚠ В env JOPLIN_MDNS_HOST=$PREFERRED_HOST, LocalHostName=$local_name" + echo " install переименует Mac или уберите JOPLIN_MDNS_HOST из env" + elif [ -n "$ip" ] && [ -n "$resolved" ] && [ "$ip" = "$resolved" ]; then + echo "" + echo "OK: mDNS на Mac резолвится (для телефона используйте alias *.100)" + elif [ -n "$ip" ] && [ -z "$resolved" ]; then + echo "" + echo "⚠ mDNS пока не резолвится — подождите или переподключите Wi‑Fi" + elif [ -z "$ip" ]; then + echo "" + echo "⚠ Нет IP на $WIFI_DEV" + fi +} + +write_env_mdns() { + load_config + url="$(phone_url)" + host="$(mdns_host)" + if [ ! -f "$CONFIG" ]; then + echo "Нет $CONFIG — сначала joplin-webdav-install.sh" >&2 + return 1 + fi + if grep -q '^JOPLIN_MDNS_HOST=' "$CONFIG" 2>/dev/null; then + sed -i '' "s|^JOPLIN_MDNS_HOST=.*|JOPLIN_MDNS_HOST=$host|" "$CONFIG" 2>/dev/null \ + || sed -i "s|^JOPLIN_MDNS_HOST=.*|JOPLIN_MDNS_HOST=$host|" "$CONFIG" + else + printf 'JOPLIN_MDNS_HOST=%s\n' "$host" >>"$CONFIG" + fi + if grep -q '^JOPLIN_PHONE_URL=' "$CONFIG" 2>/dev/null; then + sed -i '' "s|^JOPLIN_PHONE_URL=.*|JOPLIN_PHONE_URL=$url|" "$CONFIG" 2>/dev/null \ + || sed -i "s|^JOPLIN_PHONE_URL=.*|JOPLIN_PHONE_URL=$url|" "$CONFIG" + else + printf 'JOPLIN_PHONE_URL=%s\n' "$url" >>"$CONFIG" + fi +} + +cmd_install() { + load_config + local_name="$(current_local_hostname)" + target="$(mdns_host)" + + if [ -n "$PREFERRED_HOST" ] && [ "$local_name" != "$PREFERRED_HOST" ]; then + echo "Переименование LocalHostName: $local_name → $PREFERRED_HOST" + if [ "$(id -u)" -eq 0 ]; then + scutil --set LocalHostName "$PREFERRED_HOST" + else + sudo scutil --set LocalHostName "$PREFERRED_HOST" + fi + else + echo "Используем текущий LocalHostName: $local_name (→ $(mdns_fqdn))" + fi + + write_env_mdns + echo "" + echo "На телефоне в Joplin WebDAV (один раз):" + echo " $(phone_url)" + echo "" + sleep 2 + cmd_verify || true +} + +cmd_verify() { + ip="$(primary_ip)" + resolved="$(resolve_mdns_ip 2>/dev/null || true)" + if [ -z "$ip" ]; then + echo "verify: нет IP на $WIFI_DEV" >&2 + exit 1 + fi + if [ "$ip" = "$resolved" ]; then + echo "verify OK: $(mdns_fqdn) → $ip" + exit 0 + fi + echo "verify: mDNS=${resolved:-none} ip=$ip (часто OK через 30с после connect)" >&2 + exit 1 +} + +usage() { + echo "Usage: $(basename "$0") status|install|verify" >&2 + exit 1 +} + +case "${1:-status}" in + status) cmd_status ;; + install) cmd_install ;; + verify) cmd_verify ;; + -h|--help) usage ;; + *) usage ;; +esac diff --git a/docs/apps/joplin/scripts/joplin-webdav-install.sh b/docs/apps/joplin/scripts/joplin-webdav-install.sh new file mode 100755 index 0000000..957520f --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-webdav-install.sh @@ -0,0 +1,90 @@ +#!/bin/sh +# Установка: конфиг, launchd (автозапуск), первый старт WebDAV. +set -e + +ROOT="$(CDPATH= cd -- "$(dirname "$0")" && pwd)" +CONFIG_DIR="$HOME/.config/joplin-webdav" +CONFIG="$CONFIG_DIR/env" +LAUNCH_AGENT="$HOME/Library/LaunchAgents/com.eternal.joplin-webdav.plist" +SERVE="$ROOT/joplin-webdav-serve.sh" + +mkdir -p "$CONFIG_DIR" "$HOME/JoplinSync" "$HOME/Library/Logs/joplin-webdav" + +if [ ! -f "$CONFIG" ]; then + PASS=$(openssl rand -base64 18 | tr -d '/+=' | head -c 24) + cat > "$CONFIG" </dev/null 2>&1; then + echo "Устанавливаю rclone..." + brew install rclone +fi + +mkdir -p "$HOME/Library/LaunchAgents" +cat > "$LAUNCH_AGENT" < + + + + Label + com.eternal.joplin-webdav + ProgramArguments + + $SERVE + --foreground + + RunAtLoad + + KeepAlive + + StandardOutPath + $HOME/Library/Logs/joplin-webdav/launchd.out.log + StandardErrorPath + $HOME/Library/Logs/joplin-webdav/launchd.err.log + + +EOF + +launchctl bootout "gui/$(id -u)/com.eternal.joplin-webdav" 2>/dev/null || true +launchctl bootstrap "gui/$(id -u)" "$LAUNCH_AGENT" +launchctl enable "gui/$(id -u)/com.eternal.joplin-webdav" 2>/dev/null || true + +launchctl enable "gui/$(id -u)/com.eternal.joplin-webdav" 2>/dev/null || true + +chmod +x "$ROOT"/joplin-mdns-setup.sh 2>/dev/null || true +if [ -x "$ROOT/joplin-mdns-setup.sh" ]; then + echo "" + echo "=== mDNS (стабильный URL на телефоне) ===" + if [ "$(scutil --get LocalHostName 2>/dev/null)" = "joplin-mac" ]; then + "$ROOT/joplin-mdns-setup.sh" status || true + else + echo "LocalHostName ещё не joplin-mac. Один раз:" + echo " $ROOT/joplin-mdns-setup.sh install" + fi +fi + +sleep 2 +"$ROOT/joplin-webdav-status.sh" + +echo "" +echo "Пароль для Joplin:" +grep JOPLIN_WEBDAV_PASS "$CONFIG" | cut -d= -f2- +echo "" +echo "На телефоне (один раз, навсегда): http://joplin-mac.local:8080" +echo "Установка имени: $ROOT/joplin-mdns-setup.sh install" diff --git a/docs/apps/joplin/scripts/joplin-webdav-reload.sh b/docs/apps/joplin/scripts/joplin-webdav-reload.sh new file mode 100755 index 0000000..ae2fc14 --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-webdav-reload.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# Перечитать ~/.config/joplin-webdav/env и перезапустить WebDAV (после смены пароля). +set -e +uid=$(id -u) +launchctl kickstart -k "gui/${uid}/com.eternal.joplin-webdav" +sleep 2 +"$(dirname "$0")/joplin-webdav-status.sh" diff --git a/docs/apps/joplin/scripts/joplin-webdav-serve.sh b/docs/apps/joplin/scripts/joplin-webdav-serve.sh new file mode 100755 index 0000000..a9432c9 --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-webdav-serve.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# Локальный WebDAV для синхронизации Joplin (Mac ↔ телефон по LAN). +# Данные: ~/JoplinSync. Учётка: ~/.config/joplin-webdav/env +# +# ./joplin-webdav-serve.sh # фон +# ./joplin-webdav-serve.sh --foreground # передний план (для launchd) + +set -e + +CONFIG="${JOPLIN_WEBDAV_CONFIG:-$HOME/.config/joplin-webdav/env}" +LOG_DIR="$HOME/Library/Logs/joplin-webdav" +PID_FILE="$HOME/.config/joplin-webdav/rclone.pid" +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd) + +mkdir -p "$LOG_DIR" "$(dirname "$PID_FILE")" + +if [ ! -f "$CONFIG" ]; then + echo "Нет $CONFIG — запустите: $SCRIPT_DIR/joplin-webdav-install.sh" >&2 + exit 1 +fi + +# shellcheck disable=SC1090 +. "$CONFIG" + +: "${JOPLIN_WEBDAV_USER:?}" +: "${JOPLIN_WEBDAV_PASS:?}" +: "${JOPLIN_WEBDAV_PORT:=8080}" +: "${JOPLIN_WEBDAV_ROOT:=$HOME/JoplinSync}" + +mkdir -p "$JOPLIN_WEBDAV_ROOT" + +RCLONE="$(command -v rclone || echo /opt/homebrew/bin/rclone)" +if [ ! -x "$RCLONE" ]; then + echo "rclone не найден. Установите: brew install rclone" >&2 + exit 1 +fi + +run_rclone() { + exec "$RCLONE" serve webdav "$JOPLIN_WEBDAV_ROOT" \ + --addr "0.0.0.0:${JOPLIN_WEBDAV_PORT}" \ + --user "$JOPLIN_WEBDAV_USER" \ + --pass "$JOPLIN_WEBDAV_PASS" \ + --vfs-cache-mode minimal \ + --log-file "$LOG_DIR/rclone.log" \ + --log-level INFO +} + +case "${1:-}" in + --foreground|-f) + run_rclone + ;; + *) + if [ -f "$PID_FILE" ]; then + old_pid=$(cat "$PID_FILE") + if kill -0 "$old_pid" 2>/dev/null; then + echo "Уже запущен (PID $old_pid), порт ${JOPLIN_WEBDAV_PORT}" + exit 0 + fi + rm -f "$PID_FILE" + fi + nohup "$0" --foreground >>"$LOG_DIR/stdout.log" 2>&1 & + echo $! >"$PID_FILE" + sleep 1 + if kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then + echo "WebDAV запущен (PID $(cat "$PID_FILE")), порт ${JOPLIN_WEBDAV_PORT}" + else + echo "Не удалось запустить. См. $LOG_DIR/stdout.log" >&2 + rm -f "$PID_FILE" + exit 1 + fi + ;; +esac diff --git a/docs/apps/joplin/scripts/joplin-webdav-status.sh b/docs/apps/joplin/scripts/joplin-webdav-status.sh new file mode 100755 index 0000000..262e7b5 --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-webdav-status.sh @@ -0,0 +1,73 @@ +#!/bin/sh +CONFIG="${JOPLIN_WEBDAV_CONFIG:-$HOME/.config/joplin-webdav/env}" +PID_FILE="$HOME/.config/joplin-webdav/rclone.pid" +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd) + +echo "=== WebDAV Joplin ===" +if [ -f "$CONFIG" ]; then + # shellcheck disable=SC1090 + . "$CONFIG" + echo "Пользователь: ${JOPLIN_WEBDAV_USER:-?}" + echo "Порт: ${JOPLIN_WEBDAV_PORT:-8080}" + echo "Папка: ${JOPLIN_WEBDAV_ROOT:-$HOME/JoplinSync}" +else + echo "Конфиг не найден: $CONFIG" +fi + +echo "" +echo "=== Процесс ===" +if pgrep -f "rclone serve webdav" >/dev/null 2>&1; then + pgrep -lf "rclone serve webdav" 2>/dev/null || true +else + echo "Не запущен → ./docs/apps/joplin/scripts/joplin-webdav-serve.sh" +fi + +port="${JOPLIN_WEBDAV_PORT:-8080}" + +echo "" +echo "=== URL для телефона (Android-хотспот) ===" +if [ -x "$SCRIPT_DIR/joplin-hotspot-alias.sh" ]; then + "$SCRIPT_DIR/joplin-hotspot-alias.sh" status +else + echo "(нет joplin-hotspot-alias.sh)" +fi + +echo "" +echo "=== mDNS (.local) — с телефона НЕ работает ===" +if [ -x "$SCRIPT_DIR/joplin-mdns-setup.sh" ]; then + host="$(scutil --get LocalHostName 2>/dev/null | tr '[:upper:]' '[:lower:]' || echo '?')" + echo "http://${host}.local:${port} — только Mac/Windows; Android-хотспот не резолвит" +fi + +echo "" +echo "=== IP Mac (DHCP, справочно) ===" +ip=$(ipconfig getifaddr en0 2>/dev/null || true) +[ -n "$ip" ] && echo "primary en0: $ip" || echo "нет IP" + +echo "" +echo "=== Порт :8080 ===" +lsof -nP -iTCP:"$port" -sTCP:LISTEN 2>/dev/null || echo "не слушает" + +echo "" +echo "=== URL в Joplin (Mac) ===" +settings="$HOME/.config/joplin-desktop/settings.json" +if [ -f "$settings" ]; then + grep -o '"sync\.6\.path": *"[^"]*"' "$settings" 2>/dev/null | sed 's/.*"\(http[^"]*\)".*/\1/' \ + | while read -r u; do echo "settings.json: $u"; done +fi + +echo "" +echo "=== rclone (запросы с телефона?) ===" +log="$HOME/Library/Logs/joplin-webdav/rclone.log" +if [ -f "$log" ]; then + phone_lines=$(grep -E 'from 10\.|from 192\.168\.' "$log" 2>/dev/null | tail -3) + if [ -n "$phone_lines" ]; then + echo "$phone_lines" + else + echo "нет запросов с LAN (только 127.0.0.1?) — телефон не достучался" + fi +fi + +echo "" +echo "=== Учётка ===" +[ -f "$CONFIG" ] && echo "Пароль: $CONFIG → JOPLIN_WEBDAV_PASS" diff --git a/docs/apps/joplin/scripts/joplin-webdav-stop.sh b/docs/apps/joplin/scripts/joplin-webdav-stop.sh new file mode 100755 index 0000000..ca40d04 --- /dev/null +++ b/docs/apps/joplin/scripts/joplin-webdav-stop.sh @@ -0,0 +1,18 @@ +#!/bin/sh +PID_FILE="$HOME/.config/joplin-webdav/rclone.pid" + +if [ ! -f "$PID_FILE" ]; then + echo "WebDAV не запущен (нет $PID_FILE)" + exit 0 +fi + +pid=$(cat "$PID_FILE") +if kill -0 "$pid" 2>/dev/null; then + kill "$pid" 2>/dev/null || true + sleep 1 + kill -9 "$pid" 2>/dev/null || true + echo "Остановлен (PID $pid)" +else + echo "Процесс $pid уже не работает" +fi +rm -f "$PID_FILE" diff --git a/docs/connectivity/HOTSPOT_NETWORK_EMERGENCY.md b/docs/connectivity/HOTSPOT_NETWORK_EMERGENCY.md index 3afa3c1..791a954 100644 --- a/docs/connectivity/HOTSPOT_NETWORK_EMERGENCY.md +++ b/docs/connectivity/HOTSPOT_NETWORK_EMERGENCY.md @@ -1,111 +1,110 @@ -# Emergency: сеть после смены хотспота (macOS) - -Симптом: **отключили Mac от Wi‑Fi / переподключились к другому хотспоту — «интернета нет», помогает только перезагрузка.** - -Документ описывает **проверенную на машине причину** в вашей конфигурации, **ручное восстановление без перезагрузки** и **скрипт** из репозитория. +# Emergency: сеть после переподключения хотспота (macOS) --- -## Причина (точная по конфигурации) +## Одна команда (из любой папки) -На macOS в **Системных настройках → Сеть → Wi‑Fi → Подробнее → Прокси** часто включён **автоматический прокси (PAC)** с URL вида **`http://localhost:1089/proxy.pac`** (см. [PROXY_GUIDE.md](./PROXY_GUIDE.md) → раздел про системный PAC). +```bash +bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover +``` -Проверка на рабочей машине (2026): **PAC для сервиса Wi‑Fi включён (Enabled: Yes)**, при этом **на порту 1089 нет процесса**, который отдаёт `proxy.pac` — соединение к `127.0.0.1:1089` отклоняется. +Запросит **пароль sudo**, затем: PAC/SOCKS off → **DHCP** → `ifconfig down` → **`route -n flush`** → DNS → DHCP → **Joplin alias `*.100`**. -В таком состоянии: +Диагностика: -1. Система и часть приложений **сначала** должны получить PAC с localhost; при недоступном URL поведение **нестабильно** (часть трафика «в никуда», таймауты). -2. При **смене хотспота** меняются шлюз, DNS, часто появляется **captive portal**; страница входа может **не открыться**, пока PAC мешает или DNS закеширован со старой сети. -3. **Перезагрузка** «лечит», потому что заново поднимаются **configd**, **mDNSResponder**, порядок инициализации Wi‑Fi и иногда снова стартует локальный PAC‑сервер (Clash / Surge / свой сервис на 1089). - -Дополнительные усилители сбоя (проверять при `status`): - -- **Системный SOCKS** на `127.0.0.1:1080` (Shadowsocks и т.д.) — если включён, а клиент не слушает порт, трафик через системный прокси тоже падает. -- **VPN / туннели** с политикой «весь трафик» — после смены сети маршруты могут остаться битые до отключения VPN. - -**SOCKS Telegram (1081) и SSH‑туннели сами по себе не отключают Wi‑Fi** — они приложенческие. Проблема класса «всё мёртво до ребута» у вас с высокой вероятностью — **системный PAC/SOCKS на localhost без живого сервиса + кэш DNS / состояние Wi‑Fi**. +```bash +bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh status +``` --- -## Быстро: один скрипт (рекомендуется) +## RCA (почему старый `recover` не помогал) -Из корня репозитория `local_machine`: +### 1. Ядерный сброс не выполнялся -```bash -chmod +x ./docs/connectivity/scripts/macos-hotspot-network-recover.sh -./docs/connectivity/scripts/macos-hotspot-network-recover.sh status -./docs/connectivity/scripts/macos-hotspot-network-recover.sh recover +Скрипт проверял `sudo -n` (passwordless). Без NOPASSWD в sudoers он **пропускал** `route flush` и делал только toggle Wi‑Fi — **недостаточно** при ARP `REJECT`. + +Ручная «ядерная кнопка» работала, потому что вы вводили пароль и реально сбрасывали маршруты. + +**Исправлено:** `recover` всегда вызывает `sudo` с запросом пароля. + +### 2. Manual IPv4 на Wi‑Fi (Joplin) ломал маршрут + +`/var/log/wifi.log` при reconnect: + +``` +IP Address: 10.219.227.100 +Default Gateway IP Address: 10.219.227.39 +No Router MAC Address +ROUTER_MAC_ADDR = 0x000000000000 ``` -`recover` делает: **выключает PAC** (те же сервисы, что и `macos-system-pac.sh`), **выключает системный SOCKS на Wi‑Fi**, по возможности **сбрасывает DNS** и **кратко перезапускает Wi‑Fi** и DHCP. +В prefs оставался шлюз `10.219.227.39`, хотспот уже в `10.36.136.x` → `ping` → `Host is down`, `curl` мёртв. -Если скрипт пишет, что нет `sudo` без пароля — выполните вручную команды из раздела «Вручную» ниже. +**Исправлено:** Wi‑Fi **только DHCP**; Joplin — **alias** `<подсеть>.100` на `en0` (не трогает default route). См. [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md). -После появления интернета, если вам снова нужен PAC: +### 3. PAC / SOCKS (вторично) -```bash -./docs/connectivity/scripts/macos-pac-on.sh -``` - -Только **после** того как процесс на **1089** реально запущен и отдаёт `proxy.pac`. +PAC на `:1089` без сервера усиливает сбои, но **не объясняет** `ping 8.8.8.8 → No route to host`. --- -## Вручную (без скрипта) +## Что делает `recover` сейчас -### 1. Отключить автоматический PAC +| Шаг | Действие | +|-----|----------| +| 1 | PAC off | +| 2 | SOCKS off | +| 3 | `networksetup -setdhcp Wi-Fi` (снимает Manual) | +| 4 | `sudo ifconfig en0 down` | +| 5 | `sudo route -n flush` | +| 6 | DNS flush + `ifconfig up` + `ipconfig DHCP` | +| 7 | Ждёт gateway (до 30 с) | +| 8 | `ifconfig en0 alias .100` для Joplin | -**GUI:** Системные настройки → Сеть → Wi‑Fi → Подробнее → Прокси → снять **«Автоматическая настройка прокси (PAC)»**. +--- -**CLI** (из репо): - -```bash -./docs/connectivity/scripts/macos-pac-off.sh -./docs/connectivity/scripts/macos-system-pac.sh status -``` - -### 2. Отключить системный SOCKS (если включали для Shadowsocks) - -```bash -networksetup -setsocksfirewallproxystate "Wi-Fi" off -networksetup -getsocksfirewallproxy "Wi-Fi" -``` - -### 3. Сброс DNS +## Ядерная кнопка (если скрипт недоступен) ```bash +sudo networksetup -setdhcp "Wi-Fi" +sudo ifconfig en0 down +sudo route -n flush sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder -``` - -### 4. Обновить DHCP и «пнуть» Wi‑Fi - -Узнать интерфейс Wi‑Fi (часто `en0`): - -```bash -networksetup -listallhardwareports | sed -n '/Hardware Port: Wi-Fi/,/Ethernet Address/p' -``` - -Дальше (подставьте свой `Device`, например `en0`): - -```bash +sudo ifconfig en0 up sudo ipconfig set en0 DHCP -networksetup -setairportpower en0 off -sleep 2 -networksetup -setairportpower en0 on +bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover ``` -### 5. Captive portal - -Откройте в браузере **`http://captive.apple.com`** или **`http://neverssl.com`** — должна открыться страница входа в сеть отели/кафе. - --- -## Профилактика (архитектурно) +## Диагностика -1. **Не держать PAC включённым**, если сервис на **1089** не запущен: сначала поднять Clash/Surge/свой HTTP‑сервер с PAC, **затем** `macos-pac-on.sh`. -2. Перед подключением к **чужому хотспоту** с обязательной страницей входа — **временно PAC off** (`macos-pac-off.sh`), залогиниться в сеть, затем при необходимости снова **on**. -3. Разнести роли: **глобальный PAC** — только когда стабильно есть локальный конфиг‑сервер; для «чистого» интернета в дороге — **PAC выключен**, прокси только в приложениях (Telegram SOCKS **1081**, Cursor **10809** и т.д.) — см. [TELEGRAM_GUIDE.md](./TELEGRAM_GUIDE.md), [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md). +```bash +networksetup -getinfo "Wi-Fi" +ifconfig en0 | grep inet +route -n get default +bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh status +./docs/apps/joplin/scripts/joplin-webdav-status.sh +grep -E 'Router MAC|No Router' /var/log/wifi.log | tail -5 +``` + +| Признак | Причина | +|---------|---------| +| Manual + другая подсеть в gateway | Старый Joplin static | +| `No Router MAC` в wifi.log | ARP на шлюз не прошёл | +| `REJECT` в route get gateway | Нужен route flush | +| Primary DHCP OK, нет `*.100` alias | Запустить `recover` | + +--- + +## Профилактика + +1. **Не** использовать Manual Wi‑Fi для Joplin — только DHCP + alias. +2. После **каждого** reconnect: одна команда `recover` выше. +3. PAC on — только если на **1089** слушает сервер. +4. `exit-via-ru-do.sh` — **после** рабочего `curl https://1.1.1.1`. --- @@ -113,10 +112,6 @@ networksetup -setairportpower en0 on | Документ | Зачем | |----------|--------| -| [PROXY_GUIDE.md](./PROXY_GUIDE.md) | Системный PAC, порты, скрипты `macos-pac-*.sh` | -| [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md) | SSH, SOCKS 1081, прод | -| [README.md](./README.md) | Оглавление `connectivity/` | - ---- - -*Если после `recover` сеть всё ещё мёртвая — проверьте аппаратный тумблер Wi‑Fi, другое SSID, и логи: Консоль → `Wi-Fi` / `configd`.* +| [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md) | DHCP + alias | +| [PROXY_EMERGENCY.md](./PROXY_EMERGENCY.md) | SSH / SOCKS | +| [README.md](./README.md) | Оглавление | diff --git a/docs/connectivity/PROXY_EMERGENCY.md b/docs/connectivity/PROXY_EMERGENCY.md index a9afb25..b7f785e 100644 --- a/docs/connectivity/PROXY_EMERGENCY.md +++ b/docs/connectivity/PROXY_EMERGENCY.md @@ -2,7 +2,7 @@ Одна страница на случай, когда «всё слетело». Полная схема, безопасность и нюансы `~/.ssh/config`: [PROXY_GUIDE.md](./PROXY_GUIDE.md). -**Сеть / хотспот (интернет есть только после перезагрузки):** чаще всего системный **PAC на localhost:1089** без живого сервера или системный SOCKS на **1080**. Пошагово: **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)**. +**Сеть / хотспот (интернет есть только после перезагрузки):** чаще всего **Manual IPv4 на Wi‑Fi (Joplin)** при смене подсети Android + битые маршруты; также PAC **1089** / SOCKS **1080** без клиента. Пошагово: **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)**. --- diff --git a/docs/connectivity/README.md b/docs/connectivity/README.md index 796acf1..ead12ea 100644 --- a/docs/connectivity/README.md +++ b/docs/connectivity/README.md @@ -14,7 +14,9 @@ | **[BUILD_AAB_FROM_RUSSIA_GUIDE.md](./BUILD_AAB_FROM_RUSSIA_GUIDE.md)** | Сборка AAB/APK из России: Maven proxy на проде + SSH-туннель | | **[WINDOWS_CURSOR_TUNNEL.md](./WINDOWS_CURSOR_TUNNEL.md)** | Cursor из РФ на **Windows**: туннель через прокси, скрипт .ps1, автозапуск | | **[WINDOWS_SSH_KEY_INSTALL.md](./WINDOWS_SSH_KEY_INSTALL.md)** | Установка SSH-ключа на Windows (один файл `setup-ssh-key-for-proxy.ps1`, только для туннеля) | -| **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)** | Сеть после смены хотспота: причина (PAC localhost), ручной сброс без ребута, `macos-hotspot-network-recover.sh` | +| **[HOTSPOT_NETWORK_EMERGENCY.md](./HOTSPOT_NETWORK_EMERGENCY.md)** | Сеть после reconnect хотспота: Joplin Manual IP + смена подсети Android, route flush, PAC; `macos-hotspot-network-recover.sh` | +| **[apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md)** | Joplin: стабильный URL на телефоне (статический IP Mac на Android-хотспоте) | +| **[apps/joplin/RUNBOOK.md](./apps/joplin/RUNBOOK.md)** | Joplin Mac ↔ телефон: диагностика, ETIMEDOUT/401, логи | | **[scripts/](./scripts/)** | Скрипты для туннелей и локальной работы | | **[launchd/](./launchd/)** | LaunchAgent для macOS: автозапуск SOCKS-туннеля при входе | @@ -28,6 +30,7 @@ - **Загрузка файлов на прод через прокси** — [PROXY_GUIDE.md → Загрузка файлов на прод (scp)](./PROXY_GUIDE.md#-загрузка-файлов-на-прод-через-туннель-scp) - **Безопасность прокси (nginx, fail2ban)** — [PROXY_GUIDE.md → Безопасность](./PROXY_GUIDE.md#-безопасность), SECURITY.md (если есть в папке) - **Сборка AAB из РФ** — [BUILD_AAB_FROM_RUSSIA_GUIDE.md](./BUILD_AAB_FROM_RUSSIA_GUIDE.md) +- **Joplin: синк Mac ↔ телефон** — настройка [apps/joplin/STABLE_SETUP.md](./apps/joplin/STABLE_SETUP.md), поломки [apps/joplin/RUNBOOK.md](./apps/joplin/RUNBOOK.md), `./docs/apps/joplin/scripts/joplin-webdav-status.sh` --- @@ -36,7 +39,7 @@ | Скрипт | Описание | |--------|----------| | **telegram-socks-tunnel.sh** | SOCKS5 на 1081 для Telegram. `TELEGRAM_SOCKS_VIA_DO=1` — только Mac→RU→DO (`telegram-socks-via-do`); без RU — ошибка. См. PROXY_GUIDE. | -| **macos-hotspot-network-recover.sh** | После смены хотспота: `status` / `recover` (PAC off, SOCKS off на Wi‑Fi, DNS, DHCP, перезапуск радио). См. HOTSPOT_NETWORK_EMERGENCY.md. | +| **macos-hotspot-network-recover.sh** | Reconnect хотспота: `bash …/macos-hotspot-network-recover.sh recover` — DHCP, route flush (sudo), Joplin alias `*.100`. См. HOTSPOT_NETWORK_EMERGENCY.md. | | **ssh-hunab-prod.sh** | Опционально: сначала `hunab-prod-direct`, иначе `hunab-prod` (в конфиге по умолчанию уже через RU). См. PROXY_GUIDE. | --- diff --git a/docs/connectivity/apps/joplin/README.md b/docs/connectivity/apps/joplin/README.md new file mode 100644 index 0000000..71cb6dd --- /dev/null +++ b/docs/connectivity/apps/joplin/README.md @@ -0,0 +1,23 @@ +# Joplin (локальный синк Mac ↔ телефон) + +WebDAV через rclone на Mac, Android-хотспот. + +| Документ | Назначение | +|----------|------------| +| **[STABLE_SETUP.md](./STABLE_SETUP.md)** | Рабочая схема: alias `*.100` | +| **[RUNBOOK.md](./RUNBOOK.md)** | Синк сломался | +| [docs/apps/joplin/scripts/](../../../apps/joplin/scripts/) | Скрипты | + +## URL (Android-хотспот) + +| | | +|---|---| +| Mac | `http://127.0.0.1:8080` | +| Телефон | `http://<подсеть>.100:8080` (см. `joplin-hotspot-alias.sh status`) | + +**Не** `http://*.local:8080` — с телефона-хотспота не работает. + +```bash +./docs/apps/joplin/scripts/joplin-webdav-status.sh +./docs/apps/joplin/scripts/joplin-hotspot-alias.sh status +``` diff --git a/docs/connectivity/apps/joplin/RUNBOOK.md b/docs/connectivity/apps/joplin/RUNBOOK.md new file mode 100644 index 0000000..778f048 --- /dev/null +++ b/docs/connectivity/apps/joplin/RUNBOOK.md @@ -0,0 +1,263 @@ +# Runbook: Joplin — синк Mac ↔ телефон (WebDAV / Android-хотспот) + +Симптом: **синхронизация перестала работать** между Joplin на Mac и на телефоне. + +Стек: **rclone serve webdav** на Mac → `~/JoplinSync` → Joplin (Mac + Android) по HTTP. Облако Joplin не используется. + +**Рабочая схема (2026-06, проверено):** Mac на **DHCP**, alias **`*.100`** на `en0`, телефон → `http://<подсеть>.100:8080`. Подробно: [STABLE_SETUP.md](./STABLE_SETUP.md). + +--- + +## Архитектура + +``` +Телефон (Joplin) ──HTTP──► Mac en0 alias *.100:8080 ──► rclone ──► ~/JoplinSync/ +Mac (Joplin) ──HTTP──► 127.0.0.1:8080 (тот же rclone) +``` + +| Компонент | Путь / имя | +|-----------|------------| +| Данные | `~/JoplinSync` | +| Учётка | `~/.config/joplin-webdav/env` (`600`, не в git) | +| WebDAV | LaunchAgent `com.eternal.joplin-webdav` | +| Alias `*.100` | LaunchAgent `com.eternal.joplin-hotspot-alias` (опционально + sudoers) | +| Лог rclone | `~/Library/Logs/joplin-webdav/rclone.log` | +| Лог alias | `~/Library/Logs/joplin-webdav/alias.log` | +| Лог Joplin Mac | `~/.config/joplin-desktop/log.txt` | +| Настройки Mac | `~/.config/joplin-desktop/settings.json` → `sync.6.path` | + +Скрипты: `docs/apps/joplin/scripts/`. + +--- + +## Шаг 0: диагностика + +```bash +./docs/apps/joplin/scripts/joplin-webdav-status.sh +./docs/apps/joplin/scripts/joplin-hotspot-alias.sh status +``` + +| Что смотреть | OK | Проблема | +|--------------|-----|----------| +| rclone / `:8080` | процесс слушает | `joplin-webdav-serve.sh` или `joplin-webdav-install.sh` | +| `alias: OK` | `*.100` на en0 | `joplin-hotspot-alias.sh ensure` (sudo) | +| rclone.log | `from 10.` или `from 192.` | только `127.0.0.1` — телефон не достучался | +| Mac URL | `127.0.0.1:8080` | настроить WebDAV на Mac | + +--- + +## Правильные URL + +### Android раздаёт хотспот, Mac — клиент Wi‑Fi (основной сценарий) + +| Устройство | WebDAV URL | +|------------|------------| +| **Mac** | `http://127.0.0.1:8080` | +| **Телефон** | `http://<подсеть>.100:8080` — сейчас часто `http://10.74.21.100:8080` | + +Узнать актуальный URL: + +```bash +./docs/apps/joplin/scripts/joplin-hotspot-alias.sh status +# или +grep JOPLIN_PHONE_URL ~/.config/joplin-webdav/env +``` + +**Не использовать на телефоне:** + +| URL | Почему | +|-----|--------| +| `http://eternals.local:8080` | Android-хотспот **не резолвит** `.local` клиентов; в rclone.log нет запросов с телефона | +| `http://10.219.227.100:8080` | старая подсеть, если хотспот уже выдал `10.74.x` | +| `http://10.x.x.84:8080` (primary DHCP) | IP меняется при reconnect | + +### Общее для Joplin + +- Логин: `joplin` +- Пароль: `JOPLIN_WEBDAV_PASS` из env +- **Без** `/` в конце URL +- **Без пробела** в конце +- `http://`, не `https://` +- **Настройки → Синхронизация → Self-hosting → WebDAV** (не «Прокси») + +После смены URL на Mac: **Quit Joplin** → открыть снова → **Синхронизировать**. + +--- + +## Симптом → причина → действие + +### 1. «Синк OK, заметок нет на Mac» + +Mac Joplin не на WebDAV — в `~/JoplinSync` только данные с телефона. + +→ URL `http://127.0.0.1:8080`, проверить конфигурацию, синк. + +--- + +### 2. `ETIMEDOUT` / `connect ETIMEDOUT 10.x.x.x:8080` + +**Причина:** на телефоне **устаревший IP** (другая подсеть или нет alias `.100`). + +**Признаки:** Joplin `ETIMEDOUT`; rclone — нет свежих `GET`/`PUT` с `10.`. + +**Действие:** + +```bash +./docs/apps/joplin/scripts/joplin-hotspot-alias.sh ensure # sudo +./docs/apps/joplin/scripts/joplin-hotspot-alias.sh status # новый URL +``` + +→ Обновить URL на телефоне **только если сменилась подсеть** (`10.219` → `10.74`). + +--- + +### 3. `401 Unauthorized` + +Пароль в Joplin ≠ env, или rclone не перезапущен. + +```bash +grep JOPLIN_WEBDAV_PASS ~/.config/joplin-webdav/env +./docs/apps/joplin/scripts/joplin-webdav-reload.sh +``` + +--- + +### 4. `Not a valid URL: …/info.json` + +Пробел в конце URL в настройках Joplin → переписать URL. + +--- + +### 5. Порт 8080 не слушает + +```bash +./docs/apps/joplin/scripts/joplin-webdav-status.sh +./docs/apps/joplin/scripts/joplin-webdav-serve.sh +``` + +Лог: `~/Library/Logs/joplin-webdav/launchd.err.log`. + +--- + +### 6. `ECONNREFUSED` / телефон «не достаёт», Mac — да + +**Причина:** alias **`*.100` отсутствует** на `en0` (слетел после reconnect). + +```bash +ifconfig en0 | grep inet +./docs/apps/joplin/scripts/joplin-hotspot-alias.sh status +curl -s -o /dev/null -w '%{http_code}\n' http://10.74.21.100:8080/ # подставьте *.100 из status +``` + +→ `joplin-hotspot-alias.sh ensure` +→ В браузере **на телефоне**: `http://.100:8080` — запрос логина +→ Нет интернета на Mac: [HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md) + +--- + +### 7. `eternals.local` / `*.local` не работает с телефона + +**Ожидаемо.** mDNS на Mac резолвится, Android-хотспот — нет. Использовать **`http://.100:8080`**, не `.local`. + +--- + +## Процедура: переподключили хотспот / сменили Wi‑Fi + +### 1. Интернет на Mac + +Если `curl` / браузер мёртвы: + +```bash +bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover +``` + +Wi‑Fi должен быть **DHCP**, не Manual ([HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md)). + +### 2. Joplin + +```bash +./docs/apps/joplin/scripts/joplin-webdav-status.sh +./docs/apps/joplin/scripts/joplin-hotspot-alias.sh ensure # если alias MISSING +``` + +Чеклист: + +- [ ] rclone слушает `:8080` +- [ ] `alias: OK` (или `ensure` выполнен) +- [ ] **Mac:** `http://127.0.0.1:8080` — без изменений +- [ ] **Телефон:** URL из `status` — **не менять**, если подсеть та же (`10.74.21.x`) +- [ ] Подсеть **сменилась** → один раз новый `http://.100:8080` +- [ ] В rclone.log появились `from 10.` после синка на телефоне + +### 3. Авто-alias (рекомендуется один раз) + +```bash +bash ./docs/apps/joplin/scripts/joplin-android-hotspot-setup.sh install +bash ./docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh +``` + +LaunchAgent поднимает `*.100` каждые 60 с после reconnect. + +--- + +## Скрипты + +| Скрипт | Когда | +|--------|--------| +| `joplin-webdav-status.sh` | Первая диагностика | +| `joplin-hotspot-alias.sh status\|ensure` | URL телефона, поднять alias | +| `joplin-android-hotspot-setup.sh install` | Полная настройка хотспота | +| `joplin-hotspot-alias-install-sudo.sh` | Alias без пароля (LaunchAgent) | +| `joplin-webdav-install.sh` | Первая установка rclone + launchd | +| `joplin-webdav-reload.sh` | После смены пароля в env | +| `joplin-mdns-setup.sh` | Справочно; **не для URL на телефоне-хотспоте** | + +Путь: `docs/apps/joplin/scripts/`. + +--- + +## Логи + +**rclone.log** — успех: `PROPFIND`, `GET`, `PUT from `. Телефон часто виден как IP **шлюза** (`10.74.21.61`), не IP Mac — нормально для Android. + +**log.txt Mac:** + +```bash +grep -E 'Synchronizer: \[error\]|ETIMEDOUT|ECONNREFUSED|Unauthorized|Not a valid URL' \ + ~/.config/joplin-desktop/log.txt | tail -20 +``` + +--- + +## Безопасность + +- WebDAV только в LAN (`0.0.0.0:8080` пока rclone работает); не пробрасывать в интернет. +- env и пароль — не в git. + +--- + +## Связанные документы + +| Документ | Зачем | +|----------|--------| +| [STABLE_SETUP.md](./STABLE_SETUP.md) | Схема alias `*.100`, установка | +| [README.md](./README.md) | Оглавление | +| [docs/apps/joplin/README.md](../../../apps/joplin/README.md) | Установка с нуля | +| [HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md) | Сеть macOS после reconnect | + +--- + +## История инцидентов + +| Дата | Симптом | Корень | Фикс | +|------|---------|--------|------| +| 2026-06-02 | 401 | Пароль env ≠ Joplin | `joplin-webdav-reload.sh` | +| 2026-06-08 | ETIMEDOUT | Старый IP на телефоне | Обновить URL | +| 2026-06-09 | Телефон не достаёт `.100` | Mac без alias | `joplin-hotspot-alias ensure` | +| 2026-06-15 | Нет интернета после reconnect | Manual Wi‑Fi + битые маршруты | `macos-hotspot-network-recover.sh recover`, DHCP | +| 2026-06-19 | `eternals.local` не работает | Android-хотспот не резолвит mDNS клиентов | URL `http://10.74.21.100:8080` + alias | +| 2026-06-19 | Синк OK | alias `.100` + LaunchAgent | [STABLE_SETUP.md](./STABLE_SETUP.md) | + +--- + +*Актуальный URL телефона: `./docs/apps/joplin/scripts/joplin-hotspot-alias.sh status`.* diff --git a/docs/connectivity/apps/joplin/STABLE_SETUP.md b/docs/connectivity/apps/joplin/STABLE_SETUP.md new file mode 100644 index 0000000..520de77 --- /dev/null +++ b/docs/connectivity/apps/joplin/STABLE_SETUP.md @@ -0,0 +1,55 @@ +# Стабильная настройка: Android-хотспот + Mac + Joplin + +--- + +## Важно: `.local` с телефона **не работает** + +`http://eternals.local:8080` резолвится на **Mac**, но **Android, раздающий хотспот, не умеет** резолвить `.local` имён **подключённых** клиентов (Mac). Запросы до rclone не доходят. + +**Рабочая схема:** alias **`*.100`** на `en0` + URL `http://<подсеть>.100:8080`. + +| Устройство | URL | +|------------|-----| +| Mac | `http://127.0.0.1:8080` | +| Телефон | `http://10.74.21.100:8080` (подсеть меняется → см. ниже) | + +--- + +## Установка (один раз) + +```bash +./docs/apps/joplin/scripts/joplin-webdav-install.sh +bash ./docs/apps/joplin/scripts/joplin-android-hotspot-setup.sh install +``` + +На телефоне — URL из вывода (`joplin-hotspot-alias.sh status`). + +Автоподнятие alias после reconnect: + +```bash +./docs/apps/joplin/scripts/joplin-hotspot-alias-install-sudo.sh # sudoers, без пароля +``` + +--- + +## После reconnect + +1. Alias поднимается LaunchAgent (если sudoers установлен) +2. Проверка: `./docs/apps/joplin/scripts/joplin-webdav-status.sh` +3. Если подсеть **та же** (`10.74.21.x`) — URL на телефоне **не менять** +4. Если подсеть **сменилась** (`10.219` → `10.74`) — **один раз** новый URL из `status` + +Интернет пропал: `bash .../macos-hotspot-network-recover.sh recover` + +--- + +## Почему URL иногда меняется + +Android выдаёт **разные подсети** (`10.219.227.x`, `10.74.21.x`). Без Tailscale/VPN **нельзя** иметь один HTTP-URL при любой подсети с телефона-хотспота. Фиксированный **хвост `.100`** + автоподнятие alias минимизируют ручную работу. + +--- + +## Связанное + +- [RUNBOOK.md](./RUNBOOK.md) +- [HOTSPOT_NETWORK_EMERGENCY.md](../../HOTSPOT_NETWORK_EMERGENCY.md) diff --git a/docs/connectivity/scripts/macos-hotspot-network-recover.sh b/docs/connectivity/scripts/macos-hotspot-network-recover.sh index 69c6150..e1a85a0 100755 --- a/docs/connectivity/scripts/macos-hotspot-network-recover.sh +++ b/docs/connectivity/scripts/macos-hotspot-network-recover.sh @@ -1,32 +1,244 @@ #!/bin/sh -# Сброс сетевого стека macOS после смены хотспота / «интернет не поднимается без перезагрузки». -# Типичная причина в связке с docs/connectivity: системный PAC на localhost:1089 при мёртвом/ещё не -# поднятом PAC-сервере + кэш DNS / Wi‑Fi. См. HOTSPOT_NETWORK_EMERGENCY.md +# Сброс сети после переподключения Android-хотспота (macOS). # -# Использование (из корня репозитория): -# ./docs/connectivity/scripts/macos-hotspot-network-recover.sh status -# ./docs/connectivity/scripts/macos-hotspot-network-recover.sh recover +# RCA (почему старый recover не помогал): +# - Ядерный сброс (route flush, ifconfig down) выполнялся только при sudo -n (passwordless). +# - Без NOPASSWD в sudoers скрипт делал лишь toggle Wi‑Fi — ARP REJECT и битые маршруты оставались. +# - Manual IPv4 на Wi‑Fi (Joplin 10.219.227.100) конфликтует с новой подсетью хотспота (10.36.x). +# +# Решение: +# - Wi‑Fi всегда DHCP (правильный шлюз после reconnect). +# - Joplin: вторичный IP (alias) *.100 в текущей подсети — не трогает default route. +# - recover всегда запрашивает sudo (пароль) для полного сброса. +# +# Из любой папки (одна команда, чинит интернет + Joplin alias): +# bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover # # Переменные: -# MACOS_PAC_SERVICES — как в macos-system-pac.sh (по умолчанию Wi-Fi|Thunderbolt Bridge 2) -# WIFI_DEVICE — например en0; иначе авто: первый Device у Hardware Port: Wi-Fi +# HOTSPOT_JOPLIN_MODE=alias|manual|off alias (по умолчанию при ~/.config/joplin-webdav/env), manual, off +# HOTSPOT_RECOVER_SKIP_JOPLIN=1 не трогать Joplin alias +# JOPLIN_STATIC_IP последний октет .100 из env; подсеть — текущая +# MACOS_PAC_SERVICES, WIFI_DEVICE -set -e ROOT="$(cd "$(dirname "$0")" && pwd)" PAC_SCRIPT="$ROOT/macos-system-pac.sh" +JOPLIN_ENV="${JOPLIN_WEBDAV_CONFIG:-$HOME/.config/joplin-webdav/env}" +JOPLIN_ALIAS_SCRIPT="${JOPLIN_ALIAS_SCRIPT:-$(cd "$ROOT/../../apps/joplin/scripts" 2>/dev/null && pwd)/joplin-hotspot-alias.sh}" +SCRIPT_SELF="$ROOT/$(basename "$0")" wifi_device() { if [ -n "${WIFI_DEVICE:-}" ]; then printf '%s\n' "$WIFI_DEVICE" return fi - # "Device: en0" под блоком "Hardware Port: Wi-Fi" networksetup -listallhardwareports 2>/dev/null \ | awk '/Hardware Port: Wi-Fi$/ {p=1; next} p && /^Device: / {print $2; exit}' } +ipv4_subnet() { + printf '%s\n' "$1" | awk -F. '{print $1"."$2"."$3}' +} + +ipv4_last_octet() { + printf '%s\n' "$1" | awk -F. '{print $4}' +} + +load_joplin_env() { + if [ -f "$JOPLIN_ENV" ]; then + # shellcheck disable=SC1090 + . "$JOPLIN_ENV" + fi +} + +wifi_config_method() { + networksetup -getinfo "Wi-Fi" 2>/dev/null | awk 'NR==1 {print $1; exit}' +} + +wifi_manual_router() { + networksetup -getinfo "Wi-Fi" 2>/dev/null | awk -F': ' '/^Router: / {print $2; exit}' +} + +wifi_manual_ip() { + networksetup -getinfo "Wi-Fi" 2>/dev/null | awk -F': ' '/^IP address: / {print $2; exit}' +} + +default_gateway() { + route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}' +} + +joplin_mode() { + if [ "${HOTSPOT_RECOVER_SKIP_JOPLIN:-0}" = "1" ]; then + echo off + return + fi + if [ -n "${HOTSPOT_JOPLIN_MODE:-}" ]; then + echo "$HOTSPOT_JOPLIN_MODE" + return + fi + # mDNS (joplin-mac.local) — URL на телефоне не зависит от подсети; alias не нужен + echo off +} + +joplin_target_ip() { + load_joplin_env + gw="$(default_gateway 2>/dev/null || true)" + [ -n "$gw" ] || return 1 + subnet="$(ipv4_subnet "$gw")" + if [ -n "${JOPLIN_STATIC_IP:-}" ]; then + last="$(ipv4_last_octet "$JOPLIN_STATIC_IP")" + else + last=100 + fi + printf '%s\n' "${subnet}.${last}" +} + +list_en0_alias_ips() { + dev="${1:-en0}" + ifconfig "$dev" 2>/dev/null | awk '/inet / && /alias/ {print $2}' +} + +sudo_run() { + echo " \$ sudo $*" + sudo "$@" +} + +ensure_dhcp_wifi() { + method="$(wifi_config_method 2>/dev/null || true)" + if [ "$method" = "Manual" ]; then + echo " Wi‑Fi Manual $(wifi_manual_ip) → $(wifi_manual_router) — переводим на DHCP..." + networksetup -setdhcp "Wi-Fi" 2>/dev/null || sudo_run networksetup -setdhcp "Wi-Fi" + else + echo " Wi‑Fi уже DHCP (или не Manual)." + fi +} + +nuclear_network_reset() { + dev="$1" + echo " Ядерный сброс на $dev (нужен пароль sudo)..." + sudo_run ifconfig "$dev" down + sudo_run route -n flush + sudo_run dscacheutil -flushcache + sudo_run killall -HUP mDNSResponder + sudo_run ifconfig "$dev" up + sudo_run ipconfig set "$dev" DHCP +} + +wait_for_connectivity() { + dev="$1" + i=0 + while [ "$i" -lt 30 ]; do + gw="$(default_gateway 2>/dev/null || true)" + ip="$(ipconfig getifaddr "$dev" 2>/dev/null || true)" + if [ -n "$gw" ] && [ -n "$ip" ]; then + if ping -c 1 -W 1500 "$gw" >/dev/null 2>&1; then + echo " Связность OK: IP=$ip gateway=$gw (${i}s)" + return 0 + fi + fi + sleep 1 + i=$((i + 1)) + done + echo " WARN: gateway/IP не поднялись за 30с — проверьте captive portal" >&2 + return 1 +} + +remove_joplin_aliases() { + dev="$1" + target="$2" + for ip in $(list_en0_alias_ips "$dev"); do + case "$ip" in + *.*.*.100|"$target") + echo " Удаляем alias $ip на $dev" + sudo_run ifconfig "$dev" inet "$ip" -alias 2>/dev/null || true + ;; + esac + done +} + +setup_joplin_alias() { + dev="$1" + target="$(joplin_target_ip 2>/dev/null || true)" + [ -n "$target" ] || { echo " Joplin alias: нет gateway" >&2; return 1; } + primary="$(ipconfig getifaddr "$dev" 2>/dev/null || true)" + if [ "$primary" = "$target" ]; then + echo " Joplin: primary IP уже $target" + return 0 + fi + remove_joplin_aliases "$dev" "$target" + if ifconfig "$dev" 2>/dev/null | grep -q "inet $target "; then + echo " Joplin alias $target уже на $dev" + return 0 + fi + echo " Joplin alias: $target/24 на $dev (primary DHCP: ${primary:-?})" + sudo_run ifconfig "$dev" inet "$target" netmask 255.255.255.0 alias + echo " URL на телефоне: http://${target}:8080" + if [ -f "$JOPLIN_ENV" ] && [ -n "${JOPLIN_STATIC_IP:-}" ]; then + cur_sub="$(ipv4_subnet "$target")" + env_sub="$(ipv4_subnet "$JOPLIN_STATIC_IP")" + if [ "$cur_sub" != "$env_sub" ]; then + echo " ⚠ Подсеть сменилась ($env_sub.x → $cur_sub.x) — обновите URL в Joplin на телефоне" + fi + fi +} + +setup_joplin_manual() { + gw="$(default_gateway 2>/dev/null || true)" + [ -n "$gw" ] || return 1 + target="$(joplin_target_ip 2>/dev/null || true)" + echo " Joplin manual (legacy): $target → router $gw" + networksetup -setmanual "Wi-Fi" "$target" 255.255.255.0 "$gw" +} + +print_manual_ipv4_status() { + info="$(networksetup -getinfo "Wi-Fi" 2>/dev/null || true)" + echo "$info" | head -5 + method="$(printf '%s\n' "$info" | awk 'NR==1 {print $1; exit}')" + dev="$(wifi_device 2>/dev/null || echo en0)" + current_ip="$(ipconfig getifaddr "$dev" 2>/dev/null || true)" + gw="$(default_gateway 2>/dev/null || true)" + echo "--- runtime $dev ---" + echo "primary IP: ${current_ip:-(none)}" + echo "default gateway: ${gw:-(none)}" + aliases="$(list_en0_alias_ips "$dev" | tr '\n' ' ')" + if [ -n "$aliases" ]; then + echo "aliases: $aliases" + fi + if [ -f "$JOPLIN_ENV" ]; then + target="$(joplin_target_ip 2>/dev/null || true)" + echo "joplin target: ${target:-?} (mode: $(joplin_mode))" + if [ -n "$target" ] && ! ifconfig "$dev" 2>/dev/null | grep -q "inet $target "; then + echo "⚠ Joplin IP $target не на интерфейсе — телефон не достучится" + fi + fi + if [ "$method" = "Manual" ]; then + manual_ip="$(printf '%s\n' "$info" | awk -F': ' '/^IP address: / {print $2; exit}')" + manual_router="$(printf '%s\n' "$info" | awk -F': ' '/^Router: / {print $2; exit}')" + if [ -n "$manual_router" ] && [ -n "$gw" ]; then + if [ "$(ipv4_subnet "$manual_router")" != "$(ipv4_subnet "$gw")" ]; then + echo "⚠ MISMATCH: Manual router $(ipv4_subnet "$manual_router").x vs gateway $(ipv4_subnet "$gw").x" + echo " → запустите: bash $SCRIPT_SELF recover" + elif [ -n "$current_ip" ] && [ "$current_ip" != "$manual_ip" ]; then + echo "⚠ MISMATCH: Manual IP $manual_ip, runtime $current_ip" + fi + fi + fi + if [ -n "$gw" ]; then + echo "--- gateway $gw ---" + arp -n "$gw" 2>/dev/null || true + route -n get "$gw" 2>/dev/null | grep -E 'interface|flags' || true + fi +} + usage() { - printf '%s\n' "Usage: $(basename "$0") status|recover" >&2 + cat </dev/null | head -15 || true - echo "=== PAC / autoproxy (Wi-Fi + Thunderbolt Bridge 2 if present) ===" + echo "=== IPv4 ===" + print_manual_ipv4_status || true + echo "=== PAC ===" if [ -x "$PAC_SCRIPT" ]; then MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" status || true fi - echo "=== SOCKS firewall (Wi-Fi) ===" + echo "=== SOCKS (Wi-Fi) ===" networksetup -getsocksfirewallproxy "Wi-Fi" 2>/dev/null || true - echo "=== Web proxy (Wi-Fi) ===" - networksetup -getwebproxy "Wi-Fi" 2>/dev/null || true - echo "=== Listener on 1089 (PAC URL default) ===" - if lsof -i :1089 -sTCP:LISTEN 2>/dev/null | head -5; then - : - else - echo "(none — при Enabled PAC в Safari/системе возможны сбои)" - fi + echo "=== PAC listener :1089 ===" + lsof -i :1089 -sTCP:LISTEN 2>/dev/null | head -3 || echo "(none)" echo "=== Default route ===" - route -n get default 2>/dev/null | head -12 || true - echo "=== Quick reachability (ICMP may be blocked on some hotspots) ===" - ping -c 1 -W 2000 1.1.1.1 >/dev/null 2>&1 && echo "ping 1.1.1.1: ok" || echo "ping 1.1.1.1: fail" + route -n get default 2>/dev/null | head -8 || echo "(no default route)" + gw="$(default_gateway 2>/dev/null || true)" + if [ -n "$gw" ]; then + ping -c 1 -W 2000 "$gw" >/dev/null 2>&1 && echo "ping gateway: ok" || echo "ping gateway: fail" + fi + curl -sS --max-time 5 -o /dev/null https://1.1.1.1 2>/dev/null && echo "curl: ok" || echo "curl: fail" ;; recover) - echo "1) Отключаем автоматический PAC на выбранных сервисах..." + echo "=== Hotspot recover (DHCP + route flush) ===" + echo "Скрипт запросит пароль sudo для сброса маршрутов." + echo "" + echo "1) PAC off..." if [ -x "$PAC_SCRIPT" ]; then MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" off - else - echo "WARN: нет $PAC_SCRIPT — вручную: Системные настройки → Сеть → Wi‑Fi → Подробнее → Прокси → снять «Автоматическая настройка прокси»" >&2 - fi - echo "2) Отключаем системный SOCKS-прокси на Wi-Fi (если был включён Shadowsocks и т.п.)..." - if networksetup -listallnetworkservices 2>/dev/null | grep -Fqx "Wi-Fi"; then - networksetup -setsocksfirewallproxystate "Wi-Fi" off 2>/dev/null || true - fi - echo "3) Сброс DNS-кэша (нужен sudo)..." - if sudo -n true 2>/dev/null; then - sudo dscacheutil -flushcache 2>/dev/null || true - sudo killall -HUP mDNSResponder 2>/dev/null || true - echo " mDNSResponder перезагружен." - else - echo " Пропуск (нет sudo без пароля). Выполните вручную:" - echo " sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder" fi + echo "2) SOCKS off..." + networksetup -setsocksfirewallproxystate "Wi-Fi" off 2>/dev/null || true + echo "3) Wi‑Fi → DHCP (снимаем конфликтный Manual Joplin)..." + ensure_dhcp_wifi dev="$(wifi_device)" - if [ -n "$dev" ]; then - echo "4) Обновление DHCP на $dev (нужен sudo)..." - if sudo -n true 2>/dev/null; then - sudo ipconfig set "$dev" DHCP 2>/dev/null || true - else - echo " Пропуск. Вручную: sudo ipconfig set $dev DHCP" - fi - echo "5) Краткое выключение/включение Wi‑Fi радиомодуля ($dev)..." - networksetup -setairportpower "$dev" off 2>/dev/null || true - sleep 2 - networksetup -setairportpower "$dev" on 2>/dev/null || true - else - echo "4–5) Не удалось определить Wi‑Fi device — пропуск DHCP/airport power. Вручную выключите/включите Wi‑Fi в меню." + if [ -z "$dev" ]; then + echo "Ошибка: Wi‑Fi device не найден" >&2 + exit 1 fi - echo "=== Готово. Проверка: ===" - "$0" status + echo "4) Ядерный сброс $dev..." + nuclear_network_reset "$dev" + echo "5) Ожидание DHCP..." + wait_for_connectivity "$dev" || true + mode="$(joplin_mode)" + case "$mode" in + alias) + echo "6) Joplin: alias IP (не ломает маршрутизацию)..." + if [ -x "$JOPLIN_ALIAS_SCRIPT" ]; then + "$JOPLIN_ALIAS_SCRIPT" ensure || true + else + setup_joplin_alias "$dev" || true + fi + ;; + manual) + echo "6) Joplin: manual Wi‑Fi (legacy)..." + setup_joplin_manual || true + ;; + *) + echo "6) Joplin: пропуск (нет $JOPLIN_ENV)" + ;; + esac echo "" - echo "Если интернет всё ещё нет: откройте хотспот в браузере (captive portal), затем при необходимости снова включите PAC:" - echo " ./docs/connectivity/scripts/macos-pac-on.sh" + echo "=== Итог ===" + "$SCRIPT_SELF" status + echo "" + echo "Captive portal: http://neverssl.com" ;; *) usage diff --git a/docs/disk_cleanup/DISK_CLEANUP.md b/docs/disk_cleanup/DISK_CLEANUP.md index 416c216..d9bb77f 100644 --- a/docs/disk_cleanup/DISK_CLEANUP.md +++ b/docs/disk_cleanup/DISK_CLEANUP.md @@ -166,7 +166,7 @@ find "$HOME/Library/Logs" -type f -size 0 -delete 2>/dev/null ## 🔄 Регулярность очистки - **Еженедельно:** build-артефакты, пустые логи. -- **Ежемесячно:** кэши разработки (npm, node-gyp, TypeScript, pip, .yarn), Library/Caches (Google, Firefox, ShipIt, anytype-updater, ms-playwright, responsivelyapp-updater), Cursor WebStorage/Partitions/projects, уровень 1 из cleanup-disk-now.sh. +- **Ежемесячно:** кэши разработки (npm, node-gyp, TypeScript, pip, .yarn), Library/Caches (Google, Firefox, ShipIt, anytype-updater, ms-playwright), Cursor WebStorage/Partitions/projects. - **При заполнении диска >80%:** всё из ежемесячного + Colima (если не нужен), state.vscdb.backup, приложения (Notion, zoom, LibreOffice, Movavi, Ledger), записи экрана. --- diff --git a/docs/disk_cleanup/cleanup-disk-now.sh b/docs/disk_cleanup/cleanup-disk-now.sh index 3afd52a..6fd0872 100755 --- a/docs/disk_cleanup/cleanup-disk-now.sh +++ b/docs/disk_cleanup/cleanup-disk-now.sh @@ -37,51 +37,14 @@ cleanup_dir "$HOME/.yarn" ".yarn кэш" cleanup_dir "$HOME/Library/Caches/ms-playwright" "Playwright кэш (браузеры для тестов)" echo "" -# 2. Windsurf полностью (кэш + данные; приложение — удалить вручную из Программы) -echo "=== 2. Windsurf полностью ===" -cleanup_dir "$HOME/.codeium/windsurf" "Codeium/Windsurf кэш" -cleanup_dir "$HOME/.windsurf" "Windsurf данные" -cleanup_dir "$HOME/Library/Application Support/Windsurf" "Windsurf Application Support" -# Если .codeium пуст — можно удалить целиком -[ -d "$HOME/.codeium" ] && [ -z "$(ls -A "$HOME/.codeium" 2>/dev/null)" ] && rm -rf "$HOME/.codeium" && echo " ✅ .codeium (пустая) удалена" -echo "" - -# 3. Кэши браузеров — только Google/Firefox (Brave в DO_NOT_DELETE) -echo "=== 3. Кэши браузеров (не Brave) ===" +# 2. Кэши браузеров — только Google/Firefox (Brave в DO_NOT_DELETE) +echo "=== 2. Кэши браузеров (не Brave) ===" cleanup_dir "$HOME/Library/Caches/Google" "Google кэш" cleanup_dir "$HOME/Library/Caches/Firefox" "Firefox кэш" echo "" -# 3b. Уровень 1 — лёгкие кэши и временные артефакты (~0.5 GB) -echo "=== 3b. Уровень 1 (кэши приложений, Apple, hunabapp temp) ===" -cleanup_dir "$HOME/Library/Caches/responsivelyapp-updater" "responsivelyapp-updater кэш" -cleanup_dir "$HOME/Library/Application Support/ResponsivelyApp" "ResponsivelyApp кэш" -cleanup_dir "$HOME/Library/Caches/GeoServices" "GeoServices кэш" -cleanup_dir "$HOME/Library/Caches/com.apple.helpd" "com.apple.helpd кэш" -cleanup_dir "$HOME/Library/Caches/com.apple.CloudTelemetry" "com.apple.CloudTelemetry кэш" -cleanup_dir "$HOME/Library/Caches/com.apple.ctcategories.service" "com.apple.ctcategories.service кэш" -HUNAB_TEMP="$HOME/code/hunabapp-dev/temp" -if [ -d "$HUNAB_TEMP" ]; then - find "$HUNAB_TEMP" -maxdepth 1 -type f \( -name 'hunab-backend-bundle-*.tar.gz' -o -name 'hunab-backend-logs-*.tar.gz' \) -print0 2>/dev/null | while IFS= read -r -d '' f; do - size=$(du -sh "$f" 2>/dev/null | cut -f1) - echo "🗑️ Удаление hunabapp temp: $(basename "$f") ($size)..." - rm -f "$f" && echo " ✅ удалён" || echo " ⚠️ не удалось" - done -fi -echo " Build/dist в ~/code (кроме frontend/android)..." -find "$HOME/code" -type d \( -name "build" -o -name "dist" -o -name ".next" -o -name "out" \) \ - -not -path "*/node_modules/*" \ - -not -path "*/venv/*" \ - -not -path "*/.venv/*" \ - -not -path "*/site-packages/*" \ - -not -path "*/env/*" \ - -not -path "*/hunabapp-dev/frontend/android/*" \ - -exec rm -rf {} + 2>/dev/null || true -echo " ✅ Build-артефакты уровня 1 очищены" -echo "" - -# 4. Приложения — Notion, zoom, LibreOffice, Movavi, Ledger (Telegram в DO_NOT_DELETE) -echo "=== 4. Кэши приложений ===" +# 3. Приложения — Notion, zoom, LibreOffice, Movavi, Ledger (Telegram в DO_NOT_DELETE) +echo "=== 3. Кэши приложений ===" cleanup_dir "$HOME/Library/Application Support/Notion" "Notion" cleanup_dir "$HOME/Library/Application Support/zoom.us" "zoom.us" cleanup_dir "$HOME/Library/Application Support/LibreOffice" "LibreOffice" @@ -89,8 +52,8 @@ cleanup_dir "$HOME/Library/Application Support/Movavi" "Movavi" cleanup_dir "$HOME/Library/Application Support/Ledger Live" "Ledger Live" echo "" -# 5. Cursor — только разрешённые кэши и state backup (~10 GB) -echo "=== 5. Cursor кэши (только разрешённые) ===" +# 4. Cursor — только разрешённые кэши и state backup (~10 GB) +echo "=== 4. Cursor кэши (только разрешённые) ===" STATE_BACKUP="$HOME/Library/Application Support/Cursor/User/globalStorage/state.vscdb.backup" if [ -f "$STATE_BACKUP" ]; then size=$(du -sh "$STATE_BACKUP" 2>/dev/null | cut -f1) @@ -109,35 +72,16 @@ cleanup_dir "$HOME/Library/Application Support/Cursor/Partitions" "Cursor Partit cleanup_dir "$HOME/.cursor/projects" "Cursor projects" echo "" -# 6. Homebrew, .cache, пустые логи -echo "=== 6. Homebrew, .cache, пустые логи ===" +# 5. Homebrew, .cache, пустые логи +echo "=== 5. Homebrew, .cache, пустые логи ===" cleanup_dir "$HOME/Library/Caches/anytype-updater" "anytype-updater кэш" cleanup_dir "$HOME/Library/Caches/Homebrew" "Homebrew кэш" cleanup_dir "$HOME/.cache" ".cache" find "$HOME/Library/Logs" -type f -size 0 -delete 2>/dev/null && echo " ✅ Пустые логи удалены" || true echo "" -# 7. ScreenRecordings (по желанию) -echo "=== 7. Записи экрана ===" -if [ -d "$HOME/Library/ScreenRecordings" ]; then - count=$(find "$HOME/Library/ScreenRecordings" -type f 2>/dev/null | wc -l | tr -d ' ') - if [ "$count" -gt 0 ]; then - echo " Найдено файлов: $count" - read -p " Удалить все записи экрана? (y/n): " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - cleanup_dir "$HOME/Library/ScreenRecordings" "Записи экрана" - else - echo " ⏭️ Пропущено" - fi - else - echo " ℹ️ Папка пуста" - fi -fi -echo "" - -# 8. Build артефакты (исключая hunabapp-dev/frontend/android — в DO_NOT_DELETE) -echo "=== 8. Build артефакты в ~/code (кроме android) ===" +# 6. Build артефакты (исключая hunabapp-dev/frontend/android — в DO_NOT_DELETE) +echo "=== 6. Build артефакты в ~/code (кроме android) ===" read -p " Удалить build/dist/.next/out? (y/n): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then @@ -155,8 +99,8 @@ else fi echo "" -# 9. node_modules (опционально; НЕ frontend — в DO_NOT_DELETE) -echo "=== 9. node_modules (кроме hunabapp-dev/frontend) ===" +# 7. node_modules (опционально; НЕ frontend — в DO_NOT_DELETE) +echo "=== 7. node_modules (кроме hunabapp-dev/frontend) ===" read -p " Удалить node_modules в проектах? (y/n): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then @@ -171,8 +115,8 @@ else fi echo "" -# 10. UTM виртуальная машина — опционально -echo "=== 10. UTM виртуальная машина ===" +# 8. UTM виртуальная машина — опционально +echo "=== 8. UTM виртуальная машина ===" if [ -d "$HOME/code/Parrot-home-mate-6.4_arm64.utm" ]; then read -p " Удалить UTM виртуальную машину? (y/n): " -n 1 -r echo diff --git a/docs/games/JA3_MAC_WITHOUT_GALAXY.md b/docs/games/JA3_MAC_WITHOUT_GALAXY.md index 546a65e..84ff73d 100644 --- a/docs/games/JA3_MAC_WITHOUT_GALAXY.md +++ b/docs/games/JA3_MAC_WITHOUT_GALAXY.md @@ -15,7 +15,7 @@ | **Исполняемый файл** | `C:\GOG Games\Jagged Alliance 3\JA3.exe` | | **Bottle** | **GOG-Install** (`scripts/games/gog/bottle.env`) — не HoMM/Steam | | **Galaxy в Wine** | **не использовать** для JA3 — CEF, swap ([GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md)) | -| **Запуск игры** | **CrossOver** `run-ja3-crossover.sh` — см. [JA3_RUNBOOK.md](JA3_RUNBOOK.md) | +| **Запуск игры** | **`run-ja3.sh`** (Whisky GOG-Install) — см. [JA3_RUNBOOK.md](JA3_RUNBOOK.md) | | **Steam.app / Steam.exe** | **не в контуре** — отдельный bottle HoMM; в GOG-bottle клиента Steam быть не должно | ### Не путать с Steam @@ -126,33 +126,26 @@ JA3 на Windows использует **D3D12**. **DXVK-macOS** (только D3 | **Whisky / Gcenx Wine 11.9** | `d3d12.dll` = wined3d → **Vulkan** (`d3d12_get_vk_physical_device Could not find Vulkan physical device`). **Нет D3DMetal hooks** ([Gcenx#97](https://github.com/Gcenx/macOS_Wine_builds/issues/97)). | | **GPTK PE + Gcenx ntdll** | `__wine_unix_call` / `dxgi.dll not found` — PE DLL GPTK несовместимы с чужим Wine. | | **GPTK Wine 7.7 alone** | `comctl32.dll failed to initialize` на этой macOS — не запускается даже notepad. | -| **CrossOver 26 + D3DMetal** | **Работает.** Встроенные `apple_gptk` + `WINED3DMETAL=1`. | +| **CrossOver 26 + D3DMetal** | Работало; **CrossOver удалён** (2026-06). | +| **Whisky + GPTK** | D3DMetal в GOG-Install bottle — см. `install-gptk-whisky.sh` | Сообщения GOG API (`MatchmakingServers`, `Music`, `Game name not defined`) — **не причина** краша. -#### Канон запуска (подтверждено на этой машине) +#### Канон запуска (2026-06) ```bash -brew install --cask crossover # один раз -bash ~/code/local_machine/scripts/games/gog/setup-ja3-crossover.sh -bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh +bash ~/code/local_machine/scripts/games/gog/run-ja3.sh ``` -CrossOver bottle **JA3-GOG** (win10_64, D3DMetal on). Игра клонируется APFS clonefile в bottle (Wine **не читает** symlink за пределы prefix → `CommonLua/Core/autorun.lua not found`). - -**Whisky `run-ja3.sh` для D3D12 на Mac не работает** — только CrossOver (или Porting Kit GUI). - -Альтернатива GUI: [Porting Kit](https://www.paulthetall.com/jagged-aliance-3-for-mac/) (тот же GPTK/D3DMetal стек). +Игра в bottle **GOG-Install** (Whisky). При D3D12-ошибках — GPTK в bottle ([JA3_RUNBOOK.md](JA3_RUNBOOK.md) §2). ### Запуск игры ```bash -bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh +bash ~/code/local_machine/scripts/games/gog/run-ja3.sh ``` -Whisky (`run-ja3.sh`) — только установка innoextract в GOG-Install; **графика D3D12 → CrossOver**. - -Обход (тормоза, на свой риск): +Обход swap (тормоза, на свой риск): ```bash JA3_IGNORE_SWAP=1 bash ~/code/local_machine/scripts/games/gog/run-ja3.sh @@ -160,7 +153,7 @@ JA3_IGNORE_SWAP=1 bash ~/code/local_machine/scripts/games/gog/run-ja3.sh Cmd+Tab → `wine64` / `JA3`. В графике при артефактах: **отключить heat haze**. -**Ошибка «Failed to initialize graphics subsystem»:** Whisky/Gcenx Wine **не поддерживает D3DMetal** для d3d12. Используйте **CrossOver**: `setup-ja3-crossover.sh` + `run-ja3-crossover.sh`. Из Whisky Run **не запускать** — только CrossOver bottle JA3-GOG с `start /d` (CWD + CommonLua). +**Ошибка «Failed to initialize graphics subsystem»:** установите GPTK и настройте D3DMetal в Whisky — см. [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §2. **Не** запускать `JA3.exe` из Whisky Run без `start /d`. ### Итог на диске (после успеха на этой машине) @@ -200,9 +193,8 @@ bash ~/code/local_machine/scripts/games/gog/install-ja3-offline.sh ~/Downloads/s | `install-ja3-multipart.sh` (Wine `/VERYSILENT`) | `install-ja3-innoextract.sh` | | Распаковка в `scripts/games/cache/ja3-*` | сразу в `drive_c/GOG Games/…` | | Держать `.bin` после установки без нужды | скрипт удалит (~15 GB) | -| `launch-galaxy.sh` / Galaxy CEF для JA3 | **`run-ja3-crossover.sh`** ([JA3_RUNBOOK.md](JA3_RUNBOOK.md)) | -| Whisky `run-ja3.sh` для D3D12 | CrossOver + D3DMetal | -| `RetinaMode=y` + `LogPixels=192` для мыши JA3 | Клип курсора на середине экрана → **legacy** ([JA3_RUNBOOK.md](JA3_RUNBOOK.md) §9) | +| `launch-galaxy.sh` / Galaxy CEF для JA3 | **`run-ja3.sh`** ([JA3_RUNBOOK.md](JA3_RUNBOOK.md)) | +| Whisky Run `JA3.exe` без CWD | `run-ja3.sh` (`start /d`) | | Жёсткий стоп JA3 при swap 800 MB без Wine | Устарело; warn до 4 GB — [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §4 | --- diff --git a/docs/games/JA3_RUNBOOK.md b/docs/games/JA3_RUNBOOK.md index 98611de..c02297f 100644 --- a/docs/games/JA3_RUNBOOK.md +++ b/docs/games/JA3_RUNBOOK.md @@ -1,9 +1,11 @@ # Jagged Alliance 3 (GOG) — runbook Mac / Apple Silicon **Машина:** M1 Pro, macOS Sonoma+, bottle Whisky **GOG-Install** (`9ee55e7c-a58e-411e-a93f-30530d4f1073`). -**Проверено:** 2026-05-28 (установка) · 2026-05-29 (запуск через CrossOver). +**Проверено:** 2026-05-28 (установка) · 2026-06-17 (CrossOver удалён; запуск только Whisky). -Связанные документы: [JA3_MAC_WITHOUT_GALAXY.md](JA3_MAC_WITHOUT_GALAXY.md) (установка offline), [TROUBLESHOOTING.md](TROUBLESHOOTING.md), [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md). +Связанные документы: [JA3_MAC_WITHOUT_GALAXY.md](JA3_MAC_WITHOUT_GALAXY.md), [TROUBLESHOOTING.md](TROUBLESHOOTING.md), [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md). + +> **Примечание (2026-06):** CrossOver и связанные скрипты (`run-ja3-crossover.sh`, `JA3-GOG`, `JA3-WINE`, `sync-ja3-saves.sh`) **удалены** с машины. Запуск JA3 — только через Whisky GOG-Install. --- @@ -17,281 +19,93 @@ bash ~/code/local_machine/scripts/games/gog/install-ja3-innoextract.sh bash ~/code/local_machine/scripts/games/gog/finish-ja3-layout.sh ``` -### Запуск (каждый раз, CrossOver + D3DMetal) +### Запуск (каждый раз) ```bash -brew install --cask crossover # один раз -bash ~/code/local_machine/scripts/games/gog/setup-ja3-crossover.sh # один раз -bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh +bash ~/code/local_machine/scripts/games/gog/run-ja3.sh ``` -- **Cmd+Tab** → окно `JA3.exe` -- В настройках графики: **отключить heat haze** -- **Swap:** «залипший» swap после Wine (2–4 GB без процессов) **не блокирует** запуск — только предупреждение. Стоп: swap ≥ **4096 MB** без Wine, или swap ≥ **1200 MB** пока **Wine/JA3 ещё работают** → `reset-ja3-crossover.sh` / reboot. Обход: `JA3_IGNORE_SWAP=1` - -### Два «контура» - -| Контур | Роль | Инструмент | -|--------|------|------------| -| **GOG-Install** (Whisky) | innoextract, файлы игры, CommonLua, реестр GOG | `install-ja3-innoextract.sh`, `finish-ja3-layout.sh` | -| **JA3-GOG** (CrossOver) | **запуск** D3D12 через D3DMetal | `setup-ja3-crossover.sh`, `run-ja3-crossover.sh` | - -Whisky **`run-ja3.sh` не запускает JA3 с рабочей графикой** — только CrossOver (или Porting Kit GUI). +- **Cmd+Tab** → окно **`JA3.exe`** +- **Swap:** «залипший» swap после Wine **не блокирует** запуск — только предупреждение. Стоп: swap ≥ **4096 MB** без Wine, или swap ≥ **1200 MB** пока **Wine/JA3 ещё работают** → `reset-ja3-whisky.sh` / reboot. Обход: `JA3_IGNORE_SWAP=1` +- **Задержка cold start:** 15–60 с до появления окна — норма --- -## 2. Почему CrossOver, а не Whisky +## 2. Графика: Whisky vs D3D12 -JA3 на Windows использует **DirectX 12**. На Apple Silicon единственный рабочий путь — **Apple D3DMetal** (Game Porting Toolkit), встроенный в **CrossOver 23+** с флагом `WINED3DMETAL=1`. +JA3 на Windows использует **DirectX 12**. На Apple Silicon рабочий путь раньше был **CrossOver + D3DMetal** — CrossOver снят. -**Whisky** использует **Gcenx Wine** — maintainer явно пишет, что сборки **не содержат D3DMetal hooks** ([Gcenx/macOS_Wine_builds#97](https://github.com/Gcenx/macOS_Wine_builds/issues/97)). В этом случае `d3d12.dll` (94 KB) идёт через **wined3d → Vulkan**, а на Mac нет Vulkan physical device: - -```text -fixme:d3d12:d3d12_get_vk_physical_device Could not find Vulkan physical device for DXGI adapter. -``` - -→ UI: **«Failed to initialize graphics subsystem»** -→ лог JA3: **`Failed creating render device`** - -Копирование `D3DMetal.framework` + `libd3dshared.dylib` + моста `d3d12.so` **не достаточно**, если PE `d3d12.dll` / `ntdll` от Gcenx — unix-вызовы D3DMetal не подключены. - ---- - -## 3. RCA: злоключения 2026-05-28 — 2026-05-29 - -Хронология попыток на этой машине (чат + логи `JA3.exe-*.log`, Wine debug). - -### Фаза A — установка и ложные следы (28.05) - -| # | Симптом / действие | Реальная причина | Итог | -|---|-------------------|------------------|------| -| A1 | GOG web-stub, пустые кнопки | Нет **gdiplus** (winetricks) | ✅ `install-gdiplus.sh` + corefonts | -| A2 | Galaxy CEF, окна нет | HWND/CEF в Wine, swap | Galaxy **не нужен** для JA3 offline | -| A3 | Лог `Steam initialized … Beta branch GOG` | GOG API-шим (`steam_api64.dll`), **не** Steam.app | ❌ не причина краша | -| A4 | `CreateSubsystem failed MatchmakingServers/Music` | GOG wrapper без Galaxy service | ❌ шум, не графика | -| A5 | `Game name not defined` | innoextract не выполнил Inno-постскрипты | ⚠️ косметика; фикс: `register-ja3-registry.sh` | -| A6 | Swap ~3 GB, скрипт блокирует запуск | «Залипший» swap после Wine; macOS не отдаёт без reboot | ✅ `gog_swap_guard_ja3_launch`: warn до 4 GB без процессов; reboot если Mac тормозит | - -### Фаза B — «графика» в Whisky (28–29.05) - -| # | Попытка | Лог / ошибка | Почему не работает | -|---|---------|--------------|-------------------| -| B1 | DXVK + `-graphicsapi d3d11` | `Failed creating render device` | DXVK = D3D10/11, **не D3D12** | -| B2 | DXMT v0.80 | `dxgi.dll` **c000007b** | Несовместимость с Gcenx Wine 11 + overrides | -| B3 | `upgrade-whisky-wine-gcenx.sh` (11.9) + GPTK bridge | `d3d12_get_vk_physical_device` | Gcenx d3d12 = **Vulkan**, не Metal | -| B4 | GPTK PE `d3d12.dll`/`dxgi.dll` (114/86 KB) в `system32` | Всё ещё Vulkan path или `dxgi not found` | PE GPTK 7.7 ≠ ntdll Gcenx 11 | -| B5 | GPTK PE в `wine/lib/x86_64-windows` | `Library dxgi.dll not found` (c0000135) | `__wine_unix_call` не реализован в Gcenx ntdll | -| B6 | Замена `ntdll.so` на GPTK | `virtual_alloc_first_teb` / wine не стартует | Нельзя мешать ntdll разных Wine | -| B7 | `ditto` всего GPTK `lib/` в Whisky | Wine **7.7 GPTK** поверх bottle | Перезаписал `wine64` → comctl32 и др. | -| B8 | `prepare-ja3-d3dmetal.sh` (убрать d3d12 из system32) | Всё равно render device fail | Builtin Gcenx d3d12 без Metal | -| B9 | `forceD3D11: true` в Metadata.plist | Противоречие с D3D12 backend | Исправлено на `false` — без эффекта на Gcenx | -| B10 | GPTK Wine 7.7, отдельный prefix | `comctl32.dll failed to initialize` (c0000005) | GPTK Wine 7.7 **сломан** на этой macOS | -| B11 | `fixmywhisky.sh` (ditto GPTK lib) | Как B7 | Только D3DMetal.framework + bridge **без** подмены всего Wine | - -### Фаза C — CrossOver (29.05, **успех**) - -| # | Шаг | Результат | -|---|-----|-----------| -| C1 | `brew install --cask crossover` | CrossOver 26.1, встроенный `apple_gptk` | -| C2 | Bottle **JA3-GOG**, template **win10_64** (не win32 Wow64!) | `kernel32` c000007b на 32-bit bottle | -| C3 | `WINED3DMETAL=1`, `WINEDXVK=0` в `cxbottle.conf` | D3D12 → Metal | -| C4 | Symlink игры из Whisky bottle | `CommonLua/Core/autorun.lua: File Not Found` — Wine **не читает** symlink **вне** prefix | -| C5 | `cp -cR` (APFS clonefile) игры в CrossOver bottle | Файлы видны Wine; **~0** доп. места на APFS | -| C6 | `start /d "C:\GOG Games\Jagged Alliance 3" JA3.exe -unpacked` | CWD с `CommonLua/`; не `--cx-app` без `/d` | -| C7 | Запуск | **JA3.exe** стабильно работает, нет `Failed creating render device` | -| C8 | Курсор: смещение клика → `RetinaMode=y` + `LogPixels=192` | Курсор **не опускается ниже середины экрана** (Y делится пополам) | ✅ профиль **`legacy`**: `RetinaMode=n`, без LogPixels — **подтверждено 2026-05-29** | - -### Сигнатуры в логах (диагностика) - -| Строка | Значение | -|--------|----------| -| `Failed creating render device` | D3D12 не дошёл до GPU — Whisky/Gcenx, не CrossOver | -| `d3d12_get_vk_physical_device Could not find Vulkan` | Gcenx wined3d path — нужен CrossOver D3DMetal | -| `Failed to initialize graphics subsystem` (UI) | То же, пользовательский текст JA3 | -| `Error opening 'CommonLua/Core/autorun.lua'` | Нет CWD (`start /d`) или symlink вместо клона в bottle | -| `comctl32.dll failed to initialize` | GPTK Wine 7.7 — не использовать | -| `__wine_unix_call` / `aborting` | GPTK PE на чужом Wine | -| `dxgi.dll` **c000007b** | DXMT + неправильные overrides | -| `Language: English` без `Failed creating` | Графика OK; смотреть CommonLua / crash дальше | -| Курсор виден, клик смещён по Y | HiDPI без согласованного масштаба Wine | `fix-ja3-crossover-mouse.sh` → профиль **legacy** | -| Курсор **не ниже середины экрана** | `RetinaMode=y` + `LogPixels=192` / двойной DPI | **legacy** (не retina); перезапуск JA3 | - -Логи JA3: -`…/AppData/Roaming/Jagged Alliance 3/logs/JA3.exe-*.log` -Whisky: `…/Containers/com.franke.Whisky/Bottles/9ee55e7c-…/` -CrossOver: `~/Library/Application Support/CrossOver/Bottles/JA3-GOG/` - ---- - -## 4. Антипаттерны (полный список) - -### Установка - -| ❌ Не делать | ✅ Вместо | -|-------------|----------| -| GOG web-stub `GOG_Galaxy_Jagged_Alliance_3.exe` | Offline backup 5 частей в `~/Games/` | -| `install-ja3-multipart.sh` (Wine Inno) | `install-ja3-innoextract.sh` | -| Распаковка в `scripts/games/cache/` | Сразу в `drive_c/GOG Games/…` | -| Bottle **HoMM-OldenEra** (Steam) | Bottle **GOG-Install** | -| Удалять `steam_api64.dll` в папке игры | Это GOG-шим, **оставить** | -| Steam client в GOG-bottle | `purge-steam-from-bottle.sh` | - -### Графика / Wine - -| ❌ Не делать | ✅ Вместо | -|-------------|----------| -| Whisky `run-ja3.sh` для игры | **`run-ja3-crossover.sh`** | -| `upgrade-whisky-wine-gcenx.sh` «для D3DMetal» | Gcenx **не** поддерживает D3DMetal hooks | -| `ditto` всего GPTK `lib/` в Whisky Libraries | Только `D3DMetal.framework` + `libd3dshared` + `.so` bridge (см. `install-gptk-whisky.sh`) | -| GPTK PE `d3d12/dxgi` в system32 **Whisky** | CrossOver со встроенным `apple_gptk` | -| Замена `ntdll.so` GPTK в Gcenx Wine | Ломает preloader | -| DXVK / DXMT для JA3 как «замена D3D12» | Не подтверждено; JA3 = D3D12 | -| `dxgi,d3d11=n,b` с DXMT | Ломает цепочку → c000007b | -| Whisky Run **`JA3.exe`** без CWD | `start /d` или `run-ja3.cmd` (Whisky) / CrossOver `start /d` | -| Symlink игры из Whisky в CrossOver bottle | **`cp -cR`** (APFS clone) | -| CrossOver bottle **win32** / Wow64 | **`win10_64`** | -| `--cx-app JA3.exe` без `start /d` | `start /d "…Jagged Alliance 3" JA3.exe -unpacked` | -| `forceD3D11: true` + backend d3dMetal | `forceD3D11: false` (Metadata Whisky — не решает Gcenx) | - -### Окружение - -| ❌ Не делать | ✅ Вместо | -|-------------|----------| -| Считать «залипший» swap 2–4 GB блокером JA3 | Запуск разрешён (warn); reboot — если Mac тормозит | -| Запуск JA3 при swap ≥ **1200 MB** + **Wine/JA3 ещё работают** | `reset-ja3-crossover.sh` → reboot | -| Запуск JA3 при swap ≥ **4096 MB** без Wine | Reboot Mac или `JA3_IGNORE_SWAP=1` | -| Жёсткий лимит **800 MB** для `run-ja3-crossover.sh` | Устарело; см. `gog_swap_guard_ja3_launch` в `config.sh` | -| Путать лог Galaxy с JA3 | JA3 offline **без** Galaxy UI | -| Чинить «graphics» через Galaxy service | `MatchmakingServers`/`Music` — шум GOG API | - -### Мышь (CrossOver / Retina) - -| ❌ Не делать | ✅ Вместо | -|-------------|----------| -| `RetinaMode=y` + `LogPixels=192` + `Win8DpiScaling=1` «по умолчанию» | **`fix-ja3-crossover-mouse.sh`** — профиль **legacy** (`RetinaMode=n`) | -| CrossOver GUI **High Resolution Mode** без проверки | Если клип Y на середине → **legacy** | -| Менять реестр мыши без перезапуска JA3 | `reset-ja3-crossover.sh` → `run-ja3-crossover.sh` | -| Профиль **retina** при клипе на середине экрана | **legacy**; при смещении клика — **retina-lite** | -| Ожидать фикс мыши «на лету» | Workaround: верхний левый угол окна = угол экрана | - ---- - -## 5. Скрипты - -| Скрипт | Назначение | Статус | -|--------|------------|--------| -| `install-ja3-innoextract.sh` | Multipart offline → bottle | ✅ канон установки | -| `finish-ja3-layout.sh` | CommonLua, реестр, upscale DLL | ✅ после innoextract | -| `setup-ja3-crossover.sh` | Bottle JA3-GOG, clone игры, D3DMetal | ✅ один раз | -| **`run-ja3-crossover.sh`** | **Запуск игры** | ✅ **канон** | -| `reset-ja3-crossover.sh` | Stop JA3 / Wine перед перезапуском | ✅ | -| `fix-ja3-crossover-mouse.sh` | Профили мыши (legacy / retina-lite / retina) | ✅ default **legacy** | -| `run-ja3.sh` | Whisky (эксперимент; графика fail) | ⚠️ только с предупреждением | -| `prepare-ja3-d3dmetal.sh` | Whisky D3DMetal prep | ⚠️ не решает Gcenx d3d12 | -| `upgrade-whisky-wine-gcenx.sh` | Wine 11.9 | ❌ для JA3 не использовать | -| `run-ja3-gptk-wine.sh` | GPTK Wine 7.7 prefix | ❌ comctl32 на этой Mac | -| `install-ja3-dxmt.sh` | DXMT fallback d3d11 | ❌ c000007b | -| `emergency-stop.sh` | Kill Wine/GOG перед запуском | ✅ | - ---- - -## 6. CrossOver bottle (детали) - -**Путь:** `~/Library/Application Support/CrossOver/Bottles/JA3-GOG/` - -**cxbottle.conf** (минимум): - -```ini -"WINED3DMETAL" = "1" -"WINEDXVK" = "0" -``` - -**Игра:** `drive_c/GOG Games/Jagged Alliance 3/` — APFS-клон из Whisky GOG-Install (не symlink). - -**Проверка:** +**Сейчас:** `run-ja3.sh` запускает игру в **Whisky GOG-Install**: +- с **GPTK/D3DMetal** в bottle (если установлен Game Porting Toolkit) — D3D12; +- иначе **DXVK D3D11 fallback** (`-graphicsapi d3d11`). +При ошибке `Failed to initialize graphics subsystem` / `dxgi.dll not found`: ```bash -pgrep -fl 'JA3\.exe' -grep -E 'Failed creating|autorun|CRASH' \ - "$HOME/Library/Application Support/CrossOver/Bottles/JA3-GOG/drive_c/users/"*/AppData/Roaming/Jagged\ Alliance\ 3/logs/*.log | tail +brew install --cask gcenx/wine/game-porting-toolkit +bash ~/code/local_machine/scripts/games/gog/install-gptk-whisky.sh +bash ~/code/local_machine/scripts/games/gog/configure-ja3-d3dmetal.sh +bash ~/code/local_machine/scripts/games/gog/run-ja3.sh ``` --- -## 7. Альтернативы +## 3. Пути на диске -| Вариант | Комментарий | -|---------|-------------| -| [Porting Kit](https://www.paulthetall.com/jagged-aliance-3-for-mac/) + GOG offline | Тот же GPTK/D3DMetal; GUI, «просто работает» на M-series | -| CrossOver GUI | Bottle JA3-GOG → Install → Run exe; D3DMetal в Advanced Settings | -| Whisky + GPTK drag DMG | [Whisky#124](https://github.com/Whisky-App/Whisky/issues/124) — для **DX12** на Gcenx всё равно нет hooks | +| Что | Путь | +|-----|------| +| Игра (Whisky) | `…/Containers/com.franke.Whisky/Bottles/9ee55e7c-…/drive_c/GOG Games/Jagged Alliance 3/` | +| Сейвы | `…/drive_c/users/eternal/AppData/Roaming/Jagged Alliance 3//` | +| Логи JA3 | `…/AppData/Roaming/Jagged Alliance 3/logs/JA3.exe-*.log` | --- -## 9. Курсор: HiDPI / Retina (CrossOver) +## 4. Скрипты -**Проверено 2026-05-29** на M1 Pro + CrossOver 26.1, bottle **JA3-GOG**. +| Скрипт | Назначение | +|--------|------------| +| `install-ja3-innoextract.sh` | Установка из offline backup | +| `finish-ja3-layout.sh` | CommonLua, реестр GOG | +| **`run-ja3.sh`** | **Канон запуска** | +| `reset-ja3-whisky.sh` | Остановить JA3/Wine в GOG-Install | +| `emergency-stop.sh` | Полный стоп GOG/Wine | +| `prepare-ja3-d3dmetal.sh` / `configure-ja3-d3dmetal.sh` | D3DMetal в Whisky | -### Симптомы - -| Симптом | Типичная причина | -|---------|------------------| -| Клик «выше/ниже» UI, курсор виден | Wine отдаёт logical pixels, игра рисует в другом масштабе | -| **Курсор не опускается ниже середины экрана** | `RetinaMode=y` + `LogPixels=192` — координата Y делится пополам | - -### Профили (`fix-ja3-crossover-mouse.sh`) - -| Профиль | Реестр | Когда | -|---------|--------|-------| -| **`legacy`** (default) | `RetinaMode=n`, LogPixels/Win8Dpi **удалены** | **Канон** — полный ход курсора по Y; возможен небольшой сдвиг клика | -| `retina-lite` | `RetinaMode=y`, без LogPixels | Если legacy смещает клик, но **нет** клипа на середине | -| `retina` | `RetinaMode=y`, `LogPixels=192`, `Win8DpiScaling=1` | ❌ часто **клип Y на 50%** — не использовать как default | - -```bash -# Канон (после смены профиля — перезапуск JA3) -bash ~/code/local_machine/scripts/games/gog/fix-ja3-crossover-mouse.sh -bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh -bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh - -# Если legacy смещает клик -JA3_MOUSE_PROFILE=retina-lite bash ~/code/local_machine/scripts/games/gog/fix-ja3-crossover-mouse.sh -bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh -bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh -``` - -**Без перезапуска (workaround):** перетащите окно JA3 так, чтобы **верхний левый угол окна** совпал с **верхним левым углом экрана**. - -CrossOver GUI: Bottle **JA3-GOG** → **High Resolution Mode** — при клипе на середине **выключить** (эквивалент **legacy**). +**Удалено (CrossOver):** `run-ja3-crossover.sh`, `setup-ja3-crossover.sh`, `run-ja3-wine.sh`, `sync-ja3-saves.sh`, `fix-ja3-crossover-mouse.sh`. --- -## 10. Быстрые команды (терминал) +## 5. Антипаттерны + +| Не делать | Вместо | +|-----------|--------| +| `launch-galaxy.sh` / Galaxy CEF для JA3 | `run-ja3.sh` | +| Whisky Run **`JA3.exe`** без CWD | `run-ja3.sh` (`start /d`) | +| Дважды подряд `run-ja3.sh` без reset при живом JA3 | `reset-ja3-whisky.sh` | +| Galaxy web-stub для JA3 | offline innoextract | + +--- + +## 6. Быстрые команды | Действие | Команда | |----------|---------| -| **Запуск** | `bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh` | -| **Стоп / reset Wine** | `bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh` | -| **Стоп всё GOG/Wine** | `bash ~/code/local_machine/scripts/games/gog/emergency-stop.sh` | -| **Первичная настройка bottle** | `bash ~/code/local_machine/scripts/games/gog/setup-ja3-crossover.sh` | -| **Фикс мыши** | `bash ~/code/local_machine/scripts/games/gog/fix-ja3-crossover-mouse.sh` | -| Swap «залип» 2–4 GB, Wine нет | просто `run-ja3-crossover.sh` (warn) | -| Swap + Wine/JA3 живы ≥ 1200 MB | `reset-ja3-crossover.sh` → reboot | -| Swap ≥ 4096 MB без Wine | reboot Mac | -| Обход swap | `JA3_IGNORE_SWAP=1 bash …/run-ja3-crossover.sh` | -| Профиль мыши | `JA3_MOUSE_PROFILE=legacy\|retina-lite\|retina` + fix + reset + run | +| **Запуск** | `bash ~/code/local_machine/scripts/games/gog/run-ja3.sh` | +| **Стоп** | `bash ~/code/local_machine/scripts/games/gog/reset-ja3-whisky.sh` | +| Стоп всё GOG/Wine | `bash ~/code/local_machine/scripts/games/gog/emergency-stop.sh` | +| Проверить процесс | `pgrep -fl 'JA3\.exe'` | +| Обход swap | `JA3_IGNORE_SWAP=1 bash …/run-ja3.sh` | -**Полный цикл перезапуска:** +**Полный цикл:** ```bash -bash ~/code/local_machine/scripts/games/gog/reset-ja3-crossover.sh -bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh +bash ~/code/local_machine/scripts/games/gog/reset-ja3-whisky.sh +bash ~/code/local_machine/scripts/games/gog/run-ja3.sh ``` --- -## 8. Ссылки +## 7. Ссылки - [Gcenx — нет D3DMetal в packages](https://github.com/Gcenx/macOS_Wine_builds/issues/97) -- [CrossOver — D3DMetal advanced settings](https://support.codeweavers.com/miscellanous/advanced-settings-in-crossover-mac-26) - [Whisky — GPU / GPTK tracking](https://github.com/Whisky-App/Whisky/issues/124) -- [Proton JA3 — graphics / LocalStorage](https://github.com/ValveSoftware/Proton/issues/7039) (Linux; отражения Off/Low — аналог для Wine при других GPU) +- [Proton JA3 — graphics](https://github.com/ValveSoftware/Proton/issues/7039) diff --git a/docs/games/TROUBLESHOOTING.md b/docs/games/TROUBLESHOOTING.md index 746711f..39455d7 100644 --- a/docs/games/TROUBLESHOOTING.md +++ b/docs/games/TROUBLESHOOTING.md @@ -30,9 +30,9 @@ GOG web-stub: bottle **`GOG-Install`** (`scripts/games/gog/bottle.env`) — **н | **GOG Galaxy: окна нет**, скрипт OK | offline installer JA3; Galaxy — best effort | [§ GOG Galaxy — окно](#gog-galaxy-окно-не-открывается) · [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md) | | GOG Galaxy → **swap**, Mac «встал» | `gog/emergency-stop.sh` → перезагрузка | [GOG_GALAXY_7H_RCA.md](GOG_GALAXY_7H_RCA.md) § Swap | | GOG stub: «запустил, окна нет» | **Cmd+Tab** → `GOG_Galaxy_*.exe` / `wine64` | [§ GOG — проверка успеха](#gog-web-stub-отдельный-bottle) | -| **JA3: Failed to initialize graphics subsystem** | CrossOver D3DMetal, не Whisky | [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §2–4 | -| **JA3: курсор не ниже середины / смещение клика** | профиль мыши **legacy** vs retina | [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §9 | -| **JA3 без Galaxy** | install → Whisky; **запуск → CrossOver** | [JA3_RUNBOOK.md](JA3_RUNBOOK.md) | +| **JA3: Failed to initialize graphics subsystem** | GPTK/D3DMetal в Whisky или D3D11 fallback | [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §2 | +| **JA3: `run-ja3.sh` — сразу `%`, окна нет** | задержка cold start + `emergency-stop` — **норма** | [§ JA3 — запуск](#ja3--запуск-whisky) | +| **JA3: повторный запуск не идёт** | swap-guard + JA3/Wine ещё живы | `reset-ja3-whisky.sh` | | Установить через web-stub | только GalaxySetup (ломается в Wine) | [§ GOG web-stub](#gog-web-stub-отдельный-bottle) | | `fork failed`, Mac «встал», swap 20+ GB | `winedbg` / Steam assert loop → § Swap | [§ Swap и winedbg](#захламление-swap-и-утечка-winedbg) | | «20 GB съело» после GOG | обычно **не** stub — swap + дампы Steam | [§ Swap](#захламление-swap-и-утечка-winedbg) · [§ GOG](#gog-web-stub-отдельный-bottle) | @@ -110,6 +110,9 @@ GOG web-stub: bottle **`GOG-Install`** (`scripts/games/gog/bottle.env`) — **н | Только **`install-corefonts`**, без **gdiplus** | `.ttf` есть, лог всё равно `FontFamilyNotFound` | оба скрипта + порядок ниже | | **`setup-wine-bottle.sh`** для GOG web-stub | DWrite/Steam-реестр, **нет** gdiplus | **`gog/setup-bottle.sh`** | | **`setup-gog-bottle.sh`** (HoMM) для JA3 | устаревшая обёртка | **`gog/setup-bottle.sh`** | +| **Whisky** Run `JA3.exe` в Whisky без `run-ja3.sh` | `dxgi.dll not found`, CWD/autorun | **`run-ja3.sh`** | +| Считать мгновенный `%` после `run-ja3.sh` сбоем | `wine start` не блокирует Terminal | **Cmd+Tab** → `JA3.exe`; ждать до ~60 с | +| Два `run-ja3.sh` подряд без reset | swap ≥1200 MB + живой JA3 | `reset-ja3-whisky.sh` | | **winetricks corefonts** из Whisky GUI | 404 на CDN Microsoft | SourceForge в **`gog/install-corefonts.sh`**; macOS Fonts | | **Debian-only** URL `msttcorefonts` | 404 | primary: `downloads.sourceforge.net/corefonts/…` | | **`winetricks liberation`** как единственный шаг | мало гарантий для VGUI/.NET | macOS + corefonts + профиль DLL | @@ -713,7 +716,45 @@ A/B CEF: `GOG_CEF_PROFILE=steam bash …/launch-galaxy-ui.sh` (добавляе | Смотреть только Whisky, не Cmd+Tab | окно Wine **вне** главного окна Whisky | | Запуск из `~/code/local_machine` без `cd drive_c` | `launch-galaxy.sh` сам ставит cwd в `drive_c` | -**JA3 на Mac:** установка — offline backup + `install-ja3-innoextract.sh` (Whisky GOG-Install). **Запуск — CrossOver D3DMetal:** `setup-ja3-crossover.sh` + `run-ja3-crossover.sh`. Whisky `run-ja3.sh` **не** даёт рабочую D3D12. Runbook: [JA3_RUNBOOK.md](JA3_RUNBOOK.md). +**JA3 на Mac:** установка — offline backup + `install-ja3-innoextract.sh` (Whisky GOG-Install). **Запуск:** `run-ja3.sh`. Runbook: [JA3_RUNBOOK.md](JA3_RUNBOOK.md). + +--- + +## JA3 — запуск (Whisky) + +**Канон:** + +```bash +bash ~/code/local_machine/scripts/games/gog/run-ja3.sh +``` + +`run-ja3.sh` запускает JA3 в bottle **GOG-Install** (Whisky). CrossOver **удалён** (2026-06). + +### «Не пускает» vs «задержка» + +| Что видите | Это ошибка? | Действие | +|------------|-------------|----------| +| Строки «Запуск JA3…» и сразу `%` | **Нет** — `wine start` не держит Terminal | Подождать 15–60 с, **Cmd+Tab** → `JA3.exe` | +| Пауза 20–40 с **до** строк «Запуск JA3…» | **Нет** — `emergency-stop` + `sleep 2` | Норма при каждом запуске | +| `❌ Swap … Wine/JA3 ещё работают` | **Да** — повторный запуск при живой игре | `reset-ja3-whisky.sh`, затем снова `run-ja3.sh` | +| Окна нет >60 с, `pgrep JA3` пусто | **Да** | Лог в `…/GOG-Install/…/AppData/Roaming/Jagged Alliance 3/logs/JA3.exe-*.log` | + +### Проверка + +```bash +pgrep -fl 'JA3\.exe' +ls -t ~/Library/Containers/com.franke.Whisky/Bottles/*/drive_c/users/*/AppData/Roaming/Jagged\ Alliance\ 3/logs/*.log 2>/dev/null | head -1 | xargs tail -20 +sysctl vm.swapusage +``` + +### Антипаттерны (JA3 запуск) + +| ❌ | ✅ | +|----|-----| +| Whisky Run **`JA3.exe`** без CWD | `run-ja3.sh` (`start /d`) | +| Ждать блокировку Terminal | Cmd+Tab → `JA3.exe` | +| Два запуска без reset при живом JA3 | `reset-ja3-whisky.sh` между сессиями | +| CrossOver / `run-ja3-crossover.sh` | удалено — только `run-ja3.sh` | ### Setup: красный X, пустое окно, gdi32 (RCA 2026-05-28) @@ -959,4 +1000,4 @@ pkill -9 winedbg; pkill -9 wineserver --- -*Последняя сверка: 2026-05-28 (§ шрифты: сводка антипаттернов Steam dwrite / GOG gdiplus; GOG-Install stub OK; GalaxySetup → gdi32) · Whisky 3 · WhiskyWine 11* +*Последняя сверка: 2026-06-17 (CrossOver удалён; JA3 только Whisky) · 2026-05-28 (шрифты Steam dwrite / GOG gdiplus) · Whisky 3* diff --git a/docs/games/WINE_APPS_LAUNCH_RUNBOOK.md b/docs/games/WINE_APPS_LAUNCH_RUNBOOK.md index 504eda3..62b4a69 100644 --- a/docs/games/WINE_APPS_LAUNCH_RUNBOOK.md +++ b/docs/games/WINE_APPS_LAUNCH_RUNBOOK.md @@ -30,7 +30,7 @@ | **GOG Galaxy (лаунчер)** | Galaxy 2.0 | `start.sh gog-install` или `gog/install-galaxy-extract.sh` | `gog` | | **GOG web-stub** | `GOG_Galaxy_*.exe` | Только bottle `gog/` — [gog/README.md](../../scripts/games/gog/README.md) | `gog` | | **Офлайн setup .exe** | backup с gog.com | Скопировать в `drive_c/`, запустить установщик | `plain` или `gog` | -| **GOG multipart + innoextract** | JA3 offline backup | `gog/install-ja3-innoextract.sh` — [JA3 runbook](JA3_RUNBOOK.md) | **CrossOver:** `run-ja3-crossover.sh` | +| **GOG multipart + innoextract** | JA3 offline backup | `gog/install-ja3-innoextract.sh` — [JA3 runbook](JA3_RUNBOOK.md) | `gog/run-ja3.sh` | | **.NET WinForms installer** | web-stub, мастера GOG | **`gog/install-gdiplus.sh`** + corefonts | `gog` | | **CEF (Steam/GOG UI)** | Steam.exe, GalaxyClient | CEF-флаги в `config.sh` / `gog/config.sh` | `steam` / `gog` | | **DX11 игра (Unity и т.д.)** | Olden Era | `install-dxvk-macos.sh` | `game` | @@ -97,7 +97,7 @@ bash …/run-wine-exe.sh --background --log /tmp/my-app.log --profile plain 'C:\ | Место на диске | `bash …/start.sh disk` | | GOG bottle: клиент | `bash …/gog/launch-galaxy.sh` | | GOG bottle: JA3 установка | `bash …/gog/install-ja3-innoextract.sh` | -| GOG bottle: JA3 запуск | `bash …/gog/run-ja3-crossover.sh` — [JA3_RUNBOOK.md](JA3_RUNBOOK.md) | +| GOG bottle: JA3 запуск | `bash …/gog/run-ja3.sh` — [JA3_RUNBOOK.md](JA3_RUNBOOK.md) | Полный список: `bash …/start.sh` без аргументов. @@ -147,7 +147,7 @@ export WINEMSYNC=1 WINEESYNC=1 | **Steam** | HoMM-OldenEra | `start.sh steam-ui` | Не параллельно с Steam.app | | **HoMM Olden Era** | HoMM-OldenEra | `start.sh play` | Не Play в Steam UI; нужен DXVK — §7 | | **GOG Galaxy 2.0** | HoMM-OldenEra | `start.sh gog` | Логин в Wine — best effort | -| **Jagged Alliance 3** | GOG-Install + CrossOver **JA3-GOG** | `gog/run-ja3-crossover.sh` | Установка: Whisky `install-ja3-innoextract.sh` ([runbook](JA3_RUNBOOK.md)) | +| **Jagged Alliance 3** | GOG-Install (Whisky) | `gog/run-ja3.sh` | Установка: `install-ja3-innoextract.sh` ([runbook](JA3_RUNBOOK.md)) | | **GOG Galaxy 2.0** | GOG-Install | `gog/launch-galaxy.sh` | Best effort; JA3 — **не** через Galaxy на этом Mac | | **Любой новый .exe** | свой / общий | `run-wine-exe.sh` | §2.1 | diff --git a/docs/games/WINE_MAC_RUNBOOK.md b/docs/games/WINE_MAC_RUNBOOK.md index 08bd7a6..96dd241 100644 --- a/docs/games/WINE_MAC_RUNBOOK.md +++ b/docs/games/WINE_MAC_RUNBOOK.md @@ -132,7 +132,7 @@ export_wine_env 1. Пять файлов в **`~/Games/`**: `setup_jagged_alliance_3_1.5.2_(80730).exe` + `-1.bin` … `-4.bin`. 2. Bottle **GOG-Install** (`gog/bottle.env`). 3. `bash …/gog/install-ja3-innoextract.sh` — распаковка в `drive_c/GOG Games/Jagged Alliance 3/`, `.bin` удаляются по мере чтения, после успеха — все архивы в `~/Games` (~15 GB). -4. Запуск: `bash …/gog/run-ja3-crossover.sh` (swap guard: см. [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §4, §10). +4. Запуск: `bash …/gog/run-ja3.sh` (swap guard: см. [JA3_RUNBOOK.md](JA3_RUNBOOK.md) §1, §6). Полный runbook: [JA3_MAC_WITHOUT_GALAXY.md](JA3_MAC_WITHOUT_GALAXY.md). diff --git a/docs/linux/fedora/MBP_INTEL_BCM4322_WIFI_RUNBOOK.md b/docs/linux/fedora/MBP_INTEL_BCM4322_WIFI_RUNBOOK.md new file mode 100644 index 0000000..c8f2b6e --- /dev/null +++ b/docs/linux/fedora/MBP_INTEL_BCM4322_WIFI_RUNBOOK.md @@ -0,0 +1,3 @@ +# Перенесено + +Документация и скрипты для Fedora на старом MacBook Pro Intel — в **[../old_mac/README.md](../old_mac/README.md)**. diff --git a/docs/mac/DISPLAY_FREEZE_RUNBOOK.md b/docs/mac/DISPLAY_FREEZE_RUNBOOK.md new file mode 100644 index 0000000..875389a --- /dev/null +++ b/docs/mac/DISPLAY_FREEZE_RUNBOOK.md @@ -0,0 +1,215 @@ +# MacBook Pro M1 — зависания после замены матрицы + +**Контекст:** заменена матрица (Built-in Liquid Retina XDR). После ремонта — повторяющиеся полные зависания системы. +**Инцидент:** 2026-06-16, ~4 зависания за час (21:31–21:43). +**Проверено:** 2026-06-16, логи `/Library/Logs/DiagnosticReports/`, `log show`, `last reboot`. + +См. также: [README.md](./README.md) + +--- + +## 1. Симптом + +| Что видит пользователь | Что в логах | +|------------------------|-------------| +| Экран и ввод «замирают», курсор не двигается | Нет записей в unified log на время freeze (дыра в логах) | +| Помогает только **удержание кнопки питания** | `btn_rst` / `finger_reset` в `forceReset-full-*.diag` | +| Зависания повторяются **сразу после перезагрузки** (через 2–9 мин) | Аптайм в отчётах: 155 с, 537 с | +| Не kernel panic с диалогом «перезагрузить» | Нет свежих `panic-full-*.panic` за 16.06; только `forceReset` | + +Это **hard lockup** (полная неотзывчивость SoC), а не обычный краш приложения. + +--- + +## 2. Хронология 2026-06-16 + +| Время | Событие | Аптайм до freeze | +|-------|---------|------------------| +| ~19:19 | Загрузка (сессия до первого сбоя) | — | +| 21:24–21:26 | Telegram: отчёт `cpu_resource` (~55% CPU за 3 мин) | ~2 ч | +| **21:31** | `forceReset-full-2026-06-16-213115` · `btn_rst` | **~7921 с (~2 ч 12 мин)** | +| **21:34** | `forceReset-full-2026-06-16-213425` · `btn_rst` | **~155 с (~2.5 мин)** | +| 21:34–21:37 | `deleted` (CacheDelete): `cpu_resource` (~52% CPU) | после 2-го reboot | +| **21:43** | `forceReset-full-2026-06-16-214334` · `btn_rst` | **~537 с (~9 мин)** | + +`last reboot`: + +``` +reboot Tue Jun 16 21:43 +reboot Tue Jun 16 21:34 +reboot Tue Jun 16 21:31 +``` + +В логах — **пропуск ~18 мин** (21:33 → 21:51): пока система зависла, запись остановилась. + +--- + +## 3. RCA — что зафиксировано в отчётах + +### 3.1 Тип сбоя: принудительный reset + +Все три отчёта за 16.06: + +``` +panic(cpu N caller ...): btn_rst +Debugger message: panic +Boot faults: btn_rst, finger_reset, force_off (в ResetCounter) +``` + +`btn_rst` = ядро зафиксировало сброс **кнопкой питания**, когда система уже не отвечала. Это не программный panic с stack trace приложения. + +Файлы: + +- `/Library/Logs/DiagnosticReports/forceReset-full-2026-06-16-213115.0002.diag` +- `/Library/Logs/DiagnosticReports/forceReset-full-2026-06-16-213425.0002.diag` +- `/Library/Logs/DiagnosticReports/forceReset-full-2026-06-16-214334.0002.diag` +- `/Library/Logs/DiagnosticReports/ResetCounter-2026-06-16-213129.diag` (и 213438, 214346) + +### 3.2 Главный подозреваемый: WindowServer (графический стек) + +Снимок процессов **на момент зависания** (поле `systemTimeTask`): + +| Freeze | Аптайм | WindowServer CPU time | Паттерн потоков | +|--------|--------|----------------------|-----------------| +| 21:31 | ~2 ч 12 мин | **714 с** | потоки ждут `semaphore port ... owned by pid` **самого WindowServer** | +| 21:34 | ~2.5 мин | **15 с** | то же — deadlock на semaphore | +| 21:43 | ~9 мин | **49 с** | то же — deadlock на semaphore | + +WindowServer — процесс отрисовки всего UI (SkyLight). Потоки, ждущие semaphore у того же PID, — типичный **deadlock в графическом конвейере**. + +Рядом в снимках присутствуют процессы дисплейного стека: + +- `corebrightnessd` — яркость / подсветка +- `IOMFB_bics_daemon` — framebuffer (IOMFB) +- `backboardd` — события ввода / дисплей + +### 3.3 Что **не** найдено в открытых логах + +Поиск за 3 ч по `DCP`, `IOMFB`, `CLCD`, `backlight`, `GPU reset`, `panel`, `LCD`: + +- **Нет** явных ошибок драйвера дисплея или DCP +- Только штатные записи (`mobileassetd`, `backlightservices`, уведомления) + +Apple часто **не пишет** аппаратные ошибки шлейфа/матрицы в открытый unified log. Отсутствие строк не опровергает аппаратную причину. + +### 3.4 Дополнительная нагрузка (усиливающие факторы) + +| Процесс | Когда | Наблюдение | +|---------|-------|------------| +| **Telegram** | 21:24–21:26 | `cpu_resource`: ~55% CPU за 162 с | +| **deleted** (CacheDelete) | 21:34–21:37 | `cpu_resource`: ~52% CPU, 88 с после boot | +| **mds** / Spotlight | после каждого reboot | активная индексация (`mdworker_shared`) | +| **Память** | на момент проверки | 16 GB почти заняты, ~7.8 GB в compressor, свободно ~140 MB | + +Высокая нагрузка и давление на память **усиливают** нестабильность, но паттерн WindowServer-deadlock + быстрые повторы после reboot указывают на проблему **графики/дисплея**, а не только на фоновые процессы. + +### 3.5 История до 16.06 (система нестабильна несколько дней) + +| Период | Тип отчётов | Характер | +|--------|-------------|----------| +| 10–11.06 | `shutdown_stall` | зависание при выключении | +| 12–14.06 | `panic-full` + `shutdown_stall` | `Wake transition timed out after 35 seconds` · suspected: `com.apple.driver.AppleSEPManager` | +| 15.06 | `forceReset` (21:42) + `shutdown_stall` | тот же `btn_rst` | +| 16.06 | 3× `forceReset` за час | WindowServer deadlock | + +До замены матрицы уже были сбои power management (SEP / wake). После ремонта доминирует другой профиль: **GUI freeze через WindowServer**, в том числе через несколько минут после загрузки. + +--- + +## 4. Связь с заменой матрицы + +Прямых строк «ошибка шлейфа» в логах нет. Косвенные признаки, согласующиеся с ремонтом дисплея: + +1. **WindowServer стабильно уходит в deadlock** на всех трёх снимках +2. В стеке рядом — `corebrightnessd`, `IOMFB_bics_daemon` +3. Зависания **сразу после reboot** (2.5 и 9 мин) — типично для драйвера/железа дисплея, а не для «прогрева» одного приложения +4. Полный lockup (`btn_rst`) без kernel panic — возможен при зависании GPU/DCP-конвейера + +**Вероятные аппаратные причины (для сервиса):** + +- плохой контакт **шлейфа матрицы** (eDP/LVDS) +- повреждение или неправильная укладка **кабеля дисплея** +- несовместимая или дефектная **матрица** для `MacBookPro18,1` (Liquid Retina XDR) +- ошибка сборки: винты, заземление, T-Con / подсветка + +--- + +## 5. Действия + +### 5.1 Сервис (приоритет) + +Вернуть в сервис с этим runbook. Попросить проверить: + +1. Посадку шлейфа матрицы и display cable на обоих концах +2. Отсутствие перекоса / залома шлейфа при закрытии крышки +3. Совместимость матрицы с **MacBookPro18,1** (Liquid Retina XDR, не «похожая» панель) +4. Корректность сборки подсветки и T-Con + +### 5.2 Диагностика на Mac + +**Apple Diagnostics** (нативная): + +1. Выключить Mac +2. Зажать питание → «Параметры» → «Диагностика» + +**Safe Mode** (отсечь сторонние драйверы/агенты): + +1. Выключить → зажать питание → «Продолжить с безопасным режимом» +2. Если в Safe Mode стабильно час+ — сильнее аргумент в пользу софта/агентов; если снова freeze — железо/драйвер дисплея + +**Минимальная нагрузка после reboot:** + +- не открывать Cursor, Brave, Telegram сразу после загрузки +- проверить, воспроизводится ли freeze на пустом рабочем столе + +### 5.3 Мониторинг + +```bash +# последние force reset +ls -lt /Library/Logs/DiagnosticReports/forceReset-full-* | head -5 + +# причина в заголовке отчёта +head -12 /Library/Logs/DiagnosticReports/forceReset-full-*.0002.diag | \ + grep -o 'panic(cpu[^\\]*' + +# ошибки WindowServer +log stream --predicate 'process == "WindowServer"' --level error + +# перезагрузки +last reboot | head -10 +``` + +После следующего зависания **не перезагружать сразу** (если возможно подождать 1–2 мин) — иногда успевает дописаться больше в `/Library/Logs/DiagnosticReports/`. На практике при hard lockup это редко помогает; основные данные уже в `forceReset-full`. + +--- + +## 6. Краткий вывод + +| Вопрос | Ответ | +|--------|-------| +| Это kernel panic? | Нет (16.06). Это **hard lockup** → сброс кнопкой (`btn_rst`) | +| Сколько зафиксировано 16.06? | **3** отчёта `forceReset`; пользователь сообщал о ~4 зависаниях | +| Что зависало? | **WindowServer** — deadlock, графический стек | +| Есть ли ошибки DCP/шлейфа в логах? | **Нет** в открытом unified log | +| Главная рекомендация | **Перепроверка шлейфа и сборки дисплея в сервисе** | +| Была ли нестабильность раньше? | Да, с 10–11.06 (`shutdown_stall`, SEP wake timeout) | + +--- + +## 7. Ссылки на файлы отчётов + +``` +/Library/Logs/DiagnosticReports/forceReset-full-2026-06-16-213115.0002.diag +/Library/Logs/DiagnosticReports/forceReset-full-2026-06-16-213425.0002.diag +/Library/Logs/DiagnosticReports/forceReset-full-2026-06-16-214334.0002.diag +/Library/Logs/DiagnosticReports/ResetCounter-2026-06-16-213129.diag +/Library/Logs/DiagnosticReports/ResetCounter-2026-06-16-213438.diag +/Library/Logs/DiagnosticReports/ResetCounter-2026-06-16-214346.diag +/Library/Logs/DiagnosticReports/Telegram_2026-06-16-212645_Eternals.cpu_resource.diag +/Library/Logs/DiagnosticReports/deleted_2026-06-16-213726_Eternals.cpu_resource.diag + +# более ранние (контекст) +/Library/Logs/DiagnosticReports/panic-full-2026-06-14-115455.0002.panic # Wake transition / SEP +/Library/Logs/DiagnosticReports/panic-full-2026-06-13-155145.0002.panic +/Library/Logs/DiagnosticReports/forceReset-full-2026-06-15-194242.0002.diag +``` diff --git a/docs/mac/README.md b/docs/mac/README.md new file mode 100644 index 0000000..c962e09 --- /dev/null +++ b/docs/mac/README.md @@ -0,0 +1,42 @@ +# Mac — основной MacBook (Apple Silicon) + +Контур для **MacBook Pro M1 Pro** (`MacBookPro18,1`): диагностика, нестабильность, дисплей. + +**Проверено:** 2026-06-16 + +--- + +## Документы + +| Документ | Назначение | +|----------|------------| +| **[DISPLAY_FREEZE_RUNBOOK.md](./DISPLAY_FREEZE_RUNBOOK.md)** | Зависания после замены матрицы: RCA по логам, хронология, действия | + +--- + +## Железо (справка) + +| Параметр | Значение | +|----------|----------| +| Модель | MacBook Pro 14" (`MacBookPro18,1`) | +| Чип | Apple M1 Pro, 10 ядер, 16 GB RAM | +| Дисплей | Built-in Liquid Retina XDR, 3456×2234 | +| ОС | macOS 15.3.1 (24D70) | +| Серийник | X47KCRG26W | + +--- + +## Быстрая диагностика зависания + +```bash +# последние принудительные перезагрузки (кнопка питания) +ls -lt /Library/Logs/DiagnosticReports/forceReset-full-* | head -5 + +# история перезагрузок +last reboot | head -10 + +# ошибки WindowServer в реальном времени +log stream --predicate 'process == "WindowServer"' --level error +``` + +Подробно: [DISPLAY_FREEZE_RUNBOOK.md](./DISPLAY_FREEZE_RUNBOOK.md) diff --git a/docs/old_mac/BLUETOOTH_FILE_TRANSFER.md b/docs/old_mac/BLUETOOTH_FILE_TRANSFER.md new file mode 100644 index 0000000..7b22c44 --- /dev/null +++ b/docs/old_mac/BLUETOOTH_FILE_TRANSFER.md @@ -0,0 +1,237 @@ +# Передача файлов Mac → Fedora (Bluetooth) + +**Откуда:** этот Mac (Apple Silicon / основной) +**Куда:** MacBook Pro Intel с Fedora 43 (устройство Bluetooth: **fedora**, `60:FB:42:7D:2D:66`) +**Проверено:** 2026-06-16 + +Связанные документы: [README.md](./README.md), [RUNBOOK.md](./RUNBOOK.md) (Wi‑Fi BCM4322). + +--- + +## 1. Быстрый путь (канон) + +### Шаг 1 — Fedora: включить приём **до** отправки + +Blueman (иконка Bluetooth в трее) → **«Принять файл»** / **Receive a File**. + +Должен появиться диалог **«Ожидание входящего файла…»**. +Без этого Mac отправит файл, но на Fedora **ничего не произойдёт** — диалога не будет. + +### Шаг 2 — Mac: отправить + +```bash +# delivery-архив Wi-Fi fix (по умолчанию) +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh + +# любой другой файл +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh /path/to/file.tar.gz +``` + +В окне **Bluetooth File Exchange** выбрать **fedora** → **Send** / **Отправить**. + +### Шаг 3 — Fedora: проверить + +Файл обычно в `~/Downloads` или `~/Bluetooth`: + +```bash +ls -la ~/Downloads/ +``` + +--- + +## 2. RCA: почему «отправилось», а на Fedora тишина + +| Что видели | Причина | +|------------|---------| +| AppleScript пишет «send выполнена» | macOS **не запускает** OBEX-приём на Linux автоматически | +| Окно на Mac открылось, Fedora молчит | На Fedora **не был включён** «Принять файл» | +| `bnep0` / PAN не связан с файлами | Передача файлов — **OBEX**, не PAN | +| Устройство paired, но не Connected | На Fedora: Bluetooth on, Trust Mac, оставить в зоне видимости | + +**Правило:** сначала **приём на Fedora**, потом **отправка с Mac**. + +--- + +## 3. Предварительные условия + +### Сопряжение (один раз) + +**Fedora:** + +```bash +bluetoothctl +power on +agent on +default-agent +scan on +# найти Mac по имени, затем: +pair +trust +``` + +**Mac:** Системные настройки → Bluetooth → подтвердить сопряжение. + +### Перед каждой передачей + +**Mac** — fedora в **Connected**: + +```bash +system_profiler SPBluetoothDataType | grep -A6 "Connected:" +# должно быть: fedora (60:FB:42:7D:2D:66) +``` + +**Fedora** — Blueman установлен: + +```bash +sudo dnf install blueman bluez-obexd +blueman-applet & +``` + +--- + +## 4. Подробно: Fedora (приём) + +### Способ A — Blueman GUI (рекомендуется) + +1. Иконка Bluetooth в трее (Blueman). +2. **Принять файл** / **Receive a File**. +3. Ждать диалог «Ожидание входящего файла…». +4. **Не закрывать** до завершения передачи. + +### Способ B — скрипт-подсказка + +Если скрипт уже есть на Fedora (после первой передачи или скопирован вручную): + +```bash +bash prepare-receive-fedora.sh +``` + +Скрипт напомнит про Blueman и будет ждать файл в `~/Downloads`. +Сам по себе **не заменяет** пункт «Принять файл» в Blueman (без `obexpushd`). + +### Куда попадает файл + +| Среда | Путь | +|-------|------| +| GNOME + Blueman | `~/Downloads` | +| KDE | `~/Downloads` или `~/Bluetooth` | +| obexpushd | каталог из `-p` | + +--- + +## 5. Подробно: Mac (отправка) + +### Способ A — скрипт (рекомендуется) + +```bash +# Wi-Fi fix archive (готовый) +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh + +# произвольный файл +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh ~/Desktop/myfile.tar.gz + +# другое имя BT-устройства (если не «fedora») +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh myfile.zip my-fedora +``` + +Скрипт проверяет, что **fedora** в Connected, и открывает **Bluetooth File Exchange**. + +### Способ B — вручную (без скрипта) + +1. Finder → файл → ПКМ → **Поделиться** → **Bluetooth** + **или** открыть `/System/Applications/Utilities/Bluetooth File Exchange.app` +2. Перетащить файл в окно / File → Send File… +3. Выбрать **fedora** → **Send** + +### Способ C — из терминала (то же GUI) + +```bash +open -a "Bluetooth File Exchange" /path/to/file.tar.gz +``` + +Дальше вручную выбрать **fedora** → **Send**. + +--- + +## 6. Что отправлять (Wi‑Fi fix) + +Готовый архив для Fedora: + +```text +docs/old_mac/deliverable/fedora-bcm4322-wifi-fix.tar.gz +``` + +Пересобрать: + +```bash +bash ~/code/local_machine/docs/old_mac/scripts/build-delivery-archive.sh +``` + +После приёма на Fedora: + +```bash +cd ~/Downloads +tar xzf fedora-bcm4322-wifi-fix.tar.gz +cd fedora-bcm4322-wifi-fix +sudo bash install-bcm4322-firmware-fedora.sh +sudo reboot +``` + +--- + +## 7. Диагностика + +### Mac + +```bash +system_profiler SPBluetoothDataType | grep -A8 "Connected:" +pgrep -lf "Bluetooth File Exchange" +``` + +### Fedora + +```bash +bluetoothctl devices +bluetoothctl info 60:FB:42:7D:2D:66 # MAC этого Mac — подставить свой +systemctl --user status obex +journalctl -b -u bluetooth | tail -30 +ls -la ~/Downloads/ ~/Bluetooth/ 2>/dev/null +``` + +### Типичные ошибки + +| Симптом | Действие | +|---------|----------| +| Нет диалога приёма на Fedora | Blueman → **Принять файл** **до** Send на Mac | +| «fedora не в Connected» на Mac | Fedora: BT on, Trust, не спать | +| Передача оборвалась | Файл < 50 MB надёжнее; повторить с шага 1 | +| Blueman нет в трее | `blueman-applet &` | +| obex не стартует | `sudo dnf install bluez-obexd blueman` | + +--- + +## 8. Альтернативы Bluetooth + +Если BT-файлы не идут: + +| Способ | Когда | +|--------|-------| +| **USB-флешка** | Самый надёжный offline | +| **USB tether** телефон → Fedora, `scp` с Mac в локалку | Если есть общая сеть | +| **Телефон как посредник** | Mac → телефон → Fedora (USB/BT) | + +--- + +## 9. Порядок действий (шпаргалка) + +```text +[FEDORA] Blueman → Принять файл → «Ожидание…» +[MAC] bash …/send-to-fedora-bluetooth.sh +[MAC] Bluetooth File Exchange → fedora → Send +[FEDORA] Файл в ~/Downloads +[FEDORA] tar xzf … && sudo bash install-….sh +``` + +--- + +*docs/old_mac — local_machine* diff --git a/docs/old_mac/README.md b/docs/old_mac/README.md new file mode 100644 index 0000000..37eef80 --- /dev/null +++ b/docs/old_mac/README.md @@ -0,0 +1,88 @@ +# Old Mac — Fedora 43 на MacBook Pro Intel + +Контур для **старого MacBook Pro (Intel)** с Fedora 43: Wi‑Fi Broadcom BCM4322, offline firmware, передача файлов с основного Mac. + +--- + +## Документы + +| Документ | Назначение | +|----------|------------| +| **[REMOTE_ACCESS.md](./REMOTE_ACCESS.md)** | **SSH и удалённое управление (хотспот / BT PAN)** | +| **[BLUETOOTH_FILE_TRANSFER.md](./BLUETOOTH_FILE_TRANSFER.md)** | Передача файлов Mac → Fedora по Bluetooth | +| [RUNBOOK.md](./RUNBOOK.md) | Wi‑Fi BCM4322: диагностика, firmware, PAN | +| [deliverable/fedora-bcm4322-wifi-fix.tar.gz](./deliverable/fedora-bcm4322-wifi-fix.tar.gz) | Архив для установки Wi‑Fi на Fedora | + +--- + +## Удалённое управление (SSH) + +Оба на хотспоте телефона; прямой ping часто блокируется **изоляцией клиентов** → обход через **Bluetooth PAN**. + +```bash +# Mac (один раз) +bash ~/code/local_machine/docs/old_mac/scripts/setup-remote-mac.sh ВАШ_ЛОГИН_FEDORA +bash ~/code/local_machine/docs/old_mac/scripts/build-remote-access-archive.sh +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh \ + ~/code/local_machine/docs/old_mac/deliverable/fedora-remote-access.tar.gz + +# Fedora (после приёма архива) +sudo bash setup-ssh-fedora.sh ВАШ_ЛОГИН + +# Mac — подключение +bash ~/code/local_machine/docs/old_mac/scripts/connect-fedora.sh +``` + +Подробно: [REMOTE_ACCESS.md](./REMOTE_ACCESS.md) + +--- + +**Порядок:** сначала приём на Fedora, потом отправка с Mac. + +1. **Fedora:** Blueman → **«Принять файл»** → «Ожидание входящего файла…» +2. **Mac:** + ```bash + bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh + ``` +3. **Mac:** Bluetooth File Exchange → **fedora** → **Send** + +Подробно: [BLUETOOTH_FILE_TRANSFER.md](./BLUETOOTH_FILE_TRANSFER.md) + +--- + +## Wi‑Fi fix (после приёма архива) + +```bash +cd ~/Downloads +tar xzf fedora-bcm4322-wifi-fix.tar.gz +cd fedora-bcm4322-wifi-fix +sudo bash install-bcm4322-firmware-fedora.sh +sudo reboot +``` + +--- + +## Скрипты (на этом Mac) + +```bash +# Отправить файл (по умолчанию — Wi-Fi архив) +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh /path/to/anyfile.tar.gz + +# Пересобрать delivery-архив +bash ~/code/local_machine/docs/old_mac/scripts/build-delivery-archive.sh +bash ~/code/local_machine/docs/old_mac/scripts/download-bcm4322-offline-bundle.sh +``` + +На Fedora перед приёмом: `scripts/prepare-receive-fedora.sh` (подсказка; Blueman обязателен). + +--- + +## Железо + +- **Fedora Mac:** MacBook Pro Intel, BCM4322, Fedora 43, ядро `6.17.1-300.fc43.x86_64` +- **BT-устройство:** fedora (`60:FB:42:7D:2D:66`) + +--- + +*local_machine / docs/old_mac* diff --git a/docs/old_mac/REMOTE_ACCESS.md b/docs/old_mac/REMOTE_ACCESS.md new file mode 100644 index 0000000..caedcc0 --- /dev/null +++ b/docs/old_mac/REMOTE_ACCESS.md @@ -0,0 +1,221 @@ +# Удалённое управление Fedora MacBook с Mac (хотспот телефона) + +**Схема:** оба ноутбука на Wi‑Fi хотспоте Redmi; прямой SSH часто **блокируется изоляцией клиентов** — обход через Bluetooth PAN. + +**Проверено:** 2026-06-16 · `fedora.local` → `10.23.120.30`, ping с Mac **не проходит** (AP isolation). + +--- + +## 1. Быстрый путь + +### A. Один раз — Mac + +```bash +bash ~/code/local_machine/docs/old_mac/scripts/setup-remote-mac.sh ВАШ_ЛОГИН_FEDORA +bash ~/code/local_machine/docs/old_mac/scripts/build-remote-access-archive.sh +bash ~/code/local_machine/docs/old_mac/scripts/send-to-fedora-bluetooth.sh \ + ~/code/local_machine/docs/old_mac/deliverable/fedora-remote-access.tar.gz +``` + +### B. Один раз — Fedora (после приёма архива по BT) + +Логин: **`p`** + +```bash +cd ~/Downloads +tar xzf fedora-remote-access.tar.gz +cd fedora-remote-access +sudo bash setup-ssh-fedora.sh p +sudo bash setup-bt-pan-fedora.sh +``` + +### C. Подключение с Mac + +```bash +bash ~/code/local_machine/docs/old_mac/scripts/bootstrap-ssh-fedora.sh # один раз, копирует ключ +bash ~/code/local_machine/docs/old_mac/scripts/connect-fedora.sh # дальше без пароля +``` + +Пароль хранится локально: `~/.config/old_mac/fedora.env` (см. `fedora.env.example`). + +### D. RDP (графический стол, xrdp :3389) + +На Fedora уже может быть xrdp. С Mac: + +```bash +brew install freerdp # один раз +bash ~/code/local_machine/docs/old_mac/scripts/connect-rdp-fedora.sh +``` + +Или **Microsoft Remote Desktop** (App Store): PC `fedora.local` или `10.23.120.30`, port **3389**, user **`p`**. + +RDP и SSH одинаково **не достучатся**, пока нет L3 между Mac и Fedora (изоляция хотспота / нет BT PAN). + +--- + +## 2. Диагностика сети хотспота + +```bash +bash ~/code/local_machine/docs/old_mac/scripts/discover-fedora.sh +``` + +| Результат | Значение | +|-----------|----------| +| `fedora.local` резолвится | Fedora в той же Wi‑Fi сети | +| `ping: ok` | Можно SSH по LAN (`ssh fedora-mbp`) | +| `ping: FAIL` + mDNS есть | **Изоляция клиентов** на телефоне → §4 BT PAN | +| `ssh:22 open` | `connect-fedora.sh` должен работать | + +Текущая типичная картина: + +```text +Mac: 10.23.120.84/24 +Gateway: 10.23.120.139 (телефон) +Fedora: 10.23.120.30 (fedora.local) +Ping Mac→Fedora: FAIL (изоляция) +``` + +--- + +## 3. Путь LAN (если ping проходит) + +### 3.1 Отключить изоляцию на Redmi Note 14 + +Настройки → Режим модема / Точка доступа → **Дополнительно**: + +- **AP isolation** / **Изоляция клиентов** → **Выкл** +- **Разрешить устройствам в сети видеть друг друга** → **Вкл** (если есть) + +Переподключить Wi‑Fi на **обоих** Mac. Проверка: + +```bash +ping -c2 fedora.local +bash ~/code/local_machine/docs/old_mac/scripts/connect-fedora.sh +``` + +### 3.2 SSH на Fedora + +```bash +sudo bash setup-ssh-fedora.sh USER +``` + +### 3.3 SSH с Mac + +```bash +ssh fedora-mbp # ~/.ssh/config +# или +bash connect-fedora.sh +``` + +--- + +## 4. Путь Bluetooth PAN (обход изоляции хотспота) + +Прямой линк **Mac ↔ Fedora** поверх Bluetooth, минуя Wi‑Fi хотспота. + +### 4.1 Fedora — PAN-сервер + +```bash +sudo bash setup-bt-pan-fedora.sh +``` + +Остаётся работать в фоне (`bt-network -s nap pan0`), IP Fedora: **172.20.99.1/24**. + +### 4.2 Mac — подключить PAN + +1. **Bluetooth** → устройство **fedora** → **Connect** + (профиль «Сеть» / Network Access Point / NAP — если спросит) +2. Настроить IP: + +```bash +bash ~/code/local_machine/docs/old_mac/scripts/setup-bt-pan-mac.sh +``` + +Mac получит **172.20.99.2/24**, ping Fedora: + +```bash +ping -c2 172.20.99.1 +``` + +### 4.3 SSH + +```bash +ssh fedora-mbp-bt +# или +bash ~/code/local_machine/docs/old_mac/scripts/connect-fedora.sh +``` + +--- + +## 5. Альтернатива: Internet Sharing (Mac → Fedora) + +Если PAN с ручными IP капризничает: + +1. **Mac:** Системные настройки → Общий доступ → **Общий интернет** + - Раздать от: **Wi‑Fi** + - Кому: **Bluetooth PAN** +2. **Fedora:** Bluetooth → подключиться к Mac как к сети +3. Fedora получит `192.168.2.x`, Mac обычно `192.168.2.1` +4. На Fedora узнать IP: `ip -4 addr show bnep0` +5. Добавить в Mac `~/.ssh/config` HostName с этим IP или `connect-fedora.sh` + +--- + +## 6. Скрипты + +| Скрипт | Где | Назначение | +|--------|-----|------------| +| `setup-remote-mac.sh` | Mac | SSH-ключ + `~/.ssh/config` | +| `build-remote-access-archive.sh` | Mac | Архив для Fedora | +| `send-to-fedora-bluetooth.sh` | Mac | Передать архив | +| `discover-fedora.sh` | Mac | Найти Fedora, проверить LAN | +| `connect-fedora.sh` | Mac | SSH (LAN или BT) | +| `setup-ssh-fedora.sh` | Fedora | sshd + authorized_keys | +| `setup-bt-pan-fedora.sh` | Fedora | BT PAN сервер | +| `setup-bt-pan-mac.sh` | Mac | IP на bnep0 | + +--- + +## 7. SSH config (на Mac после setup-remote-mac) + +```ssh-config +Host fedora-mbp old-mac-fedora fedora + User ВАШ_ЛОГИН + HostName fedora.local + IdentityFile ~/.ssh/id_ed25519_fedora + +Host fedora-mbp-bt + HostName 172.20.99.1 + ... +``` + +--- + +## 8. Устранение неполадок + +| Проблема | Решение | +|----------|---------| +| Permission denied (publickey) | На Fedora: `setup-ssh-fedora.sh`, проверить `mac_pubkey.txt` | +| Connection refused :22 | `sudo systemctl start sshd` | +| No route to host (Wi‑Fi) | Изоляция хотспота → §4 BT PAN | +| Нет bnep0 на Mac | Fedora `setup-bt-pan-fedora.sh` + Bluetooth Connect | +| Fedora Wi‑Fi ещё без firmware | BT PAN или BT file transfer для архивов | + +--- + +## 9. Дерево решений + +```mermaid +flowchart TD + A[Нужен SSH на Fedora] --> B{ping fedora.local?} + B -->|ok| C[setup-ssh-fedora + ssh fedora-mbp] + B -->|fail| D[Изоляция хотспота] + D --> E{Можно выкл. AP isolation?} + E -->|да| C + E -->|нет| F[setup-bt-pan-fedora + setup-bt-pan-mac] + F --> G[ssh fedora-mbp-bt] +``` + +--- + +*docs/old_mac — local_machine* diff --git a/docs/old_mac/RUNBOOK.md b/docs/old_mac/RUNBOOK.md new file mode 100644 index 0000000..2b39226 --- /dev/null +++ b/docs/old_mac/RUNBOOK.md @@ -0,0 +1,116 @@ +# Fedora 43 на MacBook Pro (Intel) — BCM4322 Wi‑Fi runbook + +**Железо:** MacBook Pro Intel, Broadcom **BCM4322**, драйвер ядра **b43** +**ОС:** Fedora 43 Workstation, рабочее ядро `6.17.1-300.fc43.x86_64` +**Проверено:** 2026-06-16 + +**Архив для установки:** `deliverable/fedora-bcm4322-wifi-fix.tar.gz` + +**Передача Mac → Fedora:** см. **[BLUETOOTH_FILE_TRANSFER.md](./BLUETOOTH_FILE_TRANSFER.md)** (порядок: приём на Fedora, затем Send с Mac). + +--- + +## 1. Быстрый путь (Wi‑Fi fix) + +```bash +cd ~/Downloads +tar xzf fedora-bcm4322-wifi-fix.tar.gz +cd fedora-bcm4322-wifi-fix +sudo bash install-bcm4322-firmware-fedora.sh +sudo reboot +nmcli device wifi list +nmcli device wifi connect "SSID" password "пароль" +``` + +--- + +## 2. RCA + +| Симптом | Причина | Решение | +|---------|---------|---------| +| `Broadcom 4322 WLAN found`, Wi‑Fi нет | Драйвер b43 есть, **firmware нет** | `ucode16_mimo.fw` в `/lib/firmware/b43/` | +| `b43-fwcutter` установлен | Это утилита, не firmware | Установить `.fw` файлы | +| BT PAN: `bnep0` connect → disconnect | Профиль NM / телефон | §4.2 | +| `dnf` timeout | Нет интернета | Offline-архив или USB tether | + +**Не переустанавливать Fedora** — BCM4322 снова потребует firmware. + +--- + +## 3. Диагностика + +```bash +uname -r +lspci -nn | grep -i network +lsmod | grep -E 'b43|bcma|ssb' +sudo dmesg | grep -i b43 +nmcli device +ls -la /lib/firmware/b43/ucode16_mimo.fw +``` + +--- + +## 4. Интернет до установки firmware + +### USB tethering (предпочтительно) + +Redmi Note 14 → USB-модем → на Fedora `nmcli device` → `ping 8.8.8.8`. + +### Bluetooth PAN + +```bash +nmcli connection delete "Redmi Note 14 Network" +sudo systemctl restart bluetooth +bluetoothctl +# power on / agent on / default-agent / pair / trust / connect +``` + +На телефоне: Bluetooth-модем вкл., пересопрячь Fedora. + +### Онлайн-путь (если интернет есть) + +```bash +sudo dnf install rpmfusion-nonfree-release-tainted +sudo dnf install b43-firmware +sudo reboot +``` + +**Не ставить `akmod-wl`** на BCM4322. + +--- + +## 5. После установки + +```bash +sudo dmesg | grep -i b43 # нет "firmware ... not found" +nmcli device # wlan0 / wlp* +nmcli radio wifi on +nmcli device wifi list +``` + +Опционально (стабильность): + +```bash +sudo iw dev set power_save off +``` + +--- + +## 6. Ядро + +Рабочее: **6.17.1-300.fc43.x86_64**. В GRUB не выбирать 7.0.12, если загрузка нестабильна. + +--- + +## 7. Цель + +| Компонент | Состояние | +|-----------|-----------| +| Firmware | `/lib/firmware/b43/ucode16_mimo.fw` | +| Драйвер | `b43` без ошибок в dmesg | +| Интерфейс | `wlan0` / `wlp*` в nmcli | +| Сеть | Wi‑Fi connect работает | + +--- + +*docs/old_mac — local_machine* diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/MANIFEST.txt b/docs/old_mac/bundle/bcm4322-offline-bundle/MANIFEST.txt new file mode 100644 index 0000000..a704535 --- /dev/null +++ b/docs/old_mac/bundle/bcm4322-offline-bundle/MANIFEST.txt @@ -0,0 +1,7 @@ +BCM4322 b43 firmware offline bundle +Built: 2026-06-16 +Source: broadcom-wl-6.30.163.46 via b43-fwcutter +Files: 155 +Tarball: bcm4322-firmware-bundle.tar.gz +SHA256 tarball: 06d3f492c064c0db5549cf4e4bc5bd8fa40c15f3427ca02ec6a5d51f918b6032 +SHA256 b43/ucode16_mimo.fw: 614c233b2f65653d298f74f64120068f84d031a40e3d37b68779ab7583fe574d diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0bsinitvals5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0bsinitvals5.fw new file mode 100644 index 0000000..6cc3654 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0bsinitvals5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0bsinitvals9.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0bsinitvals9.fw new file mode 100644 index 0000000..8a6c3d4 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0bsinitvals9.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0initvals5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0initvals5.fw new file mode 100644 index 0000000..0dbd65b Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0initvals5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0initvals9.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0initvals9.fw new file mode 100644 index 0000000..571bcdf Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g0initvals9.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals13.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals13.fw new file mode 100644 index 0000000..d7252bd Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals13.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals5.fw new file mode 100644 index 0000000..7da54a6 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals9.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals9.fw new file mode 100644 index 0000000..a6ca748 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1bsinitvals9.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals13.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals13.fw new file mode 100644 index 0000000..f287aa9 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals13.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals5.fw new file mode 100644 index 0000000..a5e4109 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals9.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals9.fw new file mode 100644 index 0000000..af15ed9 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/a0g1initvals9.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac0bsinitvals40.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac0bsinitvals40.fw new file mode 100644 index 0000000..68984e3 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac0bsinitvals40.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac0initvals40.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac0initvals40.fw new file mode 100644 index 0000000..f852604 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac0initvals40.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac1bsinitvals42.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac1bsinitvals42.fw new file mode 100644 index 0000000..68984e3 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac1bsinitvals42.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac1initvals42.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac1initvals42.fw new file mode 100644 index 0000000..1c13ab2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac1initvals42.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac2bsinitvals41.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac2bsinitvals41.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac2bsinitvals41.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac2initvals41.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac2initvals41.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac2initvals41.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac3bsinitvals43.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac3bsinitvals43.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac3bsinitvals43.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac3initvals43.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac3initvals43.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ac3initvals43.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals13.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals13.fw new file mode 100644 index 0000000..ada3f88 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals13.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals5.fw new file mode 100644 index 0000000..501bb00 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals9.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals9.fw new file mode 100644 index 0000000..5db1ff0 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0bsinitvals9.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals13.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals13.fw new file mode 100644 index 0000000..6f40ba9 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals13.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals5.fw new file mode 100644 index 0000000..baf2d9d Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals9.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals9.fw new file mode 100644 index 0000000..640e116 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/b0g0initvals9.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0bsinitvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0bsinitvals26.fw new file mode 100644 index 0000000..d075603 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0bsinitvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0bsinitvals29.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0bsinitvals29.fw new file mode 100644 index 0000000..06850cf Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0bsinitvals29.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0initvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0initvals26.fw new file mode 100644 index 0000000..ddaa973 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0initvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0initvals29.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0initvals29.fw new file mode 100644 index 0000000..db62e71 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ht0initvals29.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals24.fw new file mode 100644 index 0000000..19cf197 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals25.fw new file mode 100644 index 0000000..8f6054c Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals26.fw new file mode 100644 index 0000000..b74105a Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0bsinitvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals24.fw new file mode 100644 index 0000000..cd1ec3e Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals25.fw new file mode 100644 index 0000000..60c402b Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals26.fw new file mode 100644 index 0000000..1cace89 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn0initvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals24.fw new file mode 100644 index 0000000..19cf197 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals25.fw new file mode 100644 index 0000000..8f6054c Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals26.fw new file mode 100644 index 0000000..b74105a Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1bsinitvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals24.fw new file mode 100644 index 0000000..cd1ec3e Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals25.fw new file mode 100644 index 0000000..60c402b Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals26.fw new file mode 100644 index 0000000..1cace89 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn1initvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals24.fw new file mode 100644 index 0000000..19cf197 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals25.fw new file mode 100644 index 0000000..8f6054c Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals26.fw new file mode 100644 index 0000000..b74105a Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2bsinitvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals24.fw new file mode 100644 index 0000000..cd1ec3e Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals25.fw new file mode 100644 index 0000000..60c402b Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals26.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals26.fw new file mode 100644 index 0000000..1cace89 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn2initvals26.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn400bsinitvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn400bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn400bsinitvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn400initvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn400initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn400initvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn401bsinitvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn401bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn401bsinitvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn401initvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn401initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn401initvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn402bsinitvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn402bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn402bsinitvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn402initvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn402initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn402initvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn403bsinitvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn403bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn403bsinitvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn403initvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn403initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn403initvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404bsinitvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404bsinitvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404bsinitvals35.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404bsinitvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404bsinitvals35.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404initvals33.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404initvals33.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404initvals35.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404initvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn404initvals35.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn405bsinitvals35.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn405bsinitvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn405bsinitvals35.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn405initvals35.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn405initvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn405initvals35.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn406bsinitvals37.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn406bsinitvals37.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn406bsinitvals37.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn406initvals37.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn406initvals37.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn406initvals37.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn407bsinitvals38.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn407bsinitvals38.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn407bsinitvals38.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn407initvals38.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn407initvals38.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lcn407initvals38.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals13.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals13.fw new file mode 100644 index 0000000..a1f0ed5 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals13.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals14.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals14.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals14.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals15.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals15.fw new file mode 100644 index 0000000..d2bec2d Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals15.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals16.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals16.fw new file mode 100644 index 0000000..9605a52 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0bsinitvals16.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals13.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals13.fw new file mode 100644 index 0000000..2dd1a57 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals13.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals14.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals14.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals14.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals15.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals15.fw new file mode 100644 index 0000000..afb16bb Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals15.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals16.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals16.fw new file mode 100644 index 0000000..07628e1 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp0initvals16.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1bsinitvals20.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1bsinitvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1bsinitvals20.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1bsinitvals22.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1bsinitvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1bsinitvals22.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1initvals20.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1initvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1initvals20.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1initvals22.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1initvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp1initvals22.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp2bsinitvals19.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp2bsinitvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp2bsinitvals19.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp2initvals19.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp2initvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/lp2initvals19.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0absinitvals11.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0absinitvals11.fw new file mode 100644 index 0000000..2579b02 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0absinitvals11.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals11.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals11.fw new file mode 100644 index 0000000..fc44308 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals11.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals16.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals16.fw new file mode 100644 index 0000000..921e782 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals16.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals17.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals17.fw new file mode 100644 index 0000000..921e782 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals17.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals22.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals22.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals24.fw new file mode 100644 index 0000000..eb2ac26 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals25.fw new file mode 100644 index 0000000..c7aa496 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0bsinitvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals11.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals11.fw new file mode 100644 index 0000000..07a03b5 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals11.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals16.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals16.fw new file mode 100644 index 0000000..1a641f8 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals16.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals17.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals17.fw new file mode 100644 index 0000000..159b4a2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals17.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals22.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals22.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals24.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals24.fw new file mode 100644 index 0000000..7fec76c Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals24.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals25.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals25.fw new file mode 100644 index 0000000..bb83160 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n0initvals25.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n16bsinitvals30.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n16bsinitvals30.fw new file mode 100644 index 0000000..51f48bb Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n16bsinitvals30.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n16initvals30.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n16initvals30.fw new file mode 100644 index 0000000..55cf2cf Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n16initvals30.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n18bsinitvals32.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n18bsinitvals32.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n18bsinitvals32.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n18initvals32.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n18initvals32.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n18initvals32.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n19bsinitvals34.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n19bsinitvals34.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n19bsinitvals34.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n19initvals34.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n19initvals34.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n19initvals34.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n1bsinitvals20.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n1bsinitvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n1bsinitvals20.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n1initvals20.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n1initvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n1initvals20.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n20bsinitvals36.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n20bsinitvals36.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n20bsinitvals36.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n20initvals36.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n20initvals36.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n20initvals36.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n2bsinitvals19.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n2bsinitvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n2bsinitvals19.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n2initvals19.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n2initvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/n2initvals19.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/pcm4.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/pcm4.fw new file mode 100644 index 0000000..eb881bb Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/pcm4.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/pcm5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/pcm5.fw new file mode 100644 index 0000000..d489690 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/pcm5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn0bsinitvals16.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn0bsinitvals16.fw new file mode 100644 index 0000000..cdbac12 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn0bsinitvals16.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn0initvals16.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn0initvals16.fw new file mode 100644 index 0000000..859de08 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn0initvals16.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1bsinitvals20.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1bsinitvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1bsinitvals20.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1bsinitvals27.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1bsinitvals27.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1bsinitvals27.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1initvals20.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1initvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1initvals20.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1initvals27.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1initvals27.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn1initvals27.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn2bsinitvals19.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn2bsinitvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn2bsinitvals19.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn2initvals19.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn2initvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn2initvals19.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn3bsinitvals21.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn3bsinitvals21.fw new file mode 100644 index 0000000..9605a52 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn3bsinitvals21.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn3initvals21.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn3initvals21.fw new file mode 100644 index 0000000..64b91ba Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn3initvals21.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn4bsinitvals22.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn4bsinitvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn4bsinitvals22.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn4initvals22.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn4initvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/sslpn4initvals22.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode11.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode11.fw new file mode 100644 index 0000000..44e86a0 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode11.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode13.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode13.fw new file mode 100644 index 0000000..7428837 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode13.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode14.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode14.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode14.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode15.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode15.fw new file mode 100644 index 0000000..86d5aed Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode15.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_lp.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_lp.fw new file mode 100644 index 0000000..d745b43 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_lp.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_mimo.fw new file mode 100644 index 0000000..f7c28f9 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_sslpn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_sslpn.fw new file mode 100644 index 0000000..e000ead Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_sslpn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_sslpn_nobt.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_sslpn_nobt.fw new file mode 100644 index 0000000..80ef69b Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode16_sslpn_nobt.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode17_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode17_mimo.fw new file mode 100644 index 0000000..dddb555 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode17_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode19_sslpn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode19_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode19_sslpn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode19_sslpn_nobt.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode19_sslpn_nobt.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode19_sslpn_nobt.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode20_sslpn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode20_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode20_sslpn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode20_sslpn_nobt.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode20_sslpn_nobt.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode20_sslpn_nobt.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode21_sslpn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode21_sslpn.fw new file mode 100644 index 0000000..8818277 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode21_sslpn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode21_sslpn_nobt.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode21_sslpn_nobt.fw new file mode 100644 index 0000000..8818277 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode21_sslpn_nobt.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode22_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode22_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode22_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode22_sslpn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode22_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode22_sslpn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode24_lcn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode24_lcn.fw new file mode 100644 index 0000000..0716a96 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode24_lcn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode24_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode24_mimo.fw new file mode 100644 index 0000000..7412331 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode24_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode25_lcn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode25_lcn.fw new file mode 100644 index 0000000..a20ba60 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode25_lcn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode25_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode25_mimo.fw new file mode 100644 index 0000000..749c092 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode25_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode26_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode26_mimo.fw new file mode 100644 index 0000000..a18a764 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode26_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode27_sslpn.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode27_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode27_sslpn.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode29_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode29_mimo.fw new file mode 100644 index 0000000..6a42dd2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode29_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode30_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode30_mimo.fw new file mode 100644 index 0000000..b41559b Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode30_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode32_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode32_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode32_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode33_lcn40.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode33_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode33_lcn40.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode34_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode34_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode34_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode35_lcn40.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode35_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode35_lcn40.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode36_mimo.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode36_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode36_mimo.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode37_lcn40.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode37_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode37_lcn40.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode38_lcn40.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode38_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode38_lcn40.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode40.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode40.fw new file mode 100644 index 0000000..8a996cc Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode40.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode41.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode41.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode41.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode42.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode42.fw new file mode 100644 index 0000000..8975a7c Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode42.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode43.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode43.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode43.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode5.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode5.fw new file mode 100644 index 0000000..da17009 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode5.fw differ diff --git a/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode9.fw b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode9.fw new file mode 100644 index 0000000..ba93ff3 Binary files /dev/null and b/docs/old_mac/bundle/bcm4322-offline-bundle/b43/ucode9.fw differ diff --git a/docs/old_mac/deliverable/MANIFEST.txt b/docs/old_mac/deliverable/MANIFEST.txt new file mode 100644 index 0000000..83ce1db --- /dev/null +++ b/docs/old_mac/deliverable/MANIFEST.txt @@ -0,0 +1,5 @@ +Package: fedora-bcm4322-wifi-fix.tar.gz +Built: 2026-06-16T16:47:49Z +Size: 450454 bytes +SHA256: 03516190f6d0d65c5a4f620be91458ba567b4778985eb634e23fa40977338101 +Target: Fedora 43, MacBook Pro Intel, BCM4322 / b43 diff --git a/docs/old_mac/deliverable/fedora-bcm4322-wifi-fix.tar.gz b/docs/old_mac/deliverable/fedora-bcm4322-wifi-fix.tar.gz new file mode 100644 index 0000000..7604c76 Binary files /dev/null and b/docs/old_mac/deliverable/fedora-bcm4322-wifi-fix.tar.gz differ diff --git a/docs/old_mac/deliverable/fedora-remote-access.tar.gz b/docs/old_mac/deliverable/fedora-remote-access.tar.gz new file mode 100644 index 0000000..ffea58c Binary files /dev/null and b/docs/old_mac/deliverable/fedora-remote-access.tar.gz differ diff --git a/docs/old_mac/deliverable/mac_pubkey.txt b/docs/old_mac/deliverable/mac_pubkey.txt new file mode 100644 index 0000000..f1b66c7 --- /dev/null +++ b/docs/old_mac/deliverable/mac_pubkey.txt @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINW/1tKGnwXDsh7bBcmpg2CP70hVMHGvcAC0eh5zerOz mac-fedora-remote-Eternals diff --git a/docs/old_mac/fedora.env.example b/docs/old_mac/fedora.env.example new file mode 100644 index 0000000..f2bd705 --- /dev/null +++ b/docs/old_mac/fedora.env.example @@ -0,0 +1,7 @@ +# Пример — скопировать в ~/.config/old_mac/fedora.env (chmod 600) +FEDORA_USER=p +FEDORA_PASSWORD=your_password_here +FEDORA_HOST=fedora.local +FEDORA_IP=10.23.120.30 +FEDORA_BT_IP=172.20.99.1 +FEDORA_RDP_PORT=3389 diff --git a/docs/old_mac/scripts/bootstrap-ssh-fedora.sh b/docs/old_mac/scripts/bootstrap-ssh-fedora.sh new file mode 100755 index 0000000..85b761a --- /dev/null +++ b/docs/old_mac/scripts/bootstrap-ssh-fedora.sh @@ -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' diff --git a/docs/old_mac/scripts/build-delivery-archive.sh b/docs/old_mac/scripts/build-delivery-archive.sh new file mode 100755 index 0000000..ecf630e --- /dev/null +++ b/docs/old_mac/scripts/build-delivery-archive.sh @@ -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" </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" diff --git a/docs/old_mac/scripts/connect-fedora.sh b/docs/old_mac/scripts/connect-fedora.sh new file mode 100755 index 0000000..1f5a8d1 --- /dev/null +++ b/docs/old_mac/scripts/connect-fedora.sh @@ -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 +} diff --git a/docs/old_mac/scripts/connect-rdp-fedora.sh b/docs/old_mac/scripts/connect-rdp-fedora.sh new file mode 100755 index 0000000..dadd464 --- /dev/null +++ b/docs/old_mac/scripts/connect-rdp-fedora.sh @@ -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 diff --git a/docs/old_mac/scripts/discover-fedora.sh b/docs/old_mac/scripts/discover-fedora.sh new file mode 100755 index 0000000..edc3d1d --- /dev/null +++ b/docs/old_mac/scripts/discover-fedora.sh @@ -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' diff --git a/docs/old_mac/scripts/download-bcm4322-offline-bundle.sh b/docs/old_mac/scripts/download-bcm4322-offline-bundle.sh new file mode 100755 index 0000000..23a131e --- /dev/null +++ b/docs/old_mac/scripts/download-bcm4322-offline-bundle.sh @@ -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" <&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' diff --git a/docs/old_mac/scripts/prepare-receive-fedora.sh b/docs/old_mac/scripts/prepare-receive-fedora.sh new file mode 100755 index 0000000..013419f --- /dev/null +++ b/docs/old_mac/scripts/prepare-receive-fedora.sh @@ -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 diff --git a/docs/old_mac/scripts/send-to-fedora-bluetooth.sh b/docs/old_mac/scripts/send-to-fedora-bluetooth.sh new file mode 100755 index 0000000..6a52af5 --- /dev/null +++ b/docs/old_mac/scripts/send-to-fedora-bluetooth.sh @@ -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 </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' diff --git a/docs/old_mac/scripts/setup-bt-pan-fedora.sh b/docs/old_mac/scripts/setup-bt-pan-fedora.sh new file mode 100755 index 0000000..a09b516 --- /dev/null +++ b/docs/old_mac/scripts/setup-bt-pan-fedora.sh @@ -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' diff --git a/docs/old_mac/scripts/setup-bt-pan-mac.sh b/docs/old_mac/scripts/setup-bt-pan-mac.sh new file mode 100755 index 0000000..5db87b1 --- /dev/null +++ b/docs/old_mac/scripts/setup-bt-pan-mac.sh @@ -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 diff --git a/docs/old_mac/scripts/setup-remote-mac.sh b/docs/old_mac/scripts/setup-remote-mac.sh new file mode 100755 index 0000000..27150fe --- /dev/null +++ b/docs/old_mac/scripts/setup-remote-mac.sh @@ -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 <"$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")" diff --git a/docs/old_mac/scripts/setup-ssh-fedora.sh b/docs/old_mac/scripts/setup-ssh-fedora.sh new file mode 100755 index 0000000..fd034d8 --- /dev/null +++ b/docs/old_mac/scripts/setup-ssh-fedora.sh @@ -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@\n' "$USER_NAME" +printf 'mDNS: ssh %s@fedora.local\n' "$USER_NAME" +printf '\nЕсли с Mac не пингуется — изоляция хотспота или используйте BT PAN (см. REMOTE_ACCESS.md).\n' diff --git a/scripts/games/gog/README.md b/scripts/games/gog/README.md index 687ce86..0b3bfb8 100644 --- a/scripts/games/gog/README.md +++ b/scripts/games/gog/README.md @@ -30,26 +30,23 @@ bash ~/code/local_machine/scripts/games/gog/run-web-installer.sh \ ## Jagged Alliance 3 **без GOG Galaxy** (канон) -**Runbook (установка + графика + RCA + антипаттерны):** [JA3_RUNBOOK.md](../../../docs/games/JA3_RUNBOOK.md) +**Runbook:** [JA3_RUNBOOK.md](../../../docs/games/JA3_RUNBOOK.md) ```bash # Установка (Whisky GOG-Install): 5 частей offline backup в ~/Games/ bash ~/code/local_machine/scripts/games/gog/install-ja3-innoextract.sh bash ~/code/local_machine/scripts/games/gog/finish-ja3-layout.sh -# Запуск (CrossOver D3DMetal — один раз setup, затем каждый раз run): -brew install --cask crossover -bash ~/code/local_machine/scripts/games/gog/setup-ja3-crossover.sh -bash ~/code/local_machine/scripts/games/gog/run-ja3-crossover.sh +# Запуск (Whisky GOG-Install): +bash ~/code/local_machine/scripts/games/gog/run-ja3.sh ``` | Скрипт | Назначение | |--------|------------| | `install-ja3-innoextract.sh` | **Канон установки** (Whisky) | | `finish-ja3-layout.sh` | CommonLua, реестр GOG | -| `setup-ja3-crossover.sh` | CrossOver bottle JA3-GOG + clone игры | -| **`run-ja3-crossover.sh`** | **Канон запуска** (D3D12 / D3DMetal) | -| `run-ja3.sh` | Whisky — **графика D3D12 не работает** (см. runbook) | +| **`run-ja3.sh`** | **Канон запуска** | +| `reset-ja3-whisky.sh` | Остановить JA3/Wine в GOG-Install | Galaxy / web-stub — **не использовать** для JA3 ([GOG_GALAXY_7H_RCA.md](../../../docs/games/GOG_GALAXY_7H_RCA.md)). @@ -62,3 +59,4 @@ bash ~/code/local_machine/scripts/games/gog/reset.sh ## Устаревшее (не использовать для GOG) - `setup-wine-bottle.sh` / bottle **HoMM-OldenEra** — там Steam и общий префикс. +- CrossOver / `run-ja3-crossover.sh` / `JA3-GOG` / `JA3-WINE` — **удалено** (2026-06). diff --git a/scripts/games/gog/config.sh b/scripts/games/gog/config.sh index 8242dd2..2026a49 100755 --- a/scripts/games/gog/config.sh +++ b/scripts/games/gog/config.sh @@ -84,10 +84,10 @@ gog_swap_guard() { return 0 } -# JA3/CrossOver: жёсткий стоп только если swap высокий И Wine/JA3 ещё живы. +# JA3/Whisky: жёсткий стоп только если swap высокий И Wine/JA3 ещё живы. # «Залипший» swap после закрытия (macOS не отдал) — предупреждение, запуск разрешён. gog_wine_or_ja3_active() { - pgrep -f 'JA3\.exe|wineserver|wine64-preloader|winedbg|wine64\.exe|CrossOver.*wine' >/dev/null 2>&1 + pgrep -f 'JA3\.exe' >/dev/null 2>&1 } gog_swap_guard_ja3_launch() { @@ -102,15 +102,15 @@ gog_swap_guard_ja3_launch() { if gog_wine_or_ja3_active; then if awk -v u="${used}" -v m="${soft_mb}" 'BEGIN{exit !(u>=m)}'; then echo "❌ Swap ~${used}MB и Wine/JA3 ещё работают (лимит ${soft_mb}MB)." - echo " bash ${GOG_DIR}/reset-ja3-crossover.sh или bash ${GOG_DIR}/emergency-stop.sh" - echo " затем reboot Mac. Или: JA3_IGNORE_SWAP=1 bash …/run-ja3-crossover.sh" + echo " bash ${GOG_DIR}/reset-ja3-whisky.sh" + echo " затем reboot Mac. Или: JA3_IGNORE_SWAP=1 bash ${GOG_DIR}/run-ja3.sh" return 1 fi return 0 fi if awk -v u="${used}" -v m="${hard_mb}" 'BEGIN{exit !(u>=m)}'; then echo "❌ Swap ~${used}MB (лимит ${hard_mb}MB) — reboot Mac." - echo " Или: JA3_IGNORE_SWAP=1 bash …/run-ja3-crossover.sh" + echo " Или: JA3_IGNORE_SWAP=1 bash ${GOG_DIR}/run-ja3.sh" return 1 fi if awk -v u="${used}" -v m="${soft_mb}" 'BEGIN{exit !(u>=m)}'; then @@ -203,6 +203,20 @@ export_wine_env_ja3_d3dmetal() { unset DXVK_ASYNC DXVK_HUD 2>/dev/null || true } +# Whisky GOG-Install: D3D11 + DXVK-macOS (D3D12 через GPTK/D3DMetal при наличии). +export_wine_env_ja3_whisky() { + export_wine_env_gog + unset WINED3DMETAL 2>/dev/null || true + export WINEDLLOVERRIDES="d3d11,d3d10core,dxgi=n,b;d3d12=d;libxess,xess,dxcompiler,dxil,nvngx_dlss,XeFX,XeFX_Loader=d;gdiplus=n,b" + local _dxvk_conf="${BOTTLE_DIR}/drive_c/GOG Games/Jagged Alliance 3/dxvk.conf" + if [[ -f "${_dxvk_conf}" ]]; then + export DXVK_CONFIG_FILE="${_dxvk_conf}" + fi + unset DXVK_ASYNC DXVK_HUD 2>/dev/null || true + export SDL_VIDEO_MAC_FULLSCREEN_SPACES="${SDL_VIDEO_MAC_FULLSCREEN_SPACES:-0}" + export MVK_CONFIG_RESUME_LOST_DEVICE=1 +} + gog_steam_client_in_bottle() { local f [[ -d "${BOTTLE_DIR}/drive_c/Program Files (x86)/Steam" ]] && return 0 diff --git a/scripts/games/gog/fix-ja3-crossover-mouse.sh b/scripts/games/gog/fix-ja3-crossover-mouse.sh deleted file mode 100755 index 622f5b4..0000000 --- a/scripts/games/gog/fix-ja3-crossover-mouse.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash -# Курсор JA3 в CrossOver (Retina / HiDPI). -# Профили (JA3_MOUSE_PROFILE): -# legacy — RetinaMode=n (полный ход по Y; возможен сдвиг клика) — default -# retina-lite — RetinaMode=y без LogPixels (если legacy смещает, но нет клипа) -# retina — RetinaMode=y + LogPixels=192 (клип на середине экрана — не default) -set -euo pipefail -GOG_DIR="$(cd "$(dirname "$0")" && pwd)" -CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver" -CX_BOTTLE="JA3-GOG" -CX_DIR="${HOME}/Library/Application Support/CrossOver/Bottles/${CX_BOTTLE}" - -[[ -d "${CX}" ]] || { - echo "❌ CrossOver не установлен" - exit 1 -} - -PROFILE="${JA3_MOUSE_PROFILE:-legacy}" -WREG() { "${CX}/bin/wine" --bottle "${CX_BOTTLE}" "$@"; } - -case "${PROFILE}" in - retina) - RETINA="y" - SET_DPI=1 - DPI="${JA3_LOG_PIXELS:-192}" - SET_WIN8=1 - ;; - retina-lite) - RETINA="y" - SET_DPI=0 - SET_WIN8=0 - ;; - legacy|*) - RETINA="n" - SET_DPI=0 - SET_WIN8=0 - PROFILE="legacy" - ;; -esac - -WREG reg add 'HKCU\Software\Wine\Mac Driver' /v RetinaMode /t REG_SZ /d "${RETINA}" /f >/dev/null - -if [[ "${SET_DPI}" == "1" ]]; then - WREG reg add 'HKCU\Control Panel\Desktop' /v LogPixels /t REG_DWORD /d "${DPI}" /f >/dev/null -else - WREG reg delete 'HKCU\Control Panel\Desktop' /v LogPixels /f >/dev/null 2>&1 || true -fi - -if [[ "${SET_WIN8}" == "1" ]]; then - WREG reg add 'HKCU\Control Panel\Desktop' /v Win8DpiScaling /t REG_DWORD /d 1 /f >/dev/null -else - WREG reg delete 'HKCU\Control Panel\Desktop' /v Win8DpiScaling /f >/dev/null 2>&1 || true -fi - -CONF="${CX_DIR}/cxbottle.conf" -if [[ -f "${CONF}" ]] && ! grep -q 'SDL_VIDEO_MAC_FULLSCREEN_SPACES' "${CONF}"; then - sed -i '' '/^\[EnvironmentVariables\]/a\ -"SDL_VIDEO_MAC_FULLSCREEN_SPACES" = "0" -' "${CONF}" 2>/dev/null || true -fi - -echo "OK: profile=${PROFILE} RetinaMode=${RETINA} → ${CX_BOTTLE}" -echo " Перезапуск: bash ${GOG_DIR}/reset-ja3-crossover.sh && bash ${GOG_DIR}/run-ja3-crossover.sh" -case "${PROFILE}" in - legacy) - echo " Если клик смещён: JA3_MOUSE_PROFILE=retina-lite bash ${GOG_DIR}/fix-ja3-crossover-mouse.sh" - echo " Без перезапуска: верхний левый угол окна = угол экрана." - ;; - retina-lite) - echo " Если смещение осталось: JA3_MOUSE_PROFILE=legacy …" - echo " Если клип на середине: JA3_MOUSE_PROFILE=legacy …" - ;; - retina) - echo " ⚠️ retina+LogPixels=192 часто режет курсор на середине экрана." - echo " Если так: JA3_MOUSE_PROFILE=legacy bash ${GOG_DIR}/fix-ja3-crossover-mouse.sh" - ;; -esac diff --git a/scripts/games/gog/gog-process.sh b/scripts/games/gog/gog-process.sh index edab2c9..3f7dc84 100755 --- a/scripts/games/gog/gog-process.sh +++ b/scripts/games/gog/gog-process.sh @@ -70,3 +70,18 @@ tell application "System Events" end repeat end tell' 2>/dev/null || true } + +# Только GOG-Install bottle — не трогает другие bottles. +gog_kill_whisky_bottle() { + pkill -9 -f "${BOTTLE_DIR}.*JA3\.exe" 2>/dev/null || true + pkill -9 -f "${BOTTLE_DIR}.*GalaxyClient" 2>/dev/null || true + pkill -9 -f "${BOTTLE_DIR}.*wineserver" 2>/dev/null || true + pkill -9 -f "${BOTTLE_DIR}.*wine64-preloader" 2>/dev/null || true + sleep 1 + if [[ -d "${BOTTLE_DIR}" ]]; then + export WINEPREFIX="${BOTTLE_DIR}" + [[ -x "${WINE_SERV}" ]] && "${WINE_SERV}" -k 2>/dev/null || true + sleep 1 + gog_remove_lock_files + fi +} diff --git a/scripts/games/gog/reset-ja3-crossover.sh b/scripts/games/gog/reset-ja3-crossover.sh deleted file mode 100755 index d17e1dd..0000000 --- a/scripts/games/gog/reset-ja3-crossover.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# Остановить JA3 / Wine (CrossOver bottle JA3-GOG) перед перезапуском. -set -euo pipefail -GOG_DIR="$(cd "$(dirname "$0")" && pwd)" -# shellcheck source=gog-process.sh -source "${GOG_DIR}/gog-process.sh" - -bash "${GOG_DIR}/emergency-stop.sh" 2>/dev/null || gog_kill_all -pkill -f 'JA3\.exe' 2>/dev/null || true -pkill -f 'wineserver.*JA3-GOG' 2>/dev/null || true - -CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver" -if [[ -x "${CX}/bin/wine" ]]; then - "${CX}/bin/wine" --bottle JA3-GOG wineboot --kill 2>/dev/null || true -fi -sleep 2 -pgrep -fl 'JA3\.exe|wineserver' 2>/dev/null | head -5 || echo "OK: процессы JA3/Wine остановлены" diff --git a/scripts/games/gog/reset-ja3-whisky.sh b/scripts/games/gog/reset-ja3-whisky.sh new file mode 100755 index 0000000..ca8d255 --- /dev/null +++ b/scripts/games/gog/reset-ja3-whisky.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Остановить JA3/Wine в Whisky GOG-Install. +set -euo pipefail +GOG_DIR="$(cd "$(dirname "$0")" && pwd)" +# shellcheck source=gog-process.sh +source "${GOG_DIR}/gog-process.sh" + +gog_kill_whisky_bottle +sleep 2 +pgrep -fl "${BOTTLE_DIR}.*JA3" 2>/dev/null | head -5 || echo "OK: JA3/Wine в ${BOTTLE_NAME} остановлены" diff --git a/scripts/games/gog/run-ja3-crossover.sh b/scripts/games/gog/run-ja3-crossover.sh deleted file mode 100755 index 8fde15e..0000000 --- a/scripts/games/gog/run-ja3-crossover.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash -# JA3 (GOG) через CrossOver + D3DMetal — D3D12 на Apple Silicon. -set -euo pipefail -GOG_DIR="$(cd "$(dirname "$0")" && pwd)" -# shellcheck source=config.sh -source "${GOG_DIR}/config.sh" -# shellcheck source=gog-process.sh -source "${GOG_DIR}/gog-process.sh" - -CX="${HOME}/Applications/CrossOver.app/Contents/SharedSupport/CrossOver" -[[ -d "/Applications/CrossOver.app" ]] && CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver" -CX_BOTTLE="JA3-GOG" -CX_DIR="${HOME}/Library/Application Support/CrossOver/Bottles/${CX_BOTTLE}" - -[[ -d "${CX}" ]] || { - echo "❌ CrossOver не установлен: brew install --cask crossover" - exit 1 -} - -if [[ ! -f "${CX_DIR}/drive_c/GOG Games/Jagged Alliance 3/JA3.exe" ]]; then - bash "${GOG_DIR}/setup-ja3-crossover.sh" -fi - -bash "${GOG_DIR}/emergency-stop.sh" >/dev/null 2>&1 || gog_kill_all -sleep 2 - -gog_swap_guard_ja3_launch "${JA3_SWAP_SOFT_MB:-1200}" "${JA3_SWAP_HARD_MB:-4096}" || exit 1 - -echo "Запуск JA3 (CrossOver D3DMetal; без Steam.app)…" -echo "Cmd+Tab → JA3. В графике: отключить heat haze." -echo "(лог «Steam … GOG» = GOG API-шим, не Steam client)" - -# start /d — CWD с CommonLua/ (обязательно; --cx-app без /d → autorun.lua not found) -exec "${CX}/bin/wine" --bottle "${CX_BOTTLE}" start /d "C:\\GOG Games\\Jagged Alliance 3" \ - "C:\\GOG Games\\Jagged Alliance 3\\JA3.exe" ${JA3_EXTRA_ARGS:--unpacked} diff --git a/scripts/games/gog/run-ja3-gptk-wine.sh b/scripts/games/gog/run-ja3-gptk-wine.sh deleted file mode 100755 index 0bfe106..0000000 --- a/scripts/games/gog/run-ja3-gptk-wine.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env bash -# JA3 через Wine 7.7 + D3DMetal (Game Porting Toolkit). Канон для D3D12 на Apple Silicon. -set -euo pipefail -GOG_DIR="$(cd "$(dirname "$0")" && pwd)" -GAMES_DIR="$(cd "${GOG_DIR}/.." && pwd)" -# shellcheck source=config.sh -source "${GOG_DIR}/config.sh" -# shellcheck source=gog-process.sh -source "${GOG_DIR}/gog-process.sh" - -GPTK_WINE="/Applications/Game Porting Toolkit.app/Contents/Resources/wine" -GPTK_WINE64="${GPTK_WINE}/bin/wine64" -JA3_WIN='C:\GOG Games\Jagged Alliance 3\JA3.exe' -MARKER="${GAMES_CACHE_DIR}/.ja3_gptk_prefix" - -[[ -x "${GPTK_WINE64}" ]] || { - echo "❌ brew install --cask gcenx/wine/game-porting-toolkit" - exit 1 -} - -if [[ -f "${MARKER}" ]]; then - GPTK_PREFIX="$(cat "${MARKER}")" -else - GPTK_PREFIX="${JA3_GPTK_PREFIX:-${GAMES_CACHE_DIR}/ja3-gptk-prefix}" -fi - -if [[ ! -f "${GPTK_PREFIX}/system.reg" ]]; then - bash "${GOG_DIR}/setup-ja3-gptk-prefix.sh" - GPTK_PREFIX="$(cat "${MARKER}" 2>/dev/null || echo "${GPTK_PREFIX}")" -fi - -JA3_UNIX="${GPTK_PREFIX}/drive_c/GOG Games/Jagged Alliance 3" -[[ -f "${JA3_UNIX}/JA3.exe" ]] || JA3_UNIX="$(readlink "${JA3_UNIX}" 2>/dev/null || true)" -[[ -f "${JA3_UNIX}/JA3.exe" ]] || { - echo "❌ Нет JA3 в GPTK prefix — bash ${GOG_DIR}/setup-ja3-gptk-prefix.sh" - exit 1 -} - -bash "${GOG_DIR}/emergency-stop.sh" >/dev/null 2>&1 || gog_kill_all -sleep 2 - -if [[ "${JA3_IGNORE_SWAP:-0}" != "1" ]] && ! gog_swap_guard "${JA3_SWAP_MAX_MB:-800}"; then - exit 1 -fi - -export WINEPREFIX="${GPTK_PREFIX}" -export WINEARCH=win64 -export WINED3DMETAL=1 -export WINEMSYNC=1 -export WINEDEBUG=-all -export MVK_CONFIG_LOG_LEVEL=0 -export DYLD_LIBRARY_PATH="${GPTK_WINE}/lib:${DYLD_LIBRARY_PATH:-}" -export WINEDLLOVERRIDES="libxess,xess,dxcompiler,dxil,nvngx_dlss,XeFX,XeFX_Loader=d;gdiplus=n,b" - -echo "Запуск JA3 (GPTK Wine 7.7 + D3DMetal, prefix ${GPTK_PREFIX})…" -cd "${JA3_UNIX}" -exec "${GPTK_WINE64}" "${JA3_WIN}" ${JA3_EXTRA_ARGS:--unpacked} diff --git a/scripts/games/gog/run-ja3.sh b/scripts/games/gog/run-ja3.sh index 406785f..226bfee 100755 --- a/scripts/games/gog/run-ja3.sh +++ b/scripts/games/gog/run-ja3.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Запуск Jagged Alliance 3 (GOG) без Steam client. +# Запуск Jagged Alliance 3 (GOG) без Steam client — Whisky GOG-Install. set -euo pipefail GOG_DIR="$(cd "$(dirname "$0")" && pwd)" # shellcheck source=config.sh @@ -26,7 +26,7 @@ if [[ "${JA3_IGNORE_SWAP:-0}" == "1" ]]; then elif ! gog_swap_guard_ja3_launch "${JA3_SWAP_SOFT_MB:-1200}" "${JA3_SWAP_HARD_MB:-4096}"; then used="$(gog_swap_used_mb 2>/dev/null || echo '?')" echo "" - echo "Swap ~${used}MB — bash ${GOG_DIR}/reset-ja3-crossover.sh или reboot Mac" + echo "Swap ~${used}MB — bash ${GOG_DIR}/reset-ja3-whisky.sh или reboot Mac" echo "Или: JA3_IGNORE_SWAP=1 bash ${GOG_DIR}/run-ja3.sh" exit 1 fi @@ -46,18 +46,6 @@ if ! ja3_gptk_available && ! ja3_bottle_uses_d3dmetal; then fi fi -CX="/Applications/CrossOver.app/Contents/SharedSupport/CrossOver" -if [[ ! -x "${CX}/bin/wine" ]]; then - : -elif [[ ! -f "${HOME}/Library/Application Support/CrossOver/Bottles/JA3-GOG/drive_c/GOG Games/Jagged Alliance 3/JA3.exe" ]]; then - echo "" - echo "ℹ️ JA3 (D3D12) на Mac: Whisky/Gcenx не поддерживает D3DMetal." - echo " brew install --cask crossover" - echo " bash ${GOG_DIR}/setup-ja3-crossover.sh && bash ${GOG_DIR}/run-ja3-crossover.sh" - echo "" -fi - -# Whisky D3DMetal path — не работает для JA3/D3D12 на Gcenx (см. JA3_MAC_WITHOUT_GALAXY.md) if ja3_gptk_available || ja3_bottle_uses_d3dmetal; then bash "${GOG_DIR}/prepare-ja3-d3dmetal.sh" >/dev/null 2>&1 || true fi @@ -80,14 +68,9 @@ if [[ -f "${BOTTLE_DIR}/drive_c/Program Files (x86)/GOG Galaxy/GalaxyClientServi fi if ja3_gptk_available || ja3_bottle_uses_d3dmetal; then - echo "⚠️ Whisky D3DMetal не поддерживает JA3/D3D12 (Gcenx без D3DMetal hooks)." - echo " Используйте: bash ${GOG_DIR}/run-ja3-crossover.sh" - echo "" -fi -if ja3_gptk_available || ja3_bottle_uses_d3dmetal; then - echo "Запуск JA3 (Whisky — эксперимент; D3D12 → CrossOver)…" + echo "Запуск JA3 (Whisky + D3DMetal)…" else - echo "Запуск JA3 (GOG, DXVK D3D11 fallback; без Steam.app)…" + echo "Запуск JA3 (Whisky, DXVK D3D11 fallback; без Steam.app)…" fi echo "Cmd+Tab → wine64. В графике: отключить heat haze." echo "(лог «Steam … GOG» = GOG API-шим, не Steam client)" @@ -98,6 +81,5 @@ else _ja3_args="${JA3_EXTRA_ARGS:--unpacked -graphicsapi d3d11}" fi # start /d — CWD = папка игры (CommonLua/, иначе «graphics subsystem»/autorun.lua из Whisky Run) -# innoextract не запускает Inno-постскрипты; -unpacked + CommonLua на диске обязательны # shellcheck disable=SC2086 exec "${WINE64}" start /d "C:\\GOG Games\\Jagged Alliance 3" "${JA3_WIN}" ${_ja3_args} diff --git a/scripts/games/gog/setup-ja3-gptk-prefix.sh b/scripts/games/gog/setup-ja3-gptk-prefix.sh deleted file mode 100755 index 9b5fedc..0000000 --- a/scripts/games/gog/setup-ja3-gptk-prefix.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash -# Отдельный WINEPREFIX под Wine 7.7 из Game Porting Toolkit (D3D12 + D3DMetal). -# Whisky Wine 11 не грузит GPTK dxgi/d3d12 PE — JA3 падает на «Failed creating render device». -set -euo pipefail -GOG_DIR="$(cd "$(dirname "$0")" && pwd)" -GAMES_DIR="$(cd "${GOG_DIR}/.." && pwd)" -# shellcheck source=config.sh -source "${GOG_DIR}/config.sh" - -GPTK_WINE="/Applications/Game Porting Toolkit.app/Contents/Resources/wine" -GPTK_WINE64="${GPTK_WINE}/bin/wine64" -JA3_SRC="${BOTTLE_DIR}/drive_c/GOG Games/Jagged Alliance 3" -GPTK_PREFIX="${JA3_GPTK_PREFIX:-${GAMES_CACHE_DIR}/ja3-gptk-prefix}" - -[[ -x "${GPTK_WINE64}" ]] || { - echo "❌ brew install --cask gcenx/wine/game-porting-toolkit" - exit 1 -} -[[ -f "${JA3_SRC}/JA3.exe" ]] || { - echo "❌ Нет JA3 в bottle ${BOTTLE_NAME} — install-ja3-innoextract.sh" - exit 1 -} - -export WINEARCH=win64 -export WINEPREFIX="${GPTK_PREFIX}" -export WINED3DMETAL=1 -export WINEMSYNC=1 -export WINEDEBUG=-all -export DYLD_LIBRARY_PATH="${GPTK_WINE}/lib:${DYLD_LIBRARY_PATH:-}" - -mkdir -p "${GPTK_PREFIX}" - -if [[ ! -f "${GPTK_PREFIX}/system.reg" ]]; then - echo "Инициализация GPTK prefix: ${GPTK_PREFIX}" - "${GPTK_WINE64}" wineboot -i -fi - -GOG_DRIVE="${GPTK_PREFIX}/drive_c/GOG Games" -JA3_LINK="${GOG_DRIVE}/Jagged Alliance 3" -mkdir -p "${GOG_DRIVE}" -if [[ -L "${JA3_LINK}" ]]; then - : -elif [[ -d "${JA3_LINK}" ]]; then - echo " JA3 уже в prefix (не symlink)" -else - ln -s "${JA3_SRC}" "${JA3_LINK}" -fi - -# CommonLua + upscale cleanup (на исходной копии в GOG bottle) -bash "${GOG_DIR}/finish-ja3-layout.sh" >/dev/null 2>&1 || true - -WINE64="${GPTK_WINE64}" BOTTLE_DIR="${GPTK_PREFIX}" export_wine_env_gog -export WINED3DMETAL=1 -export WINEDLLOVERRIDES="libxess,xess,dxcompiler,dxil,nvngx_dlss,XeFX,XeFX_Loader=d;gdiplus=n,b" - -GAME_ID='1556263729' -KEY="HKLM\\Software\\WOW6432Node\\GOG.com\\Games\\${GAME_ID}" -"${GPTK_WINE64}" reg add "${KEY}" /v gameName /t REG_SZ /d 'Jagged Alliance 3' /f >/dev/null -"${GPTK_WINE64}" reg add "${KEY}" /v exe /t REG_SZ /d 'JA3.exe' /f >/dev/null -"${GPTK_WINE64}" reg add "${KEY}" /v path /t REG_SZ /d 'C:\GOG Games\Jagged Alliance 3\' /f >/dev/null - -echo "${GPTK_PREFIX}" >"${GAMES_CACHE_DIR}/.ja3_gptk_prefix" -echo "OK: GPTK prefix → ${GPTK_PREFIX}" -echo " Запуск: bash ${GOG_DIR}/run-ja3-gptk-wine.sh" diff --git a/scripts/linux/fedora/build-delivery-archive.sh b/scripts/linux/fedora/build-delivery-archive.sh new file mode 100755 index 0000000..69d6bda --- /dev/null +++ b/scripts/linux/fedora/build-delivery-archive.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +exec bash "$(cd "$(dirname "$0")/../../.." && pwd)/docs/old_mac/scripts/build-delivery-archive.sh" "$@" diff --git a/scripts/linux/fedora/download-bcm4322-offline-bundle.sh b/scripts/linux/fedora/download-bcm4322-offline-bundle.sh new file mode 100755 index 0000000..4ff261b --- /dev/null +++ b/scripts/linux/fedora/download-bcm4322-offline-bundle.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Перенаправление → docs/old_mac/scripts/ +exec bash "$(cd "$(dirname "$0")/../../.." && pwd)/docs/old_mac/scripts/send-to-fedora-bluetooth.sh" "$@" diff --git a/scripts/linux/fedora/install-bcm4322-firmware-fedora.sh b/scripts/linux/fedora/install-bcm4322-firmware-fedora.sh new file mode 100755 index 0000000..7eafda9 --- /dev/null +++ b/scripts/linux/fedora/install-bcm4322-firmware-fedora.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +exec bash "$(cd "$(dirname "$0")/../../.." && pwd)/docs/old_mac/scripts/install-bcm4322-firmware-fedora.sh" "$@" diff --git a/scripts/linux/fedora/send-bcm4322-bundle-bluetooth-mac.sh b/scripts/linux/fedora/send-bcm4322-bundle-bluetooth-mac.sh new file mode 100755 index 0000000..b234f01 --- /dev/null +++ b/scripts/linux/fedora/send-bcm4322-bundle-bluetooth-mac.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +exec bash "$(cd "$(dirname "$0")/../../.." && pwd)/docs/old_mac/scripts/send-to-fedora-bluetooth.sh" "$@" diff --git a/vendor/fedora/README.md b/vendor/fedora/README.md new file mode 100644 index 0000000..35c1e86 --- /dev/null +++ b/vendor/fedora/README.md @@ -0,0 +1 @@ +Перенесено в `docs/old_mac/`. Сборка firmware и delivery-архив — там. diff --git a/vendor/fedora/bcm4322-firmware-bundle.tar.gz b/vendor/fedora/bcm4322-firmware-bundle.tar.gz new file mode 100644 index 0000000..4f467e7 Binary files /dev/null and b/vendor/fedora/bcm4322-firmware-bundle.tar.gz differ diff --git a/vendor/fedora/bcm4322-offline-bundle/MANIFEST.txt b/vendor/fedora/bcm4322-offline-bundle/MANIFEST.txt new file mode 100644 index 0000000..a704535 --- /dev/null +++ b/vendor/fedora/bcm4322-offline-bundle/MANIFEST.txt @@ -0,0 +1,7 @@ +BCM4322 b43 firmware offline bundle +Built: 2026-06-16 +Source: broadcom-wl-6.30.163.46 via b43-fwcutter +Files: 155 +Tarball: bcm4322-firmware-bundle.tar.gz +SHA256 tarball: 06d3f492c064c0db5549cf4e4bc5bd8fa40c15f3427ca02ec6a5d51f918b6032 +SHA256 b43/ucode16_mimo.fw: 614c233b2f65653d298f74f64120068f84d031a40e3d37b68779ab7583fe574d diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g0bsinitvals5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0bsinitvals5.fw new file mode 100644 index 0000000..6cc3654 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0bsinitvals5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g0bsinitvals9.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0bsinitvals9.fw new file mode 100644 index 0000000..8a6c3d4 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0bsinitvals9.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g0initvals5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0initvals5.fw new file mode 100644 index 0000000..0dbd65b Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0initvals5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g0initvals9.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0initvals9.fw new file mode 100644 index 0000000..571bcdf Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g0initvals9.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals13.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals13.fw new file mode 100644 index 0000000..d7252bd Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals13.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals5.fw new file mode 100644 index 0000000..7da54a6 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals9.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals9.fw new file mode 100644 index 0000000..a6ca748 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1bsinitvals9.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals13.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals13.fw new file mode 100644 index 0000000..f287aa9 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals13.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals5.fw new file mode 100644 index 0000000..a5e4109 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals9.fw b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals9.fw new file mode 100644 index 0000000..af15ed9 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/a0g1initvals9.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac0bsinitvals40.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac0bsinitvals40.fw new file mode 100644 index 0000000..68984e3 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac0bsinitvals40.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac0initvals40.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac0initvals40.fw new file mode 100644 index 0000000..f852604 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac0initvals40.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac1bsinitvals42.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac1bsinitvals42.fw new file mode 100644 index 0000000..68984e3 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac1bsinitvals42.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac1initvals42.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac1initvals42.fw new file mode 100644 index 0000000..1c13ab2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac1initvals42.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac2bsinitvals41.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac2bsinitvals41.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac2bsinitvals41.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac2initvals41.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac2initvals41.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac2initvals41.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac3bsinitvals43.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac3bsinitvals43.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac3bsinitvals43.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ac3initvals43.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ac3initvals43.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ac3initvals43.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals13.fw b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals13.fw new file mode 100644 index 0000000..ada3f88 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals13.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals5.fw new file mode 100644 index 0000000..501bb00 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals9.fw b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals9.fw new file mode 100644 index 0000000..5db1ff0 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0bsinitvals9.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals13.fw b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals13.fw new file mode 100644 index 0000000..6f40ba9 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals13.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals5.fw new file mode 100644 index 0000000..baf2d9d Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals9.fw b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals9.fw new file mode 100644 index 0000000..640e116 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/b0g0initvals9.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ht0bsinitvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ht0bsinitvals26.fw new file mode 100644 index 0000000..d075603 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ht0bsinitvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ht0bsinitvals29.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ht0bsinitvals29.fw new file mode 100644 index 0000000..06850cf Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ht0bsinitvals29.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ht0initvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ht0initvals26.fw new file mode 100644 index 0000000..ddaa973 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ht0initvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ht0initvals29.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ht0initvals29.fw new file mode 100644 index 0000000..db62e71 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ht0initvals29.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals24.fw new file mode 100644 index 0000000..19cf197 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals25.fw new file mode 100644 index 0000000..8f6054c Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals26.fw new file mode 100644 index 0000000..b74105a Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0bsinitvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals24.fw new file mode 100644 index 0000000..cd1ec3e Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals25.fw new file mode 100644 index 0000000..60c402b Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals26.fw new file mode 100644 index 0000000..1cace89 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn0initvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals24.fw new file mode 100644 index 0000000..19cf197 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals25.fw new file mode 100644 index 0000000..8f6054c Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals26.fw new file mode 100644 index 0000000..b74105a Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1bsinitvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals24.fw new file mode 100644 index 0000000..cd1ec3e Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals25.fw new file mode 100644 index 0000000..60c402b Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals26.fw new file mode 100644 index 0000000..1cace89 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn1initvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals24.fw new file mode 100644 index 0000000..19cf197 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals25.fw new file mode 100644 index 0000000..8f6054c Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals26.fw new file mode 100644 index 0000000..b74105a Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2bsinitvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals24.fw new file mode 100644 index 0000000..cd1ec3e Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals25.fw new file mode 100644 index 0000000..60c402b Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals26.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals26.fw new file mode 100644 index 0000000..1cace89 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn2initvals26.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn400bsinitvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn400bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn400bsinitvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn400initvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn400initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn400initvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn401bsinitvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn401bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn401bsinitvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn401initvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn401initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn401initvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn402bsinitvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn402bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn402bsinitvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn402initvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn402initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn402initvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn403bsinitvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn403bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn403bsinitvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn403initvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn403initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn403initvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn404bsinitvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404bsinitvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404bsinitvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn404bsinitvals35.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404bsinitvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404bsinitvals35.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn404initvals33.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404initvals33.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404initvals33.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn404initvals35.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404initvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn404initvals35.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn405bsinitvals35.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn405bsinitvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn405bsinitvals35.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn405initvals35.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn405initvals35.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn405initvals35.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn406bsinitvals37.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn406bsinitvals37.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn406bsinitvals37.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn406initvals37.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn406initvals37.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn406initvals37.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn407bsinitvals38.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn407bsinitvals38.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn407bsinitvals38.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lcn407initvals38.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lcn407initvals38.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lcn407initvals38.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals13.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals13.fw new file mode 100644 index 0000000..a1f0ed5 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals13.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals14.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals14.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals14.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals15.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals15.fw new file mode 100644 index 0000000..d2bec2d Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals15.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals16.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals16.fw new file mode 100644 index 0000000..9605a52 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0bsinitvals16.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals13.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals13.fw new file mode 100644 index 0000000..2dd1a57 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals13.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals14.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals14.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals14.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals15.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals15.fw new file mode 100644 index 0000000..afb16bb Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals15.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals16.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals16.fw new file mode 100644 index 0000000..07628e1 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp0initvals16.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp1bsinitvals20.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp1bsinitvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp1bsinitvals20.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp1bsinitvals22.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp1bsinitvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp1bsinitvals22.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp1initvals20.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp1initvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp1initvals20.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp1initvals22.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp1initvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp1initvals22.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp2bsinitvals19.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp2bsinitvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp2bsinitvals19.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/lp2initvals19.fw b/vendor/fedora/bcm4322-offline-bundle/b43/lp2initvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/lp2initvals19.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0absinitvals11.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0absinitvals11.fw new file mode 100644 index 0000000..2579b02 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0absinitvals11.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals11.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals11.fw new file mode 100644 index 0000000..fc44308 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals11.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals16.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals16.fw new file mode 100644 index 0000000..921e782 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals16.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals17.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals17.fw new file mode 100644 index 0000000..921e782 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals17.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals22.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals22.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals24.fw new file mode 100644 index 0000000..eb2ac26 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals25.fw new file mode 100644 index 0000000..c7aa496 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0bsinitvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals11.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals11.fw new file mode 100644 index 0000000..07a03b5 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals11.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals16.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals16.fw new file mode 100644 index 0000000..1a641f8 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals16.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals17.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals17.fw new file mode 100644 index 0000000..159b4a2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals17.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals22.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals22.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals24.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals24.fw new file mode 100644 index 0000000..7fec76c Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals24.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals25.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals25.fw new file mode 100644 index 0000000..bb83160 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n0initvals25.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n16bsinitvals30.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n16bsinitvals30.fw new file mode 100644 index 0000000..51f48bb Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n16bsinitvals30.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n16initvals30.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n16initvals30.fw new file mode 100644 index 0000000..55cf2cf Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n16initvals30.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n18bsinitvals32.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n18bsinitvals32.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n18bsinitvals32.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n18initvals32.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n18initvals32.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n18initvals32.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n19bsinitvals34.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n19bsinitvals34.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n19bsinitvals34.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n19initvals34.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n19initvals34.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n19initvals34.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n1bsinitvals20.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n1bsinitvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n1bsinitvals20.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n1initvals20.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n1initvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n1initvals20.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n20bsinitvals36.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n20bsinitvals36.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n20bsinitvals36.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n20initvals36.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n20initvals36.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n20initvals36.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n2bsinitvals19.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n2bsinitvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n2bsinitvals19.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/n2initvals19.fw b/vendor/fedora/bcm4322-offline-bundle/b43/n2initvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/n2initvals19.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/pcm4.fw b/vendor/fedora/bcm4322-offline-bundle/b43/pcm4.fw new file mode 100644 index 0000000..eb881bb Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/pcm4.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/pcm5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/pcm5.fw new file mode 100644 index 0000000..d489690 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/pcm5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn0bsinitvals16.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn0bsinitvals16.fw new file mode 100644 index 0000000..cdbac12 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn0bsinitvals16.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn0initvals16.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn0initvals16.fw new file mode 100644 index 0000000..859de08 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn0initvals16.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1bsinitvals20.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1bsinitvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1bsinitvals20.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1bsinitvals27.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1bsinitvals27.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1bsinitvals27.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1initvals20.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1initvals20.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1initvals20.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1initvals27.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1initvals27.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn1initvals27.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn2bsinitvals19.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn2bsinitvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn2bsinitvals19.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn2initvals19.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn2initvals19.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn2initvals19.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn3bsinitvals21.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn3bsinitvals21.fw new file mode 100644 index 0000000..9605a52 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn3bsinitvals21.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn3initvals21.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn3initvals21.fw new file mode 100644 index 0000000..64b91ba Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn3initvals21.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn4bsinitvals22.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn4bsinitvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn4bsinitvals22.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/sslpn4initvals22.fw b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn4initvals22.fw new file mode 100644 index 0000000..cc2042f Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/sslpn4initvals22.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode11.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode11.fw new file mode 100644 index 0000000..44e86a0 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode11.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode13.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode13.fw new file mode 100644 index 0000000..7428837 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode13.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode14.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode14.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode14.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode15.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode15.fw new file mode 100644 index 0000000..86d5aed Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode15.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_lp.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_lp.fw new file mode 100644 index 0000000..d745b43 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_lp.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_mimo.fw new file mode 100644 index 0000000..f7c28f9 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_sslpn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_sslpn.fw new file mode 100644 index 0000000..e000ead Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_sslpn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_sslpn_nobt.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_sslpn_nobt.fw new file mode 100644 index 0000000..80ef69b Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode16_sslpn_nobt.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode17_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode17_mimo.fw new file mode 100644 index 0000000..dddb555 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode17_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode19_sslpn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode19_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode19_sslpn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode19_sslpn_nobt.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode19_sslpn_nobt.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode19_sslpn_nobt.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode20_sslpn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode20_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode20_sslpn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode20_sslpn_nobt.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode20_sslpn_nobt.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode20_sslpn_nobt.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode21_sslpn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode21_sslpn.fw new file mode 100644 index 0000000..8818277 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode21_sslpn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode21_sslpn_nobt.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode21_sslpn_nobt.fw new file mode 100644 index 0000000..8818277 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode21_sslpn_nobt.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode22_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode22_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode22_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode22_sslpn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode22_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode22_sslpn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode24_lcn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode24_lcn.fw new file mode 100644 index 0000000..0716a96 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode24_lcn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode24_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode24_mimo.fw new file mode 100644 index 0000000..7412331 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode24_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode25_lcn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode25_lcn.fw new file mode 100644 index 0000000..a20ba60 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode25_lcn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode25_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode25_mimo.fw new file mode 100644 index 0000000..749c092 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode25_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode26_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode26_mimo.fw new file mode 100644 index 0000000..a18a764 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode26_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode27_sslpn.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode27_sslpn.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode27_sslpn.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode29_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode29_mimo.fw new file mode 100644 index 0000000..6a42dd2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode29_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode30_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode30_mimo.fw new file mode 100644 index 0000000..b41559b Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode30_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode32_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode32_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode32_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode33_lcn40.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode33_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode33_lcn40.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode34_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode34_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode34_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode35_lcn40.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode35_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode35_lcn40.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode36_mimo.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode36_mimo.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode36_mimo.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode37_lcn40.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode37_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode37_lcn40.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode38_lcn40.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode38_lcn40.fw new file mode 100644 index 0000000..c4b2427 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode38_lcn40.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode40.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode40.fw new file mode 100644 index 0000000..8a996cc Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode40.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode41.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode41.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode41.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode42.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode42.fw new file mode 100644 index 0000000..8975a7c Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode42.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode43.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode43.fw new file mode 100644 index 0000000..675b4d2 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode43.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode5.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode5.fw new file mode 100644 index 0000000..da17009 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode5.fw differ diff --git a/vendor/fedora/bcm4322-offline-bundle/b43/ucode9.fw b/vendor/fedora/bcm4322-offline-bundle/b43/ucode9.fw new file mode 100644 index 0000000..ba93ff3 Binary files /dev/null and b/vendor/fedora/bcm4322-offline-bundle/b43/ucode9.fw differ