├── images ├── 002-SUS.png ├── 001-Title.png └── 003-Reposado.png ├── LICENSE └── README.md /images/002-SUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffreybergier/Retro-Software-Update-Server/HEAD/images/002-SUS.png -------------------------------------------------------------------------------- /images/001-Title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffreybergier/Retro-Software-Update-Server/HEAD/images/001-Title.png -------------------------------------------------------------------------------- /images/003-Reposado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeffreybergier/Retro-Software-Update-Server/HEAD/images/003-Reposado.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Jeffrey Bergier 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Retro Software Update Server](images/001-Title.png) 2 | 3 | # Retro Software Update Server 4 | 5 | A guide on setting up an Apple Software Update Server Mirror in case Apple ever 6 | decides to shut down these old update servers. So far software update still 7 | works on Mac OS X 10.4 and above, but Apple already shut down servers for 10.3, 8 | 10.2, 10.1, and 10.0 and those can't be recovered. 9 | 10 | If you have an interest in retro Macs, this may be something you would like to 11 | set up in case something bad were to happen. This approach works because these 12 | servers are still online and still work. If you happen to be reading this 10 13 | years in the future (2035) because Apple shut down the software update servers 14 | for PowerPC Macs, then its too late. Sorry. 15 | 16 | ## Who Am I 17 | 18 | I'm Jeff, a fan of Mac OS X, NeXT, a software developer, and general retro tech 19 | enthusiast. I have other retro tech guides as well as software I have developed 20 | for retro Macs, so please check it out. 21 | 22 | - [MathEdit for OpenStep](https://github.com/jeffreybergier/MathEdit) 23 | - [MathEdit Development Posts on my Mastodon](https://jeffburg.social/tags/OpenStep) 24 | - [Retro Stream Tutorial](https://github.com/jeffreybergier/Retro-Stream-Tutorial) 25 | - [iMac G4 Posts on my Mastodon](https://jeffburg.social/tags/iMacG4) 26 | - [Homemade iMac 5K Monitor posts on my Mastodon](https://jeffburg.social/tags/iMac5K) 27 | 28 | ## How do Software Updates Work on the Mac 29 | 30 | ![Retro Software Update Server](images/002-SUS.png) 31 | 32 | The software update system for Mac OS X 10.4 and higher is actually amazingly 33 | simple and flexible. For 10.3 and lower, it was a traditional client/server 34 | application. The client would send some information about itself to the server 35 | and the server would process this and tell the client what updates it needed. 36 | While this seems logical, it also means your servers will be busy processing 37 | requests from clients. And as Apple started to become really successful at 38 | selling Macs in the early 2000s the OS X team probably realized that this would 39 | fail to scale. 40 | 41 | So what did they change? Well, in 10.4 and later, the Software Update Server is 42 | nothing more than a huge set of files and a few Update catalogs... one for each 43 | version of the OS. These sucatalog files listed every update available as well 44 | as "distribution" files. These distribution are available in for every supported 45 | language they contain the localized description but also they contain inline 46 | javascript that will be executed by the client to determine if the update is 47 | needed. 48 | 49 | What this means is Apple offloaded all of the work of determining which updates 50 | it needs from the server to the client. This is great for Apple's server load, 51 | but it also explains why checking for updates can take so long the first time. 52 | The client literally needs to download hundreds of distribution files. Yes, they 53 | are only a few K each, but then the client also needs to execute the javascript 54 | for each one. 55 | 56 | The other side-effect of this system is that now it is easy to mirror the 57 | software update server as there is no server side logic 58 | 59 | **Enter Mac OS X Server Software Update Server** 60 | 61 | Back in the day, Apple included a Software Update Server as part of Mac OS X 62 | Server. Apple intended companies to use this to mirror the software updates 63 | internally in a company to do 2 things: 64 | 65 | 1. Save bandwidth when updating a fleet of Macs 1. Control which updates were 66 | available to the Macs in your company to ensure that you could test 67 | compatibility first 68 | 69 | This feature is long dead and now Apple facilitates the same control by allowing 70 | companies to white list or blacklist updates via MDM (Mobile Device Management). 71 | This does not create a mirror, but simply tells client Macs to ignore updates. 72 | This method does not save bandwidth in your company. But in the modern day, 73 | bandwidth is a lot less expensive than it used to be. 74 | 75 | When I first started this project, I actually tried to use 10.6 Snow Leopard 76 | Server to host the software update server. However, after much troubleshooting, 77 | I could not get it to download the updates reliably. It would only download 78 | about 1/3 of the updates which is not enough for success. I don't know why it 79 | refused to download them. All it said was there was a suspected security problem 80 | and so it refused. ChatGPT suggested that the Apple Software Update Server 81 | distributed with their OS had very picky client-side URL validation and if the 82 | URL's failed these basic checks, it would not even start the download. 83 | 84 | **Enter [Reposado](https://github.com/wdas/reposado/blob/main/docs/getting_started.md)** 85 | 86 | Reposado is an open source project written in Python 2 that replicates the 87 | functionality of the software update server. It checks the Apple catalogs, 88 | downloads the updates, and then generates new catalogs specific to your mirror. 89 | In my experience doing this, it seems to work super well. So this guide will 90 | explain how to set this up for you so you can prepare for the very dark day when 91 | Apple shuts down these old software updates \(which may never come\). 92 | 93 | ## Approach / Guide / Table of Contents 94 | 95 | 1. Install Git, Homebrew, Python2 96 | 1. Choose where Software Updates will be mirrored on your server Mac 97 | 1. Configure the Web Server on your server Mac 98 | 1. Configure Reposado on your server Mac 99 | 1. Use Reposado to mirror Apple's existing software updates to your server Mac 100 | 1. Configure the retro Mac to fetch updates from your server Mac 101 | 102 | ## System Requirements 103 | 104 | **Server Mac** 105 | 106 | 1. 50GB+ to dedicate to storing updates 107 | - Even the minimal set for 10.4 Tiger is 20GB 108 | - Supporting all the way to 10.9 Mavericks takes 200GB 109 | - ChatGPT says that around 10.11/10.12 Apple started locking down the 110 | software update server and it can't be changed 111 | 1. A normal home network 112 | - This guide assumes you connect all your Macs to the internet with ethernet 113 | or WiFi and they can find eachother and connect to eachother using Bonjour 114 | names. 115 | 116 | **Retro Mac** 117 | 118 | 1. Connected to Ethernet or WiFi on the same network as your server Mac 119 | 1. Mac OS X 10.4 or higher 120 | 121 | Note that the server Mac can really be any system. Even modern Linux \(such as 122 | Debian and Ubuntu\) automatically identify themselves via Bonjour names. But 123 | this guide gives instructions when using a Mac as the server. 124 | 125 | # Guide 126 | 127 | This guide pretty much runs 100% from Terminal. 128 | Any text `in this special format` is a terminal command you can copy and paste. 129 | 130 | ## 1. Install Git, Homebrew, Python2 131 | 132 | - Git is included as part of the Xcode command line utilities AND these utilties 133 | are required for Homebrew anyway. 134 | 135 | ```xcodeselect --install``` 136 | 137 | - HomeBrew is a simple package manager for macOS. Its easy to install. 138 | Just follow the guide on [https://brew.sh](https://brew.sh). Make sure to 139 | follow the instructions in the Terminal after installing HomeBrew. 140 | They are required to make sure that commands you install via homebrew are 141 | easily launchable from the Terminal. 142 | 143 | ```/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"``` 144 | 145 | ### Python2 146 | 147 | This is the difficult one. Python2 is far out of date and HomeBrew no longer 148 | has an easy installer for it. We have to use PyEnv and this basically seemed 149 | to build Python2 from source, which is never fun. 150 | 151 | **Install PyEnv and other tools needed for compiling** 152 | 153 | ```brew install pyenv zlib bzip2 readline openssl@1.1``` 154 | 155 | **Configure the environment for python2 build** 156 | 157 | ``` 158 | export LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix openssl@1.1)/lib" 159 | export CPPFLAGS="-I$(brew --prefix zlib)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(brew --prefix openssl@1.1)/include" 160 | export PKG_CONFIG_PATH="$(brew --prefix zlib)/lib/pkgconfig:$(brew --prefix bzip2)/lib/pkgconfig:$(brew --prefix readline)/lib/pkgconfig:$(brew --prefix openssl@1.1)/lib/pkgconfig" 161 | ``` 162 | 163 | **Configure your shell to use PyEnv** 164 | 165 | Sorry you may need to look up the commands 166 | for how to use `vi` or use a text editor you know better like `nano` 167 | 168 | ```vi ~/.zshrc``` 169 | 170 | Paste in the following text and then save and exit 171 | 172 | ``` 173 | export PATH="$HOME/.pyenv/bin:$PATH" 174 | eval "$(pyenv init --path)" 175 | eval "$(pyenv init -)" 176 | ``` 177 | 178 | **Compile Python2** 179 | 180 | ```pyenv install 2.7.18``` 181 | 182 | **Set Python2 as the default** 183 | 184 | ```pyenv global 2.7.18``` 185 | 186 | **Test Python** 187 | 188 | You should not get an error when running this command 189 | 190 | ```python -version``` 191 | 192 | ## 2. Choose where Software Updates will be mirrored on your server Mac 193 | 194 | The Software Update application on your Mac expects a very specific directory 195 | structure and catalog format. Reposado creates this for you. But you still 196 | need to decide where on your system this will go and you will also need 197 | to configure the web server to use this directory. It is OK to have this on 198 | an external drive as the mirror takes a lot of space. 199 | 200 | On my system I put everything in 201 | 202 | `/Volumes/Data/Virtualization/SUS` 203 | 204 | So the Web Server Document Root and Reposado Storage is 205 | 206 | `/Volumes/Data/Virtualization/SUS/www` 207 | 208 | Reposado git clone is 209 | 210 | `/Volumes/Data/Virtualization/SUS/reposado` 211 | 212 | Reposado Metadata storage is 213 | 214 | `/Volumes/Data/Virtualization/SUS/reposado/code/metadata` 215 | 216 | So you can put everything wherever you like, but this guide assumes this 217 | structure 218 | 219 | ## 3. Configure the Web Server on your server Mac 220 | 221 | Mac OS X has always included Apache as a web server, its just disabled by 222 | default. Its nothing fancy, but it will work for our retro Mac. 223 | 224 | **Set DocumentRoot to the directory you selected above** 225 | 226 | `sudo vi /etc/apache2/httpd.conf` 227 | 228 | This file is pretty long so you have to scroll down to find the DocumentRoot 229 | setting. I don't think you need to change other options, but I here are the key 230 | ones. 231 | 232 | ``` 233 | DocumentRoot "/Volumes/Data/Virtualization/SUS/www" 234 | 235 | Options Indexes FollowSymLinks 236 | AllowOverride All 237 | Require all granted 238 | 239 | ``` 240 | 241 | **Give the webserver full disk access** 242 | 243 | This might not be needed if you your directory root is on the boot drive 244 | but I definitely needed it because mine is on an external drive. 245 | 246 | 1. Open System Settings→Privacy→Full Disk Access 247 | 1. Click the plus button and enter your admin password 248 | 1. Press ⌘+Shift+G in the file picker and type `/usr/sbin/httpd` 249 | 250 | **Turn on the Web Server** 251 | 252 | `sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist` 253 | 254 | **Test the Web Server** 255 | 256 | Put a test file in the document root. It can be any file, but perhaps a small 257 | `.txt` file is easiest. 258 | 259 | 1. Open Safari on your Server Mac and type `http://localhost/mytestfile.txt` 260 | 1. Open Safari on your Retro Mac and type ``http://Server-Bonjour-Name.local/mytestfile.txt` 261 | 262 | Note that step 2 is critical. If you can't get the website to load on your 263 | Retro Mac you won't be able to update from it either. 264 | 265 | ## 4. Configure Reposado on your server Mac 266 | 267 | Ok, Reposado is where all the magic happens, so lets get started! 268 | 269 | **Clone the [Reposado](https://github.com/wdas/reposado) Repository** 270 | 271 | ``` 272 | cd /Volumes/Data/Virtualization/SUS 273 | git clone https://github.com/wdas/reposado.git 274 | ``` 275 | 276 | **Configure Reposado** 277 | 278 | `/Volumes/Data/Virtualization/SUS/reposado/code/repoutil --configure` 279 | 280 | Reposado will ask you for the directories you chose earlier. Note if you drag in 281 | the directories from the Finder, it appends a space after them and the developer 282 | of Reposado says this will cause errors. 283 | 284 | ``` 285 | Filesystem path to store replicated catalogs and updates [None]: /Volumes/Data/Virtualization/SUS/www 286 | Filesystem path to store Reposado metadata [None]: /Volumes/Data/Virtualization/SUS/reposado/code/metadata 287 | Base URL for your local Software Update Service 288 | (Example: http://su.your.org -- leave empty if you are not replicating updates) [None]: Server-Bonjou-Name.local 289 | ``` 290 | 291 | **Configure Reposado (Continued)** 292 | 293 | Reposado defaults to being a production software update server mirror, which is 294 | not what you want because you are setting up a retro software update mirror in 295 | case of catastrophe. And you probably don't want to take 400+GB of updates for 296 | all modern Macs when you could use less than 100GB to support updating 10.6, 297 | 10.5, and 10.4 only. 298 | 299 | `open /Volumes/Data/SUS/reposado/code/preferences.plist` (TextEdit should open) 300 | 301 | Your configuration file will look something like this. Copy and paste the keys 302 | listed below into your configuration and then customize them as you like: 303 | 304 | - **AppleCatalogURLs** to the bare minimum for 10.4 Tiger only (we will expand later after we confirm its working) 305 | - **PreferredLocalizations** to include the languages you care about 306 | - **RepoSyncLogFile** so you can see sync progress and verify everything is working 307 | 308 | ```xml 309 | 310 | 311 | 312 | 313 | LocalCatalogURLBase 314 | http://Barely-Regal.local 315 | UpdatesMetadataDir 316 | /Volumes/Data/Virtualization/SUS/reposado/code/metadata 317 | UpdatesRootDir 318 | /Volumes/Data/Virtualization/SUS/www 319 | AppleCatalogURLs 320 | 321 | http://swscan.apple.com/content/catalogs/index.sucatalog 322 | http://swscan.apple.com/content/catalogs/index-1.sucatalog 323 | 324 | PreferredLocalizations 325 | 326 | English 327 | en 328 | Japanese 329 | ja 330 | 331 | RepoSyncLogFile 332 | /var/log/reposado_sync.log 333 | HumanReadableSizes 334 | 335 | 336 | 337 | ``` 338 | 339 | **Create the Log File** 340 | 341 | Create the log file and make it readable and writable by all users. Normally it 342 | would be better to make it readable and writable by the right people, but its a 343 | single log file. Not really security critical. 344 | 345 | `sudo touch /var/log/reposado_sync.log` 346 | `sudo chmod 777 /var/log/reposado_sync.log` 347 | 348 | **You're Ready to Roll!** 349 | 350 | In the next section we will fire this thing up and updates will start to stream 351 | in! 352 | 353 | ## 5. Use Reposado to mirror Apple's existing software updates to your server Mac 354 | 355 | First we will do a test run with the minimal set of Software Update Catalogs 356 | that you configured in the previous section. This is about 20-25GB worth of 357 | updates, so depending on how fast or slow your internet connection is, this 358 | could take a while. Reposado does not generate the catalogs for your retro Mac 359 | to use until it has finished downloading everything, so you need to wait until 360 | it finishes. This is why we start with the minimal catalogs. 361 | 362 | **Tail the log so you can see the progress** 363 | 364 | Open a new terminal window or tab and run this command to view the log as it 365 | gets updated. 366 | 367 | `tail -f /var/log/reposado_sync.log` 368 | 369 | **Start the Software Update Sync** 370 | 371 | `/Volumes/Data/Virtualization/SUS/reposado/code/repo_sync` 372 | 373 | Thats it. Now you have to wait for it to download 20GB or so. You should be able 374 | to see progress in the other terminal window with the tailed log file. 375 | 376 | **What Success Looks Like** 377 | 378 | The log file will output hundreds of lines, so you may be wondering what success 379 | looks like. After downloading all of the files, Reposado will build the catalog 380 | files and then report `repo_sync run ended`. It will look something like this. 381 | 382 | ``` 383 | Sep 07 17:26:44 Could not get data from dist file: /Volumes/Data/Virtualization/SUS/content/downloads/03/09/061-5359/mxWDL8cXkFTv9pCp8GMFr2bJFXjtqyQbvx/022-4184.English.dist 384 | Sep 07 17:26:46 Could not replicate http://swcdn.apple.com/content/downloads/49/33/061-6390/BYBbD3TFbdpntDts78ddSzDSRpXnGKnQsy/FinalCutPro6.0.6Update.smd: Error 22: The requested URL returned error: 403 385 | Sep 07 17:26:51 Building index.sucatalog... 386 | Sep 07 17:26:51 WARNING: did not add product 061-1688 to catalog index.sucatalog.apple because it has not been downloaded. 387 | Sep 07 17:26:51 WARNING: did not add product 061-2736 to catalog index.sucatalog.apple because it has not been downloaded. 388 | Sep 07 17:26:51 WARNING: did not add product 061-1720 to catalog index.sucatalog.apple because it has not been downloaded. 389 | Sep 07 17:26:51 WARNING: did not add product 041-85067 to catalog index.sucatalog.apple because it has not been downloaded. 390 | Sep 07 17:26:51 WARNING: did not add product 061-6390 to catalog index.sucatalog.apple because it has not been downloaded. 391 | Sep 07 17:26:51 WARNING: did not add product 061-2006 to catalog index.sucatalog.apple because it has not been downloaded. 392 | Sep 07 17:26:51 WARNING: did not add product 061-5359 to catalog index.sucatalog.apple because it has not been downloaded. 393 | Sep 07 17:26:51 WARNING: did not add product 061-2193 to catalog index.sucatalog.apple because it has not been downloaded. 394 | Sep 07 17:26:52 178 products found in http://swscan.apple.com/content/catalogs/index-1.sucatalog 395 | Sep 07 17:26:53 Building index-1.sucatalog... 396 | Sep 07 17:26:54 268 products found in http://swscan.apple.com/content/catalogs/others/index-leopard.merged-1.sucatalog 397 | Sep 07 17:26:55 Building index-leopard.merged-1.sucatalog... 398 | Sep 07 17:26:56 345 products found in http://swscan.apple.com/content/catalogs/others/index-leopard-snowleopard.merged-1.sucatalog 399 | Sep 07 17:27:05 Building index-leopard-snowleopard.merged-1.sucatalog... 400 | Sep 07 17:27:08 600 products found in http://swscan.apple.com/content/catalogs/others/index-lion-snowleopard-leopard.merged-1.sucatalog 401 | Sep 07 17:27:37 Building index-lion-snowleopard-leopard.merged-1.sucatalog... 402 | Sep 07 17:27:38 448 products found in http://swscan.apple.com/content/catalogs/others/index-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog 403 | Sep 07 17:27:42 Building index-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog... 404 | Sep 07 17:27:43 464 products found in https://swscan.apple.com/content/catalogs/others/index-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog 405 | Sep 07 17:27:57 Building index-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog... 406 | Sep 07 17:27:58 repo_sync run ended 407 | ``` 408 | 409 | Warnings will be normal as some updates will not be available any longer. If the 410 | number of products not downloaded is HUGE like, hundreds of items, then you have 411 | a problem. But I think 10 or 20 is normal? 412 | 413 | **Choose Max Version of OS X You Want Updates For** 414 | 415 | This is a personal choice based on what Macs you are interested in, how much 416 | space you have to dedicate to this, and what Macs you think Apple will remove 417 | from the update servers soonest. 418 | 419 | You can see all the catalogs in this [Reposado file.](https://github.com/wdas/reposado/blob/main/docs/reposado_preferences.md) 420 | They are named in a pretty orderly way, so select which OS you want to support 421 | and then put in the catalog file for that one and all the versions lower. So if 422 | you want to support 10.10 Yosemite and lower, your Preferences.plist would look 423 | like this: 424 | 425 | ``` 426 | AppleCatalogURLs 427 | 428 | http://swscan.apple.com/content/catalogs/index.sucatalog 429 | http://swscan.apple.com/content/catalogs/index-1.sucatalog 430 | http://swscan.apple.com/content/catalogs/others/index-leopard.merged-1.sucatalog 431 | http://swscan.apple.com/content/catalogs/others/index-leopard-snowleopard.merged-1.sucatalog 432 | http://swscan.apple.com/content/catalogs/others/index-lion-snowleopard-leopard.merged-1.sucatalog 433 | http://swscan.apple.com/content/catalogs/others/index-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog 434 | https://swscan.apple.com/content/catalogs/others/index-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog 435 | https://swscan.apple.com/content/catalogs/others/index-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog 436 | 437 | ``` 438 | 439 | After you add the new catalogs, run sync again 440 | 441 | `/Volumes/Data/Virtualization/SUS/reposado/code/repo_sync` 442 | 443 | Note that supporting up to 10.10 Yosemite takes abut 300GB of space 444 | 445 | ![Retro Software Update Server](images/003-Reposado.png) 446 | 447 | **Some Final Things** 448 | 449 | Basically, after you complete the sync, you never need to Reposado again. The 450 | webserver and the `www` folder are all you need. The Software Update server is 451 | based off of a completely static system, which is super nice and reliable. 452 | 453 | If you change the hostname of the server Mac, you can update the 454 | Preferences.plist file and then run sync again, and it won't download any new 455 | files, but at the end Reposado will update the catalog files to use your new 456 | hostname which is fantastic. 457 | 458 | ## 6. Configure the retro Mac to fetch updates from your server Mac 459 | 460 | So this is a bit tricky, because its likely that your retro Mac(s) have already 461 | run all of their software updates. So when you tell them to check for updates 462 | from your new Software Update Server Mirror, the retro Mac will still tell you 463 | there are no updates available. So how do you test? 464 | 465 | - If you don't mind erasing your retro Mac you could just reinstall the OS - 466 | Install a fresh OS to an external firewire hard drive and boot from that - 467 | Install and old version of OSX in a Virtual Machine and try that 468 | 469 | **Configure the Retro Mac** 470 | 471 | All of these have their pros and cons so you decide. But once you get the Mac 472 | working and it is ready for software updates, run the following command in the 473 | terminal on the retro Mac 474 | 475 | `sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL "http://Server-Bonjour-Name.local/content/catalogs/others/index-lion-snowleopard-leopard.merged-1.sucatalog"` 476 | 477 | Note that you have to point the OS at the correct catalog given the version of 478 | OS X you are running or else it won't see all of the updates. 479 | 480 | **Tail the Apache Access Logs on the Server Mac** 481 | 482 | Tailing these logs will show you the retro Mac is checking all the updates. 483 | 484 | `tail -f /var/log/apache2/access_log /var/log/apache2/error_log` 485 | 486 | **Check for Updates on the Retro Mac** 487 | 488 | Check for updates on your retro Mac and install them. If its a fresh install, it 489 | may take several reboots to get through all the updates. 490 | 491 | `Apple Menu→Software Update` 492 | 493 | **What Success Looks Like** 494 | 495 | In the logs on the server Mac, you should see a lot of access. Like hundreds of 496 | files to check for updates. On the retro Mac, in the title of the Software 497 | Update window you should see the hostname of your server Mac in parentheses. See 498 | the screenshot below. 499 | 500 | ![Retro Mac Configured](images/001-Title.png) 501 | 502 | **Some Final Things** 503 | 504 | In the real software update server, Apache rewrite rules are used so any version 505 | can fetch index.sucatalog and the server will smartly rewrite the URL to be the 506 | correct one. You can add these if you like, but since you're probably not 507 | running an army of retro Macs, its probably easier to just do it on the retro 508 | Mac instead. Here are the rewrite rules if you are interested. 509 | 510 | ``` 511 | RewriteEngine On 512 | RewriteCond %{HTTP_USER_AGENT} Darwin/9 513 | RewriteRule ^/index\.sucatalog$ /index-leopard.merged-1.sucatalog 514 | RewriteCond %{HTTP_USER_AGENT} Darwin/10 515 | RewriteRule ^/index\.sucatalog$ /index-leopard-snowleopard.merged-1.sucatalog 516 | RewriteCond %{HTTP_USER_AGENT} Darwin/11 517 | RewriteRule ^/index\.sucatalog$ /index-lion-snowleopard-leopard.merged-1.sucatalog 518 | ``` 519 | 520 | --------------------------------------------------------------------------------