Время прошло, а этот пост всё не меняется.
@UBNT-MikeD предложил возможное решение проблемы со сменой пути в встроенном Java runtime, но оно так и не было опубликовано или прокомментировано. После некоторых экспериментов на другом проекте, где требовался launchd plist с некоторыми подстановками, я нашёл окончательное решение для бесфамильного launchd агент plist файла, вне зависимости от того, что обновит Ubiquiti в версии контроллера для macOS.
Я использовал решение @chriswferris для своей домашней и офисной «всей» Unifi-установки, но меня всегда бесило, что каждый раз, когда Ubiquiti меняли версию встроенного Java runtime, мне приходилось вручную править plist и менять путь. Ещё хуже было, если нужно было настроить всё у родителей или у друзей — приходилось учитывать это при каждом обновлении.
Это заставило меня задуматься: должно же быть возможно автоматизировать процесс или использовать скрипт для автоматического обновления plist файла. В итоге оказалось всё гораздо проще.
Сначала я попробовал параметр EnableGlobbing в plist, чтобы заменить изменяющуюся часть пути (версию Java) на звездочку, и чтобы она подставлялась автоматически в актуальный путь. В man’е для launchd.plist этот механизм описан так: «EnableGlobbing <boolean> — флаг, который заставляет launchd использовать механизм glob(3) для обновления аргументов программы перед запуском».
Так что я заменил путь в plist на:
<string>/Applications/UniFi.app/Contents/PlugIns/jre*.jre/Contents/Home/jre/bin/java</string>
Но по какой-то непонятной причине, это не сработало. Я думаю, что должно, но не работает (если кто-то знает почему — делитесь в комментариях).
Тогда я перешёл ко второму методу, который нашёл, когда искал решение для другого plist файла. Он заключается в том, чтобы запускать shell и позволить ему сделать расширение подстановочных знаков используя «bash -c» в качестве аргумента программы (может, можно и просто sh).
Я добавил параметр EnableGlobbing и вызов shell, в результате полный plist файл получился таким:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/usr/local/sbin</string>
</dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>com.ubiquiti.unifi-app.plist</string>
<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>exec /Applications/UniFi.app/Contents/PlugIns/jre*.jre/Contents/Home/jre/bin/java -Djava.awt.headless=true -Xmx1024M -jar /Applications/UniFi.app/Contents/Resources/lib/ace.jar start</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/Applications/UniFi.app/Contents/Resources/</string>
</dict>
</plist>
С этим решением plist файл не нужно менять, и я могу создать стандартный установочный pkg-пакет, который можно развернуть удалённо, если понадобится установить на чьём-то компьютере, или автоматизировать развертывание с помощью DeployStudio, Vagrant, munki и подобных инструментов.
Надеюсь, это поможет, и мы наконец-то сможем запускать без присмотра headless macOS серверы с бесфамильным Unifi контроллером 😉
Удачи!