Автозапуск і перевірка наявності мережі в MacOS

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Є консольна утиліта (без GUI, пише в stdout, не інтерактивна, тож нічого від користувача не очікує), яку я хочу запускати після логіну користувача. Зараз це зроблено через «Загальні налаштування» => «Автозапуск і розширення» => «Запускати при вході в систему». Але є 2 але. Я не бачу як передати параметри командного рядка чи встановити змінні оточення для програми, що запускається. Ну ок, я зробив скрипт на bash який вказую в автозапуск, а вже в ньому запускаю свій бінарник з потрібними параметрами. Якщо це важливо — бінарник був написаний на Rust, це просто один виконуваний файл. Але після запуску відкривається термінал, який потім не закривається, залишається відкритим. Не те, щоб це дуже принципово, але краще б нічого не відкривалося (там всі дії в фоні, втручання користувача не треба), або термінал закривався повністю, ніби і не відкривався. Бо не кожен раз я користуюсь терміналом, чого воно висіти буде...

Інше питання — інколи логін відбувається на кілька секунд раніше, ніж ноут встигне підключитися до WiFi. апка падає з помилкою. І у мене є питання, як коректно в MacOS перевірити, що є мережа. Звісно, я можу перевірити наявність IP адреси на інтерфейсі, чи спробувати розпізнати щось через DNS, чи зробити ping (тут складніше, це потребує додаткові привілеї, не бажано б) — але може в MacOS є якийсь стандартний і найбільш коректний шлях? Якось «зачекати наявності підключення до інтернет» — може навіть не в середині мого коду, а на рівні запуску апки?

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Не знаю чи допоможе але якраз сьогодні шукав cli команди для вайфая

www.mattcrampton.com/...​sx_terminal_command_line

Хз чи поможе з «на кілька секунд раніше», але може там є якийсь опшн для статуса. Йнм краще пінг бо 1) мережа може бути й не через вайфай в принципі 2) вайфай може підключитись але не працювати 3) це може бути й не ваш вайфай

Для варіанта 3) можна наприклад якийсь https-хост як маркер «своєї» мережі й звіряти fingerprint сертифіката але це вже для параноїків, може просто пінг/курл згодиться

Ну так то зрозуміло, що активний мережевий інтерфейс з IP не означає автоматично доступу до інтернету. Як і той факт, що може бути не тільки WiFi — дома я зазвичай підключаю дротом, так стабільніше і акумулятора на довше вистачає. Але не суть.

В принципі, аппка обробляє помилку, коли з’єднання немає, просто логічніше було-б почекати підключення. Але й переускладнювати код не хочу.

Доречі, ICMP з самого коду потребує таки root. Можна, звісно, просто виконати зовнішню команду ping яка в середині отримує це, але я не хочу а ні підвищення привілеїв суто для перевірки, а ні прив’язки до зовнішніх бінарників. Мабуть простіше тут DNS запрос зробити, ніж ping. Це так, думки вголос...

Свою мережу можна ще по mac роутера перевіряти, як варіант... ;)

Ssid і mac спуфиться, днс в принципі теж, якщо параноїком вже бути то вже тре якийсь криптохеш, інакше воно без толку тільки складніше

Механізм шо описано використовується в клаудфлер для ZTNA наприклад — будьякий ssl порт в приватній мережі, робиш конекшен навіть на айпіадресу (не хост навіть тобто працює без днс якщо адреса статична) і просто порівнюєш fingerprint. По суті хеш сертифіката використовується як маркер «своєї» мережі

Вітаю!
Це робиться на macOS через LaunchAgents (запуск в контексті юзера) / LaunchDaemons (запуск в контексті рута):
ви створюєте launch plist, де описуєте launch job, там можете передати і аргументи і встановити env, і вказати (чи не вказати) графічну сессію, у якій буде працювати те, що ви хочете запустити. Потім цей plist кладете у /Library/LaunchAgents (чи LaunchDaemons) відповідно.
Є документація від еплів developer.apple.com/...​/CreatingLaunchdJobs.html,
є ман в консолі www.manpagez.com/man/5/launchd.plist,
але імхо найкраще щоб розібратися тут: www.launchd.info

З приводу перевірки підключення: у macOS є такі механізми, але вони відкриті в ObjectiveC API, не для bash. Зробити пінг чи nc нормально, але можу запропонувати ще такий варіант (якщо прогама має працювати у фоні постійно): виставити у launch job параметр KeepAlive в true, тоді якщо ваша програма вийде, то система її сама перезапустить.

Дякую!

Перезапуск не потрібен, це ж не сервіс.

На рахунок того, щоб не відкривалася консоль — якщо запакуєш аппку у *.app — то наче консоль не буде зʼявлятися.

Теж утіліта на расті.

Ось таким баш скриптом пакую:

#!/bin/bash

TARGET=aarch64-apple-darwin
#TARGET=x86_64-apple-darwin

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

cd ${DIR}/..

cargo build --target ${TARGET}

mkdir target/macos &> /dev/null
mkdir target/macos/Lightswitch.app/  &> /dev/null
mkdir target/macos/Lightswitch.app/Contents &> /dev/null
mkdir target/macos/Lightswitch.app/Contents/Resources &> /dev/null
mkdir target/macos/Lightswitch.app/Contents/MacOS &> /dev/null

cp ${DIR}/../target/${TARGET}/debug/lightswitch ${DIR}/../target/macos/Lightswitch.app/Contents/MacOS/
cp ${DIR}/launch.sh ${DIR}/../target/macos/Lightswitch.app/Contents/MacOS/
cp ${DIR}/Info.plist ${DIR}/../target/macos/Lightswitch.app/Contents/
cp ${DIR}/AppIcon.icns ${DIR}/../target/macos/Lightswitch.app/Contents/Resources/

hdiutil create ${DIR}/../target/macos/Lightswitch.dmg \
    -volname "Lightswitch keyboard switcher" \
    -srcfolder ${DIR}/../target/macos/Lightswitch.app \
    -ov

Вміст файлу launch.sh:

#!/bin/bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

open -a Terminal ${DIR}/lightswitch

Підписатись на коментарі