Software Update Service для Macintosh, що не підтримують macOS Sierra

Опублікував Сергій Макаренко 26-10-2016 об 00:13

Позавчора вийшло перше мінорне оновлення для macOS Sierra — 10.12.1. Оскільки я є власником Mac Pro (Early 2008), то встановлення цього оновлення для мене здавалося якимось зовсім незрозумілим процесом, так як я встановлював macOS Sierra на свій старий Macintish за допомогою танців із бубном. Почавши шукати відповідь на запитання «а чи можна і мені оновитися» наштохнувся на дуже цікаву інформацію, яка дозволила мені модифікувати Software Update Service на своєму Mac mini Server таким чином, що мій старенький Mac Pro буде стабільно отримувати оновлення до останньої актуальної версії Sierra.

Для тих, хто ще за часів Developer Preview цікавився можливістю запуску macOS Sierra на старих Macintosh, які Apple офіційно списала з рахунків, це посилання буде дуже добре знайомим. На сторінці найцікавишим для мене був розділ Updates, що знаходиться в самому низу. Там для отримання оновлень macOS Sierra, зокрема 10.12.1, пропонується завантажити програму AUSEnabler, яка спрямує демон softwareupdate з вашого комп’ютера на дзеркало, яке підняли товариші з FurCode. Оскільки я дуже люблю розгадувати загадки на кшталт цієї я почав копати і розбиратися з тим, як їм це вдалося зробити.

Перше, що я зробив — це дізнався посилання, яке спрямовувало мій комп’ютер на модфікований каталог після використання AUSEnabler:

[19:43] serhiy_makarenko@mac-pro-serhiya-makarenka.makarenko.home [/Users/serhiy_makarenko] > defaults read /Library/Preferences/com.apple.SoftwareUpdate CatalogURL
http://swdist.furcode.co/index-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog

Після цього почалася препарація файла каталога в надії знайти секрет того, яким чином працює це неофіційне дзеркало. Для того, щоб було що шукати я подався до програми Server, що працює на моєму Mac mini Server, щоб дізнатися Product ID оновлення, за яким вже можна було шукати відповідні файли, що входили в склад апдейта в файлі каталога, який я завантажив за посиланням вище.

macOS Sierra update з Product ID 031-86699 macOS Sierra update з Product ID 031-86698

Власне, позавчора оновлення для macOS Sierra вийшло у вигляді двох дистрибутивів із Product ID 031-86698 та 031-86699. Покопирсавшись в файлі каталога я знайшов більш предметну інформацію про потрібні мені лінки на файли оновлень. Цікаво те, що посилання на самі файли оновлення йшли прямісінько на сайт Apple, тому можна безтурботно завантажувати їх, ризику підміни цих патчів з боку FurCode немає:

<dict>
    <key>Digest</key>
    <string>ecc4df36eb5e90a6b298a83e3b60b0b2c684454b</string>
    <key>MetadataURL</key>
    <string>https://swdist.apple.com/content/downloads/14/07/031-86698/37wn4x4j48za5vb9nd0h0p2icy5td7d8y0/macOSUpd10.12.1ForSeed.pkm</string>
    <key>URL</key>
    <string>http://swcdn.apple.com/content/downloads/14/07/031-86698/37wn4x4j48za5vb9nd0h0p2icy5td7d8y0/macOSUpd10.12.1ForSeed.pkg</string>
    <key>Size</key>
    <integer>1099566512</integer>
</dict>

Продовжуючи нетривалі пошуки я відшукав саме те, що мені було потрібно:

<key>Distributions</key>
    <dict>
        <key>uk</key>
        <string>https://swdist.furcode.co/dists-dp/031-86698.uk.dist</string>
        <key>English</key>
        <string>https://swdist.furcode.co/dists-dp/031-86698.English.dist</string>
        <key>Dutch</key>
        <string>https://swdist.furcode.co/dists-dp/031-86698.Dutch.dist</string>
        <key>pl</key>
        <string>https://swdist.furcode.co/dists-dp/031-86698.pl.dist</string>
        <key>ru</key>
        <string>https://swdist.furcode.co/dists-dp/031-86698.ru.dist</string>
        <key>German</key>
        <string>https://swdist.furcode.co/dists-dp/031-86698.German.dist</string>
    </dict>

Ну і далі, борсаючися в нетрях dist-файла я з’ясував, що це, насправді, xml з купою інформації про оновлення і з певною кількістю перевірок, які повинен пройти ваш Macintosh перед тим, як воно буде показане вам в програмі Mac App Store. Не буду публікувати тут вміст самого файла (його можна дослідити самостійно), він дуже об’ємний. Зупинюся лише на основних моментах.

По-перше, в dist-файлі знаходиться два скрипта: VolumeCheck та InstallationCheck. Нас цікавить другий. По-друге, сам скрип витягує дані про деяки параметри вашого Macintish за допомогою таких вбудованих в macOS утіліт:

Для того, щоб мій Mac Pro пройшов перевірку скриптом InstallationCheck мені потрібно було модифікувати вміст таких змінних: boardIds, cpuFeatures та nonSupportedModels. board-Id свого комп’ютера я дістав з нетрів системи так само, як це робить і скрипт:

[23:23] serhiy_makarenko@mac-pro-serhiya-makarenka.makarenko.home [/Volumes/Data HD/Downloads] > ioreg -lp IOService | grep board-id
    |   "board-id" = <"Mac-F42C88C8">    

Ідентифікатор моделі не змінюється під час життєвого циклу вашого Macintosh і вичитати його можна за допомогою команди sysctl:

[23:24] serhiy_makarenko@mac-pro-serhiya-makarenka.makarenko.home [/Volumes/Data HD/Downloads] > sysctl hw.model
hw.model: MacPro3,1

Розбиратися з тим, як вираховується змінна cpuFeatures я не став і просто задав в скрипті потрібне значення. Оскільки dist-файлів через кількість підтримуваних мов в macOS було дуже багато я вирішив внести в них необхідні зміни з мінімальною кількістю роботи руками. Тому для модифікації на файловій системі macOS в папці завантажень Software Update Service я використав наступні команди (які були наповнені знайденою саме для моєї моделі Mac Pro потрібною інформацією):

cd /Library/Server/Software\ Update/Data/html/content/downloads
find . -name "031-86698.*.dist"
find . -name "031-86699.*.dist"
sed -i -e 's/var boardIds = \[/var boardIds = \[\'Mac-F42C88C8\',/g;s/\'MacPro3,1\'\,//g;s/var cpuFeatures = system.sysctl( \'machdep.cpu.features\' );/var cpuFeatures = \'VMM\';/g;/cpuFeatures=cpuFeatures.split(\" \");/d' 031-86698.*.dist
sed -i -e 's/var boardIds = \[/var boardIds = \[\'Mac-F42C88C8\',/g;s/\'MacPro3,1\'\,//g;s/var cpuFeatures = system.sysctl( \'machdep.cpu.features\' );/var cpuFeatures = \'VMM\';/g;/cpuFeatures=cpuFeatures.split(\" \");/d' 031-86699.*.dist

Після цього все має запрацювати. Я навмисне при модифікації файлів за допомогою sed використовував ключик -e для створення бекапу. Якщо під час внесення змін ви нічого не зламали (як я), резервні копії можна видалити.

Доступне оновлення macOS Sierra

Звісно, цей процес потрібно буде повторювати для кожного наступного оновлення. Але враховуючи безпечність (бо оновлення я отримую безпосередньо з серверів Apple), відсутність необхідності патчити кожне оновлення і легку автоматизцію за допомогою не дуже складних команд вважаю прийнятним клопітом задля подовження життя мого старенького Mac Pro в очікуванні нової моделі «відра» із підтримкою DDR4.