Prevent a partition from mounting at boot time

Cheating a bit here, because I'm just linking to an excellent blog post on the procedure:
OS X Tip: Prevent a Volume From Mounting at Startup

It's very helpful if you've set up a Boot Camp dual-boot with Windows, and you don't want to have the Windows partition automatically mount when you boot into Mac OS X.

One working fix for “filter failed” printer message on a Mac

There seem to be several "working" (your mileage may vary) fixes for the "filter failed" message when you try to print on a Mac (may happen in Linux, too, since Mac uses CUPS for printing), and they all seem driver-related:
'Filter' failed error when printing from EPSON
Yosemite and a printer driver that broke

The one that fixed it for me was checking on another computer that's working fine with that printer and going to System Information > Printers to find out what the exact driver is that's used, and then deleting the printer from the computer having issues, and then re-adding it manually (not with a script) and manually selecting the correct driver.

Manually adding icons to Munki-imported packages

As with all Munki tutorials, this one assumes you already know some Munki basics. If you don't, you might want to start with Absolute beginner's guide to setting up Munki (not monkey).

When you use munkiimport to import software packages, it will either find icons automatically or prompt you to try to extract icons from the package. In some cases, the extraction doesn't work, and you may have to create an icon manually.

First, go into your munki_repo and then within the pkgsinfo subdirectory, find your package info. As an example, we'll use Inkscape. Open it up in a text editor (e.g., TextWrangler).

munkiicons01
What we want from this is the name of the package (which may be different from the display name). The name here is Inkscape, so that's what we're going to call the .png file we create.

Alternate Method to Find Names: If you run

sudo managedsoftwareupdate -vvv
on your server on a client machine, you can see all the names of the .png files that did not download because of a 404 (not found) message. This may be quicker, actually.

Mac software packages usually have a .icns file for the icon, but Munki is looking for a .png, so we'll do a conversion.

munkiicons02
On a computer that has installed the program you want (in this case, Inkscape), you want to run something like the following command:

sips -s format png /Applications/Inkscape.app/Contents/Resources/Inkscape.icns --out /Users/Shared/munki_repo/icons/Inkscape.png
If Inkscape is not installed on your Munki repository server, you can just output it to somewhere else temporarily and then put it in the munki_repo's icons folder later.

munkiicons03
Then, if a user launches up Managed Software Center, she should see the new icon associated with the software package, instead of the generic placeholder.

Troubleshooting Suggestion: If your icons still aren't showing up, and you're 100% certain the name matches, the permissions may be wrong. I thought 644 on the icons directory content would be a enough (read/write for owner, read for everyone else), but I had to change it to 755 recursively to get all the icons to work, for some reason.

More details at the Munki Google Code page about icon guidelines.

Creating an installation package for a scheduled Adobe Remote Update Manager

This is kind of a dual-purpose Mac tutorial—how to automate Adobe Remote Update Manager and how to create an installation package using a point-and-click graphical interface.

Automating Adobe Remote Update Manager

You can find the Adobe Remote Update Manager on Adobe's Creative Suite Enterprise Deployment page. Just scroll down a bit until you find it.

adoberemoteupdatemanager00
When you launch up what appears to be an installer, it's not an installer at all. It's just a folder with a bunch of files in it.

For our purposes here, the only file that matters is RemoteUpdateManager. That is the actual executable binary that initiates the updates. You don't really need to install the RUM man(ual) page. If you want to find the update options (including how to use a proxy instead of getting updates directly from Adobe), you can find those on Adobe's website.

Remember where the RemoteUpdateManager file is. We'll need that file later.

Then create a text file called local.rum.plist and put in the following contents:

<?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>Label</key>
<string>local.rum.plist</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Scripts/RemoteUpdateManager</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<!-- <key>Day</key>
<integer>0</integer> -->
<key>Hour</key>
<integer>18</integer>
<key>Minute</key>
<integer>15</integer>
<!-- <key>Month</key>
<integer>7</integer>
<key>Weekday</key>
<integer>0</integer> -->
</dict>
</dict>
</plist>
You'll see that day, month, and weekday are commented out. You can uncomment those and pick a particular recurrence. Right now it's also set to run every day at 18:15 (or 6:15pm), but you can change those values as well.

The text file you just created is the launch daemon that will run the Adobe Remote Update Manager (RUM) once a day at 18:15 (or with whatever frequency you set up).

Creating the distributable package

If there are multiple machines you want to set this up for, you don't want to be manually copying files to two different locations on each computer. We're going to set it up so you can install a .pkg file on each computer, or distribute the .pkg file to each computer using something like Munki.

Apple provides its own official documentation on how to build a .pkg file. If you can use those instructions, good on you.

I found it much easier to use a program called Packages to do it the point-and-click way.

adoberemoteupdatemanager01
When you go to the Packages website, click the Download link.

adoberemoteupdatemanager02
Once you open the download, double-click Install Packages.pkg.

adoberemoteupdatemanager03
Click Continue.

adoberemoteupdatemanager04
After you read the agreement, click Continue again.

adoberemoteupdatemanager05
Click Agree.

adoberemoteupdatemanager06
Click Install.

adoberemoteupdatemanager07
Authenticate and then click Install Software.

adoberemoteupdatemanager08
Click Close.

adoberemoteupdatemanager09
Now that it's installed, go ahead and launch up the Packages program.

For this situation (Adobe RUM), we're just going to select Raw Package and then click Next.

adoberemoteupdatemanager10
Name your project accordingly.

By default, the project will be a subdirectory of your /Users/username folder, so you may want to pick a different directory. If you're fine with the default, just go with it.

adoberemoteupdatemanager11
In Settings you can change the Identifier to represent your actual company/school/organization instead.

adoberemoteupdatemanager12
Click on Payload and then select LaunchDaemons (under Library) and the plus sign below it to add to that folder (sorry—I accidentally cropped the plus sign out of this screenshot).

Then go find the RemoteUpdateManager binary you downloaded from Adobe earlier.

adoberemoteupdatemanager13
Click Add.

adoberemoteupdatemanager14
The default permissions should be fine here (644 or -rw-r--r--).

adoberemoteupdatemanager15
Click on Scripts (under /Library) and the plus sign below.

Then select your local.rum.plist file you created earlier.

adoberemoteupdatemanager16
Click Add.

adoberemoteupdatemanager17
These permissions should be fine. It just means any user will be able to run RemoteUpdateManager, which is fine. Only the script will probably run it, but there's no harm in the users being able to invoke it manually, too, if they want.

adoberemoteupdatemanager18
Go ahead and save the project.

adoberemoteupdatemanager19
Then click Build and select Build.

adoberemoteupdatemanager20
The project should build successfully (and fairly quickly).

adoberemoteupdatemanager21
Then you'll see your installer file in the directory you should earlier, under the subdirectory build. If you're using Munki to distribute, then you can do a munkiimport directly on this .pkg file.

Installing MunkiReport

What is MunkiReport

MunkiReport is a web-based reporting interface for Munki clients. It's cool to deploy a bunch of Munki clients, but it'd be nice to know how many are out there, and any errors or pending installs there may be on those clients.

If you haven't set up your Munki server yet, do that first!

Assumptions (for simplicity's sake)

There are many different possible scenarios for installing MunkiReport, but for simplicity's sake, we're going to make some assumptions. If you're really advanced, you can obviously adapt these instructions for your particular case. If not, follow as is.

  • You are using a Mac computer as a server.
  • You installed munki_repo to a subdirectory of the server directory.
  • You are going to install MunkiReport to the root directory of your web server.
  • You are going to do all of these instructions from your web server (and not from a client computer).

Making sure the web server is PHP-ready

Apparently, Mac OS X by default does not interpret PHP correctly when you launch up the Apache service. So let's make sure that's good first.

In the Terminal.app, edit the appropriate file using nano (or your editor of choice)

sudo nano -B /etc/apache2/httpd.conf
If you see a line that looks like this:
#LoadModule php5_module libexec/apache2/libphp5.so
change it to look like this instead
LoadModule php5_module libexec/apache2/libphp5.so
Then save out (if you're using nano, Control-X we save).

Then restart apache

sudo apachectl restart

A) Downloading MunkiReport with Git

If you have Git installed, you can do a git clone on MunkiReport.

cd ~/Downloads
git clone https://github.com/munkireport/munkireport-php.git munkireport-php-master

B) Downloading MunkiReport with a web browser

Using a web browser on the web server itself, go to the MunkiReport GitHub repository and click the Download ZIP button to download the latest version. When you get the .zip file, you may have to double-click it to unzip it. Once it's unzipped, you should have a folder with all the necessary files in it.

Installing MunkiReport

Copy the contents of the folder (not the folder itself) to your web server's root directory. Make sure the file ownership/permissions match that of the other files or folders in there (e.g., whatever index.html file says It works! when you first got your web server up and running.

If you no idea, then make it all 755 permissions with ownership of root:_www.

Here's an example to paste into the Terminal.app:

sudo chown -R root:_www ~/Downloads/munkireport-php-master/*
sudo chmod -R 775 ~/Downloads/munkireport-php-master/*
sudo mkdir -p /Library/WebServer/Documents/munkireport
sudo mv ~/Downloads/munkireport-php-master/* /Library/WebServer/Documents/munkireport/
sudo cp /Library/WebServer/Documents/munkireport/config_default.php /Library/WebServer/Documents/munkireport/config.php
The last command just makes a copy of the default config to a new custom config file. You will need both (I thought, at first, that I could ditch the default config file, but then I got an error when I loaded up the page in a browser).

Note: If you're using OS X Server, the path is typically /Library/Server/Web/Data/Sites/Default and not /Library/WebServer/Documents

munkireport01
If all went well, you should be able to go to http://localhost/munkireport and enter a first username and password. This doesn't actually create a user. All it does is create a hash.

munkireport02
Once you have the password hash created, highlight the results and then paste them in at the end of the config.php file on the web server. If you ever need to generate another hash again, go to http://localhost/index.php?/auth/generate and enter in more credentials.

When you do log in, you should see... nothing. No clients.

To create a client, paste these commands into the Terminal.app

bash -c "$(curl http://nameofyourdomain/munkireport/index.php?/install)" bash -i ~/Desktop
/usr/local/munki/munkiimport ~/Desktop/munkireport-2.11.0.pkg
Replace nameofyourdomain with your actual domain name or the server's IP address.

Note: if you're using https with a self-signed certificate, you may want to run

bash -c "$(curl -k https://nameofyourdomain/munkireport/index.php?/install)" bash -i ~/Desktop
instead of the first command.

Note: the version number may change, so after you type ~/Desktop/munkireport-, just hit Tab to autocomplete, instead of typing in the number (it's faster to autocomplete anyway).

Once you have that package imported, and have rebuilt your Munki catalogs when prompted, go ahead and them to the appropriate manifests so they can be pushed out to your existing clients.

If you are well-versed in MySQL and prefer that to MunkiReport's default sqlite database, read Using MySQL with MunkiReport for some implementation tips.

À la carte Adobe CS6 Master Collection using Munki

Caveats

This tutorial assumes you know some Munki basics already. If you don't, check out Absolute beginner’s guide to setting up Munki (not monkey) first.

I'm still in the early stages of figuring out different ways to package Adobe CS6 Master Collection (assuming a site license here) using Munki. It isn't seamless, but it generally works. Two little issues I've found so far are Adobe After Effects not working in Yosemite until you install the updates (so you'll have to create an update package for it), and Adobe Illustrator not uninstalling when you mark it for removal (it appears to go through the uninstall procedure, but then Adobe Illustrator is still there and fully usable). I haven't had luck creating individual update packages, but if you use Adobe Remote Update Manager, it will install all the updates for all Adobe CS6 applications (so actually less work than creating update packages).

The Illustrator situation is a bit weird. I'll explain more about it below.

Problem?

If your organization has the Adobe Creative Suite Master Collection, it is a whole bunch of software, most of which your users won't need or even want. You can package the entire Master Collection as one package (which is more than 8 GB for your users to download—a lot, even on a fast connection). But what if you could allow your users à la carte installations of the programs they need (e.g., just Adobe Acrobat Pro or just Photoshop, Illustrator, and InDesign)?

Requirements before you begin

  1. A Munki server, of course, which you've already set up.
  2. A site license for Adobe CS6 Master Collection (this tutorial may work with CS5 with some tweaks; for example, you may have to use an older version of AAMEE).
  3. At least one Munki client, of course, too. Preferably three or more.
  4. The Adobe Application Manager Enterprise Edition 3.1, which you can get from the Adobe website.

The actual procedure

munkicreativesuite01
First, go get the AAMEE from Adobe's website.

3.1 is the one you'll want for Adobe Creative Suite 6.

munkicreativesuite02
While that's downloading, get your Master Collection install CD or .dmg ready to go. Once it's there, go ahead and close the window, but don't eject the disk or disk image.

munkicreativesuite03
Once Adobe Application Manager Enterprise Edition is downloaded and installed, go ahead and launch it up.

Random fact: if you try to keep AAMEE in the Dock and then launch the application again from the Dock instead of from the /Applications folder, the application may (i.e., probably will) crash.

munkicreativesuite04
For this first go-round, you want to create an Installation Package.

munkicreativesuite05
The Product Installation Folder is where the install.app is for your Adobe Creative Suite disk image that's mounted (see the next picture for more details).

The Package Name is whatever description you think makes sense.

For my own sanity, I created separate folders for each program for the Save To option. You're welcome to dump them all in one folder, as long as you can keep track.

munkicreativesuite06
Here you can see for Product Installation Folder where you should focus for the mounted disk image or disk.

munkicreativesuite07
When prompted, enter your organization's serial number, and then click Next.

munkicreativesuite08
Sign in with your Adobe ID.

munkicreativesuite09
Select the program you want to install.

munkicreativesuite10
These defaults are all right.

munkicreativesuite11
The installer will check for updates.

munkicreativesuite12
Uncheck all updates.

The official Munki documentation for CS6 says Do not repackage CS6 updates using AAMEE. Simply use munkiimport to import the diskimage as downloaded from Adobe. It doesn't give a reason, but I found my own reason. When I tried to package updates for one piece of the Adobe Creative Suite, it brought in a whole ton of other pieces that I didn't want.

Note: You can find the downloadable updates for later munkiimport on the Product updates page at Adobe.

Unfortunately, when I tried to package updates directly from Adobe, I got errors like this:

Installing Adobe Photoshop CS6 Update 13.0.1 (4 of 6)...
Mounting disk image Photoshop_CS6_13_0_1_upd-13.0.1.dmg...
Running Adobe Patch Installer...
ERROR: Error : Unable to complete Silent workflow.
ERROR: Adobe Setup error: 7: Unable to complete the silent workflow
It seems a terrible workaround, but apparently you're supposed to use a Adobe's Remote Update Manager instead. Update: The Adobe Remote Update Manager works great. It's just a simple binary file you can schedule (using Launch Daemons, not Munki) to run in the background.

munkicreativesuite13
Wait for the build.

munkicreativesuite14
If you're building only one package, click Close. If you're planning to do a whole bunch of packages, leave this open to click New Package on later.

munkicreativesuite15
Your mileage may vary, but I haven't had good luck using MunkiAdmin to import packages made with AAMEE (it seems to work fine for other software packages, though).

So I would recommend using munkiimport instead.

Most of the answers to the questions should be obvious, but the version number will automatically fill in a 6 for everything. Even though we're install software from Adobe Creative Suite 6, not all of the software we're installing is version 6.

I've done the legwork for you here a bit and put in the initial versions for CS6

  • Adobe Acrobat X Pro 10.1.1
  • Adobe After Effects CS6 11.0.0
  • Adobe Audition CS6 5.0x708
  • Adobe Dreamweaver CS6 12.0.0.5808
  • Adobe Encore CS6 6.0.0
  • Adobe Fireworks CS6 12.0.0.236
  • Adobe Flash Builder 4.6
  • Adobe Flash CS6 12.0.0.481
  • Adobe Illustrator CS6 16.0.0
  • Adobe InDesign CS6 8.0.0.370
  • Adobe Photoshop CS6 13.0.0
  • Adobe Prelude CS6 1.0.0
  • Adobe Premiere Pro CS6 6.0.0
  • Adobe SpeedGrade CS6 2012.7766.34

I also didn't have any luck getting Munki to recognize any icons from the AAMEE-generated files, so if you want an icon, you may have to figure that out later.

munkicreativesuite16
When the package info for the piece you're preparing comes up, scroll down to the installs key. According to HowMunkiDecidesWhatNeedsToBeInstalled, Munki tells whether a piece of software is installed by whether certain files or other things are present in this part of the package info file.

Note: Going by the visible path to the file will work for most of the packages. Illustrator was a bit weird, and I had to run

makepkginfo -f /Applications/Adobe\ Illustrator\ CS6/Adobe\ Illustrator.app
to find out that the real path (when running that command above, use tab completion—don't fully type out the path) is /Applications/Adobe Illustrator CS6/Adobe Illustrator.app.

Special thanks to Tim Sutton and Greg Neagle for sleuthing this for me on the Munki dev mailing list.

Also important to note: the commands in the terminal will use escapes (backslashes) before spaces in names, but the path in the Munki info file will not use escapes before spaces in names.

Just leaving the default in there, you'll run into a problem of Munki thinking every piece of the Adobe Creative Suite is installed if only one piece is installed.

munkicreativesuite17
So we're going to modify it to add in a new path to the exact location of the launcher file. Even though it is a .app file, the string for type should be file and not application. I tried application, and it didn't work.

munkicreativesuite18
When you're asked to rebuild the catalogs, go ahead and say yes (y).

munkicreativesuite19
You should then be able to see the software in your client's Managed Software Center after a fresh check for updates.

Mounting an external drive when users are logged out in Mac OS X

Problem?

In older versions of Mac OS X, you could create a special .plist file that auto-mounts disks even when a user isn't logged in. You can see that (no longer working) procedure here. I don't know exactly when support for that ended, but some people have suggested around Mountain Lion. (If you try it in Yosemite, your Mac will get stuck in bootup at Waiting for DSMOS if you run it in verbose mode... or just half a progress bar if you're booting it up in normal mode.)

People still want this feature, though. Here's a recent thread of frustrated people not being able to do it:
10 *still* requires users to be logged in for backup to work.

Major Prerequisite

I'm assuming you already know how to create a script. If you don't, use method #2 in Deleting Mac Keychains in an Active Directory Environment as an example.

Find the UUID of your external drive

There is a universally unique identifier for your drive. Unfortunately, the normal diskutil list command won't show it to you. Instead, when you launch up the Terminal.app, you should run this command (make sure the drive is physically plugged in before you run the command):

diskutil list -plist
and that will show you your external drive's UUID.

Highlight and copy the UUID.

Mount the drive via UUID

To do a quick test of mounting the drive, run a command similar to this:

diskutil mountDisk yourreallylonguniversallyuniqueidentifierfordrive
Whether that drive was already mounted or not, it should (if the command worked) display a message that says Volume(s) mounted successfully.

A visual example

mountexternalwithoutlogin
Here you can see an example.

So fire up those launch daemons and go ahead and put that mount command into your script!

Getting started with pygame on a Mac

There are a lot of pygame tutorials out there, but I haven't yet found a simple, step-by-step how-to on how to just get pygame installed on a Mac, and then actually use it. So, hopefully, this will work for you. This example was done using Macs running OS X 10.10 (Yosemite). Your mileage may vary.

Installing pygame

Go to the pygame downloads page and scroll down to the Mac section.

Find the download titled Lion apple supplied python: pygame-1.9.2pre-py2.7-macosx10.7.mpkg.zip and download and install it.

It says Lion, but it will work with Yosemite.

Creating a short sample pygame

Just so you can see how it works basically (and then later on, you can create/tweak your own games), here's one you can start with.

Open up a text editor (e.g., a terminal editor like nano or a graphical one like TextWrangler—avoid TextEdit, unless you know the difference between plain text and rich text).

Paste into the text editor the following:

import sys, pygame
pygame.init()

size = width, height = 320, 240
speed = [2, 2]
black = 0, 0, 0

screen = pygame.display.set_mode(size)

ball = pygame.image.load("ball.gif")
ballrect = ball.get_rect()

while 1:
        for event in pygame.event.get():
                if event.type == pygame.QUIT: sys.exit()

        ballrect = ballrect.move(speed)
        if ballrect.left < 0 or ballrect.right > width:
                speed[0] = -speed[0]
        if ballrect.top < 0 or ballrect.bottom > height:
                speed[1] = -speed[1]

        screen.fill(black)
        screen.blit(ball, ballrect)
        pygame.display.flip()
Save it to your desktop as pygametest.py

Then, save this beach ball image file to your desktop as well.

In Terminal.app (which you can find in /Applications/Utilities or using Spotlight), paste in this command:

cd ~/Desktop
This will change focus to your desktop directory (that's where you saved your Python script and your beach ball image).

Paste this command in next to run your script:

python pygametest.py

pygamebasics
If it worked, you should see a beach ball bouncing around a black background.

Credit where credit's due

I didn't make up this tutorial out of thin air. This is a synthesis of a couple of online resources I found.

Movie projects disappear after iMovie upgrade

When you upgrade to the new iMovie, there's a quick prompt to update your old iMovie projects, but if you dismissed that and don't know how to go back and update again...

updateprojectsandeventsimovie
Go to File > Update Projects and Events...

More info at Apple:
Update projects and events from previous versions of iMovie in iMovie (2014)