tag:blogger.com,1999:blog-107725912024-03-08T10:58:46.142-08:00Have GNU, Will Travel.Photography, OS X & Linux info.jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.comBlogger116125tag:blogger.com,1999:blog-10772591.post-15570446504643456372012-09-03T18:16:00.000-07:002012-09-03T18:44:39.525-07:00Automate manifest distribution to masterless puppet clients from an S3 bucketAt Ooyala, I managed our Macintosh fleet with puppet. The problem we ran into is that we have users in remote locations rarely need to connect to the VPN, and when their machines aren't on the VPN or corp network, they can't connect to the puppetmaster and don't receive any updates. This made me switch to masterless puppet for our Macs so that they could pull their manifests (and other files) from S3, so the remote users could get updates when they weren't working from one of our offices and weren't on the corporate network or VPN.<br />
<br />
When I was looking for examples of how to implement masterless, I didn't find tools for automating distribution of manifests to the nodes, so I wrote Miyamoto. I got Ooyala to allow me to open-source it before I left, and the source is at <a href="https://github.com/unixorn/miyamoto">https://github.com/unixorn/miyamoto</a><br />
<div>
<br /></div>
<div>
Miyamoto automates creating debs or OSX pkgs that contain all your manifest files and then publishing them to an S3 bucket so your client nodes can download and install them.<br />
<div>
<br style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: arial; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" />
<span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; display: inline !important; float: none; font-family: arial; font-size: x-small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">Here are a few caveats:</span><br />
<ul style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: arial; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<li>You lose the benefits of running a puppetmaster. No reporting, no dashboard, etc. While Miyamoto does write a json status file into the status subdirectory of your S3 bucket, you'll have to write something to scrape those files and convert them into something useful.</li>
<li>I ripped out all the company-specific stuff in a two day period between documenting things for my replacement and doing some other last minute tasks. I'm pretty sure everything still works, but if you run into issues, let me know and I'll try to help.</li>
<li>Currently Miyamoto only works with OS X and Debian based linux distributions. Redhat support should be trivial, but I didn't have time to work on that since Ooyala is an Ubuntu shop.</li>
<li>Miyamoto assumes you're using a single git repository for your manifests, and that there are specific branch names you're consistently using for stable & testing. If you're not a git user or are using multiple repos, or don't use the same branch names when you release a new stable environment, you'll need to tweak the Rakefiles.</li>
<li>Miyamoto also assumes you're willing to have a single set of AWS credentials that your nodes will use to download new manifests from a read only tree and write their statuses back to a specific directory in S3.</li>
</ul>
</div>
</div>
<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-5572862143959995652012-01-22T21:21:00.000-08:002012-01-22T21:21:58.026-08:00Creative Suite 5.5 refuses to accept a serial number to end trial modeMy wife recently upgraded to a MacBook Air, and when I went to install CS 5.5 on the MBA it accepted the serial number during installation but then would bring up the Adobe Application Manager screen when you started any CS application asking to either run in trial mode, or enter a serial number. And it wouldn't take the serial number that it had just accepted during installation. Yay!<br />
<br />
So to spare anyone else the multiple chat sessions with Adobe support, with multiple escalations per session, here's how to fix it.<br />
<br />
<ol>
<li>Quit all your CS applications</li>
<li><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;">Open a terminal window.</span></li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">sudo -s</span></li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cd '/Library/Application Support/Adobe/Adobe PCD'</span><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;">. You'll see a cache directory in there. Don't delete it like the tech support guy tells you to (Out of paranoia, I renamed mine instead), that'll trigger a message when you try to start a CS app telling you to reinstall CS.</span></li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cd cache</span><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"> - you'll find a file named cache.db rename it to cache_broken.db.</span></li>
<li><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;">Open one of your CS applications. It'll ask you for the serial and this time, it'll accept it.</span></li>
</ol>
<br />
<br /><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-7945606220198145752011-12-21T22:26:00.000-08:002011-12-21T22:27:03.496-08:00Weird Lion audio issue with headphonesMy wife was having a weird audio problem on 10.7.2 - she'd be listening to iTunes, plug in her headphones, then get silence. Restarting iTunes would make the audio work on the headphones, but then if you unplug the headphones, silence until restarting it again. Same symptoms with watching YouTube videos in Safari.<br />
<br />
Poked around a bit, finally found a corrupt preference file - <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">com.apple.BezelServices.plist</span> - deleted it, logged out and back in, and sound is working right again.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-16244331045221203832011-09-07T13:01:00.000-07:002011-09-07T15:46:07.490-07:00Automate removing Diginotar CA certificateEd Marczak posted how to delete the untrustworthy Diginotar CA cert on his <a href="http://radiotope.com/content/remove-certificate">blog</a>. Read about why you want to trash it at <a href="http://www.computerweekly.com/Articles/2011/08/30/247730/Microsoft-warns-of-fraudulent-digital-certificate-issued-by.htm">ComputerWeekly.com</a>.<br />
<br />
To make it easier for you to do the right thing and delete it on the machines you manage, here's a quick how to on automating it.<br />
<br />
If you're using puppet to manage your Macs, just add this exec to one of your manifests.<br />
<code></code><br />
<br />
<code> exec { "Eliminate untrustworthy DigiNotar CA.":</code><br />
<code> command => "/usr/bin/security delete-certificate -Z C060ED44CBD881BD0EF86C0BA287DDCF8167478C /System/Library/Keychains/SystemRootCertificates.keychain",</code><br />
<code> onlyif => "/usr/bin/security find-certificate -c Diginotar /System/Library/Keychains/SystemRootCertificates.keychain",</code><br />
<code> }</code><br />
<div>
</div>
<div>
<br /></div>
<div>
If you're using another system management tool, here's how to make a package with the luggage that will delete the Diginotar cert when you install the pkg.</div>
<div>
<br /></div>
<div>
Download the luggage from <a href="https://github.com/unixorn/luggage">github</a>.</div>
<div>
<br /></div>
<div>
Create a Makefile with the following contents:</div>
<div>
<br /></div>
<div>
<code></code></div>
<div>
<div>
<code>#</code></div>
<div>
<code># Copyright 2011 Joe Block <jpb@apesseekingknowledge.net></jpb@apesseekingknowledge.net></code></div>
<div>
<code>#</code></div>
<div>
<code># Licensed under the Apache License, Version 2.0 (the "License");</code></div>
<div>
<code># you may not use this file except in compliance with the License.</code></div>
<div>
<code># You may obtain a copy of the License at</code></div>
<div>
<code>#</code></div>
<div>
<code># http://www.apache.org/licenses/LICENSE-2.0</code></div>
<div>
<code>#</code></div>
<div>
<code># Unless required by applicable law or agreed to in writing, software</code></div>
<div>
<code># distributed under the License is distributed on an "AS IS" BASIS,</code></div>
<div>
<code># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</code></div>
<div>
<code># See the License for the specific language governing permissions and</code></div>
<div>
<code># limitations under the License.</code></div>
<div>
<code>#</code></div>
<div>
<code><br /></code></div>
<div>
<code>include /usr/local/share/luggage/luggage.make</code></div>
<div>
<code><br /></code></div>
<div>
<code>TITLE=nuke_diginotar_certificate</code></div>
<div>
<code>REVERSE_DOMAIN=net.unixorn</code></div>
<div>
<code>PAYLOAD=pack-script-postflight</code></div>
</div>
<div>
</div>
<div>
<br /></div>
<div>
Create a postflight script with the following contents:</div>
<div>
<br /></div>
<div>
<code></code></div>
<div>
<div>
<code>#!/bin/bash</code></div>
<div>
<code>#</code></div>
<div>
<code># Trash untrustworthy Diginotar root ca cert.</code></div>
<div>
<code>#</code></div>
<div>
<code># See http://www.computerweekly.com/Articles/2011/08/30/247730/Microsoft-warns-of-fraudulent-digital-certificate-issued-by.htm</code></div>
<div>
<code>#</code></div>
<div>
<code># and</code></div>
<div>
<code>#</code></div>
<div>
<code># http://radiotope.com/content/remove-certificate</code></div>
<div>
<code>#</code></div>
<div>
<code># for why.</code></div>
<div>
<code><br /></code></div>
<div>
<code>/usr/bin/security find-certificate -c Diginotar /System/Library/Keychains/SystemRootCertificates.keychain</code></div>
<div>
<code>if [ $? -eq 0 ];then</code></div>
<div>
<code><span class="Apple-tab-span" style="white-space: pre;"> </span>logger "Deleting Diginotar root cert from SystemRootCertificates.keychain"</code></div>
<div>
<code><span class="Apple-tab-span" style="white-space: pre;"> </span>/usr/bin/security delete-certificate -Z C060ED44CBD881BD0EF86C0BA287DDCF8167478C /System/Library/Keychains/SystemRootCertificates.keychain</code></div>
<div>
<code>fi</code></div>
</div>
<div>
</div>
<div>
<br /></div>
<div>
The Makefile and postflight can be downloaded from the <a href="https://github.com/unixorn/luggage-examples/tree/master/diginotar">luggage-examples repo</a> on github.</div>
<div>
<br /></div>
<div>
Drop the Makefile and postflight script into a new directory and <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">sudo make pkg</span>.<br />
<br />
Now you have a pkg you can push with whatever system management software you're using for your Macintoshes.<br />
<br />
Edit for clarity: This only deletes the Diginotar CA cert from the System keychain. It doesn't update Firefox/Opera/Chrome's caches, you'll need to update them separately.</div>
<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-91663485168370300902010-05-11T14:27:00.000-07:002010-05-11T14:27:49.256-07:00Easy Script-Only Packages with the LuggageSaw a post today on MacEnterprise from someone looking for an easy way of making a package that doesn't install any files, just runs a script during installation. Payloadless packages are quite easy to create with the Luggage - here's how:<br />
<br />
1) Make a new directory. cd into it.<br />
2) Write your script, call it postinstall.<br />
3) Make a new file named Makefile with the following contents:<br />
<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">include /usr/local/share/luggage/luggage.make</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">TITLE=name_of_your_package_with_no_spaces_or_punctuation</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">REVERSE_DOMAIN=com.example.corp</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PAYLOAD=pack-script-postinstall</span><br />
<div><br />
</div><div>4) make dmg.</div><div><br />
</div><div>make dmg will create a dmg file named TITLE-YYYYMMDD.dmg containing the package TITLE-YYYYMMDD.pkg.</div><div><br />
</div><div><br />
</div><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com1tag:blogger.com,1999:blog-10772591.post-78019426289771720722010-02-14T15:52:00.000-08:002010-02-14T15:56:24.035-08:00Read knob files with facter for puppetI found myself recently writing yet another fact to read the contents of a knob file, so I generalized one to read all the files found in /etc/knobs and return the contents as facts named after the files found.<br />
<br />
Caveats: read_knobs.rb returns only the last line it finds in the file. This is on purpose. It also skips all lines beginning with # so you can use shell-style comments. Files that are empty create facts with the value true, and files containing just a t or f are normalized to true or false respectively.<br />
<br />
Here's the source, and it's also available on <a href="http://github.com/unixorn/osxtoolkit/blob/master/puppet/facts/read_knobs.rb">github</a>.<br />
<br />
<span class="Apple-style-span" style="font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 11px; line-height: 14px;"></span><br />
<pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; font: normal normal normal 115%/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="line" id="LC1" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#!/usr/bin/ruby</span></div><div class="line" id="LC2" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#</span></div><div class="line" id="LC3" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># fact returns knob values based on contents of /etc/knobs.</span></div><div class="line" id="LC4" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#</span></div><div class="line" id="LC5" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># Author: jpb@ooyala.com</span></div><div class="line" id="LC6" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#</span></div><div class="line" id="LC7" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># Copyright 2009 Ooyala, Inc.</span></div><div class="line" id="LC8" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#</span></div><div class="line" id="LC9" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># Licensed under the Apache License, Version 2.0 (the "License");</span></div><div class="line" id="LC10" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># you may not use this file except in compliance with the License.</span></div><div class="line" id="LC11" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># You may obtain a copy of the License at</span></div><div class="line" id="LC12" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#</span></div><div class="line" id="LC13" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line" id="LC14" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#</span></div><div class="line" id="LC15" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># Unless required by applicable law or agreed to in writing, software</span></div><div class="line" id="LC16" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># distributed under the License is distributed on an "AS IS" BASIS,</span></div><div class="line" id="LC17" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line" id="LC18" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># See the License for the specific language governing permissions and</span></div><div class="line" id="LC19" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># limitations under the License.</span></div><div class="line" id="LC20" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#</span></div><div class="line" id="LC21" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"></div><div class="line" id="LC22" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">require</span> <span class="s1" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">'facter'</span></div><div class="line" id="LC23" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"></div><div class="line" id="LC24" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">def</span> <span class="nf" style="color: #990000; font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">logger</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">message</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC25" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">system</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"/usr/bin/logger -t read_knobs </span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#{</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">message</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">}</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC26" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC27" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"></div><div class="line" id="LC28" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># facts can only have one value. We ignore lines with shell style comments,</span></div><div class="line" id="LC29" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># and return the last valid line.</span></div><div class="line" id="LC30" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"></div><div class="line" id="LC31" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">def</span> <span class="nf" style="color: #990000; font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">read_knob</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">filename</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC32" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_name</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">filename</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">split</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="s1" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">'/'</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">[-</span><span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">1</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">]</span></div><div class="line" id="LC33" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_file</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="no" style="color: teal; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">File</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">open</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">filename</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC34" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># an empty knob file must have been created for a reason, so set default</span></div><div class="line" id="LC35" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="c1" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"># value to true</span></div><div class="line" id="LC36" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">value</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="kp" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">true</span></div><div class="line" id="LC37" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_file</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">each</span> <span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">{</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">|</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">line</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">|</span></div><div class="line" id="LC38" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">if</span> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">line</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">[</span><span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">0</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">,</span><span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">1</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">]</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">!=</span> <span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"#"</span></div><div class="line" id="LC39" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">if</span> <span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">line</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">downcase</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">chomp</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">==</span> <span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"true"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span> <span class="ow" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">or</span> <span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">line</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">downcase</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">chomp</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">==</span> <span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"t"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC40" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">value</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="kp" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">true</span></div><div class="line" id="LC41" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">elsif</span> <span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">line</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">downcase</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">chomp</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">==</span> <span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"false"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span> <span class="ow" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">or</span> <span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">line</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">downcase</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">chomp</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">==</span> <span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"f"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC42" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">value</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="kp" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">false</span></div><div class="line" id="LC43" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">else</span></div><div class="line" id="LC44" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">value</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">line</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">chomp</span></div><div class="line" id="LC45" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC46" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC47" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">}</span></div><div class="line" id="LC48" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_file</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">close</span></div><div class="line" id="LC49" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">value</span></div><div class="line" id="LC50" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC51" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"></div><div class="line" id="LC52" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">def</span> <span class="nf" style="color: #990000; font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">load_knobs</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_d</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC53" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">logger</span> <span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"Processing </span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#{</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_d</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">}</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">..."</span></div><div class="line" id="LC54" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">if</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">!</span> <span class="no" style="color: teal; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">File</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">directory?</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_d</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC55" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">logger</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"Can't read </span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#{</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_d</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">}</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">!"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC56" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">return</span> <span class="kp" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">nil</span></div><div class="line" id="LC57" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC58" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="no" style="color: teal; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Dir</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">[</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#{</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_d</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">}</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">/*"</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">].</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">each</span> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">do</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">|</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">|</span></div><div class="line" id="LC59" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">if</span> <span class="no" style="color: teal; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">File</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">readable?</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC60" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_name</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">split</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="s1" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">'/'</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">[-</span><span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">1</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">]</span></div><div class="line" id="LC61" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="no" style="color: teal; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Facter</span><span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">.</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">add</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#{</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob_name</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">}</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">do</span></div><div class="line" id="LC62" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">setcode</span> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">do</span></div><div class="line" id="LC63" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">data</span> <span class="o" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=</span> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">read_knob</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC64" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">data</span></div><div class="line" id="LC65" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC66" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC67" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">else</span></div><div class="line" id="LC68" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">logger</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"Can't read </span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">#{</span><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">knob</span><span class="si" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">}</span><span class="s2" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">!"</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div><div class="line" id="LC69" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC70" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"> <span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC71" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">end</span></div><div class="line" id="LC72" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"></div><div class="line" id="LC73" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">load_knobs</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">(</span><span class="s1" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">'/etc/knobs'</span><span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">)</span></div></pre><br />
<div><span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"><span class="Apple-style-span" style="font-size: 11px;"><br />
</span></span></div><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-36823494084364007862010-02-02T18:41:00.000-08:002010-02-02T20:05:41.230-08:00Releasing some of my OS X administrative utility scripts<div>I decided to release some code I've been using at work to manage our Macintoshes.</div><div><br /></div><div>All the code is downloadable at <a href="http://github.com/unixorn/osxtoolkit">http://github.com/unixorn/osxtoolkit</a></div><div><br /></div>Currently osxtoolkit includes:<br /><ol><br /><li>A puppet fact script to load the contents of files in /etc/knobs as facts named after the file name.</li><br /><li>scripts to use as login & logout hooks that run /etc/hooks/LI* on login, and /etc/hooks/LO* on logout. It uses iHook so the users can see progress.</li><br /></ol><br /><br /><h1>Usage:</h1><br /><h2>read_hook.rb</h2><br />Copy to the lib/facter directory in one of your modules.<br /><br /><h2>enable_login_scripts</h2><br /><div><div>The hook drivers only load scripts that are in /etc/hooks, have their x bit set, and have either an LI or LO prefix in their name. They're run in alphabetic order. LI* hooks are run on login, and LO* hooks are run on logout. You'll probably want to replace hook_background.jpg with something</div><div>appropriate for your local environment.</div><br /><h3>Prerequisites:</h3><br /><h4>iHook</h4><div>You need to download a copy of iHook from</div><div><br /></div><div>http://rsug.itd.umich.edu/software/ihook/</div><div><br /></div><div>since the hook driver scripts rely on it to present a pretty dialog with a progress bar during login & logout as they run the appropriate hook scripts.</div><div><br /></div><br /><br /><div>Tar iHook.app up, then bzip2 the tarball. I recommend keeping the tarball (with version number in the name) on a central server, then letting make download it and rename it to iHook.app.tar.bz2 as part of the package build process. This will let you reproduce specific versions of the package later.</div><br /><br /><h4>Luggage: http://http://github.com/unixorn/luggage</h4><br />Luggage isn't necessary to run the hook loaders, just to make deploying them to your Macintoshes easier. You need to update TARBALL_LOCATION in the included Luggage Makefile to point to where you're storing your iHook tarball, then you can make a dmg with a pkg file containing everything necessary for the hook script suite with 'make dmg'. That dmg can then be easily deployed with InstaDMG or puppet.</div><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-53151765175876926522010-01-21T00:08:00.000-08:002010-01-21T07:53:26.485-08:00Luggage 1.0rc2 releasedSynced my latest changes to the <a href="http://github.com/unixorn/luggage">Luggage</a>. Detailed documentation <a href="http://luggage.apesseekingknowledge.net/">here</a>.<br /><br />1.0rc2 includes<br /><ul><li>Fixed broken unarchive step in unbz2-applications & ungz-applications rules</li><li>Added recipe to install Ruby scripts to site-ruby</li><li>Added recipe to install Python scripts to site-python</li><li>Added more interesting example package - enable_login_hooks.</li></ul>The enable_login_hooks example package also includes code to run all login hooks found in /etc/hooks on login, and logout hooks at logout.<br /><br />Enjoy.<br /><br /><div>(Updated to add link to github repo, documentation)</div><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-81172753552217059062009-10-25T11:55:00.000-07:002009-10-25T11:55:06.625-07:00Losing ZFSLuis Gerbarg has an interesting article with his thoughts about the reasons behind the absence of ZFS in 10.6 on his blog at <a href="http://devwhy.blogspot.com/2009/10/loss-of-zfs.html">http://devwhy.blogspot.com/2009/10/loss-of-zfs.html</a>.<br />
<br />
Here's hoping that he's right and Apple is already working on their own next generation filesystem - HFS+ is getting a bit long in the tooth, and it'd be nice to see an alternative in 10.7.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com2tag:blogger.com,1999:blog-10772591.post-34586512313419805312009-10-12T22:37:00.000-07:002009-10-12T22:37:47.749-07:00Released the LuggageI've been rewriting a tool I originally wrote when I was at Google that allows you to generate an OS X pkg file using a Makefile without using PackageMaker.app's gui at all. At Google we used the internal tool to create most of the packages we used to create disk images with InstaDMG or with puppet. After I left, I missed it, so I'm releasing my rewrite, the Luggage, with the Apache 2.0 license. The source is at <a href="http://github.com/unixorn/luggage">http://github.com/unixorn/luggage</a><br />
<br />
<span class="Apple-style-span" style="color: #5064ae; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 23px; letter-spacing: 2px; line-height: 19px;">What the Luggage provides</span><br />
<span class="Apple-style-span" style="color: #283769; font-family: Arial, sans-serif; font-size: 13px; line-height: 19px;"></span><br />
<div>Easy repackaging of GUI apps that don't come with Apple pkg installers, custom scripts and configuration files, payload-less packages that do settings changes on target machines in their postflight/postupdate scripts. These packages are easily used in InstaDMG to create master disk images for deployment, or system management systems like puppet to distribute new software to managed Macintoshes.</div><h2 style="color: #5064ae; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.8em; font-weight: normal; letter-spacing: 0.1em;"><a href="" name="TOC-How-it-works" style="color: #445aa9;"></a>How it works</h2><div>You create a Makefile describing where you want each file in the package to end up on the target machines. luggage.make includes rules that will generate a package root with appropriate permissions, copy the files into place, create a package version-stamped with the date, then wrap the package in a disk image file.</div><h2 style="color: #5064ae; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.8em; font-weight: normal; letter-spacing: 0.1em;"><a href="" name="TOC-So-how-do-I-use-it-" style="color: #445aa9;"></a>So how do I use it?</h2><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-Requirements-for-all-Makefiles" style="color: #445aa9;"></a>Requirements for all Makefiles</h3><div>Every package makefile must include luggage.make, specify a title for the package, a base reversed domain for creating the package id, and the payload listing which files we want installed by the package. Include luggage.make before your variable declarations so your declarations override the internal ones in luggage.make. Please note that TITLE must not include spaces - it's going to be used as part of the package id. Also remember to include luggage.make before any of your definitions so your definitions override the defaults.</div><div><br />
</div><div><span style="font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 11px; line-height: 14px;"><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><code style="color: #006000;">include /usr/local/share/luggage/luggage.make</code></div><div style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><code style="color: #006000;"> </code></div><div style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><code style="color: #006000;">TITLE=install_foo</code></div><div style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><code style="color: #006000;">REVERSE_DOMAIN=com.example.corp</code></div><div style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><code style="color: #006000;">PAYLOAD=</code></div></pre></span></div><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-Creating-a-package-for-a-GUI-Applic" style="color: #445aa9;"></a>Creating a package for a GUI Application</h3><div>For our first example, we're going to repackage a GUI application that didn't come with a PKG installer. First, tar up the application (making sure to use Apple's tar so resource forks don't get mangled) with<code style="color: #006000;"> /usr/bin/tar cvj Foo.app.tar.bz Foo.app</code>, then update PAYLOAD with<br />
</div><div><span style="font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 11px; line-height: 14px;"><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><span style="color: #006000; font-family: monospace, Courier, monospace;">
</span></div><div style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"><code style="color: #006000;">PAYLOAD=unbz2-applications-foo.app</code></div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;"><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;">
</span></span></pre>This tells luggage.make that we want Foo.app.tar.bz2 untarred into /Applications. If we want it installed in /Applications/Utilities instead, we'd use<code style="color: #006000;">unbz2-utilities-foo.app</code> instead, Now we can create a package with "<code style="color: #006000;">make pkg</code>", or have it automatically wrapped in a disk image with "<code style="color: #006000;">make dmg</code>". That's all it takes.</span></span></pre><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-Packaging-scripts-and-configuration" style="color: #445aa9;"></a>Packaging scripts and configuration files</h3></span></span></span></div><div><span style="font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 11px; line-height: 14px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;">Similarly, if you want to install bar as /usr/local/bin/bar, add pack-usr-local-bin-bar to PAYLOAD. </span></span><br />
<span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-Available-PAYLOAD-additions" style="color: #445aa9;"></a>Available PAYLOAD additions</h3></span></span><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;"><table border="1" bordercolor="#888" cellspacing="0" style="border-bottom-color: rgb(136, 136, 136); border-bottom-width: 1px; border-collapse: collapse; border-left-color: rgb(136, 136, 136); border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-width: 1px; border-top-color: rgb(136, 136, 136); border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><tbody>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> <b>Rule</b></td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"><b> Ownership</b></td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"><b> Permissions</b></td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"><b> Destination</b></td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-etc-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 644</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /etc/foo</td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-usr-bin-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 755</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /usr/bin/foo</td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-usr-sbin-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 755</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /usr/sbin/foo</td></tr>
<tr><td style="height: 18px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-usr-local-bin-foo</td><td style="height: 18px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 18px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 755</td><td style="height: 18px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /usr/local/bin/foo</td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-usr-local-sbin-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 755</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /usr/local/sbin/foo</td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-hookscript-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 755</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /etc/hooks/foo</td></tr>
<tr><td style="height: 20px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-Library-LaunchAgents-foo</td><td style="height: 20px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 20px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 644</td><td style="height: 20px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /Library/LaunchAgents/foo</td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-Library-LaunchDaemons-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 644</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /Library/LaunchDaemons/foo</td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-Library-Preferences-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:admin</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 644</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /Library/Preferences/foo</td></tr>
<tr><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-ppd-foo</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:admin</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 644</td><td style="height: 14px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /Library/Printers/PPDs/Contents/Resources/foo</td></tr>
<tr><td style="height: 29px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 256px;"> pack-user-template-plist-foo</td><td style="height: 29px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 88px;"> root:wheel</td><td style="height: 29px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 91px;"> 644</td><td style="height: 29px; padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top; width: 386px;"> /System/Library/User\ Template/English.lproj/Library/Preferences/foo</td></tr>
<tr><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> unbz2-applications-foo</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> root:admin</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> based on tarball contents</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> /Applications/Foo</td></tr>
<tr><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> ungz-applications-foo</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> root:admin</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> based on tarball contents</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> /Applications/Foo</td></tr>
<tr><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> unbz2-utilities-foo</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> root:admin</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> based on tarball contents</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> /Applications/Utilities/Foo</td></tr>
<tr><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> ungz-utilities-foo</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> root:admin</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> based on tarball contents</td><td style="padding-bottom: 1px; padding-left: 4px; padding-right: 4px; padding-top: 1px; vertical-align: top;"> /Applications/Utilities/Foo</td></tr>
</tbody></table></span></span></pre><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-Adding-preflight-postflight-postins" style="color: #445aa9;"></a><span style="font-family: verdana, sans-serif;">Adding preflight/postflight/postinstall/postupdate scripts</span></h3><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;">Name the script preflight, postflight, postinstall, or postupdate, then add pack-script-XX to PAYLOAD and it will automatically be added to the final package.</span></span></pre><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;"><span style="font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 11px; line-height: 14px;"><h2 style="color: #5064ae; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.8em; font-weight: normal; letter-spacing: 0.1em;"><a href="" name="TOC-Make-targets" style="color: #445aa9;"></a>Make targets</h2><div><ul><li style="list-style-position: outside; list-style-type: square;"><span style="font-family: Arial, Verdana, sans-serif; font-size: 13px; line-height: normal;">make dmg - create a package, then wrap it in a dmg. Result will be in the current directory.</span></li>
<li style="list-style-position: outside; list-style-type: square;"><span style="font-family: Arial, Verdana, sans-serif; font-size: 13px; line-height: normal;">make pkg - create a package and copy it into the current directory</span></li>
<li style="list-style-position: outside; list-style-type: square;"><span style="font-family: Arial, Verdana, sans-serif; font-size: 13px; line-height: normal;">make pkgls - create a package, then list the contents so you can confirm it's generating a package with a payload that matches what you're expecting.</span></li>
</ul></div></span></span></span></pre><h2 style="color: #5064ae; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.8em; font-weight: normal; letter-spacing: 0.1em;"><a href="" name="TOC-Customizing-your-packages" style="color: #445aa9;"></a><span style="font-family: verdana, sans-serif;">Customizing your packages</span></h2><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-How-do-I-add-a-file-to-my-package-t" style="color: #445aa9;"></a><span style="font-family: verdana, sans-serif;">How do I add a file to my package that is installed somewhere luggage.make doesn't cover?</span></h3><div><span style="font-size: 13px;"><span style="font-family: Arial, Verdana, sans-serif;"><span style="line-height: normal;">luggage.make defines several convenience targets that create various directory paths within the package root. You can use them to create the parent directory for your target location, then create your target location. Here's an example that creates /etc/cups so you can install a custom cupsd.conf</span></span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><br />
</span></span></div><div class="sites-codeblock sites-codesnippet-block" style="background-color: #efefef; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; display: block; line-height: 11px; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><code style="color: #006000;">l_cups: l_etc</code></span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><span><code style="color: #006000;"> @sudo mkdir ${WORK_D}/etc/cups</code></span><br />
</span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><span><code style="color: #006000;"> @sudo chown root:_lp ${WORK_D}/etc/cups</code></span><br />
</span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><span><code style="color: #006000;"> @sudo chmod 755 ${WORK_D}/etc/cups</code></span><br />
</span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><br />
</span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><code style="color: #006000;">pack-cupsd.conf: l_cups</code></span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><span><code style="color: #006000;"> @sudo ${CP} cupsd.conf ${WORK_D}/etc/cups</code></span><br />
</span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><span><code style="color: #006000;"> @sudo chown root:_lp ${WORK_D}/etc/cups/cupsd.conf</code></span><br />
</span></span></div><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><span><code style="color: #006000;"> @sudo chmod 644 ${WORK_D}/etc/cups/cupsd.conf</code></span><br />
</span></span></div></div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;"><br />
</span></span><div><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal;">Now all you need to do is add pack-cupsd.conf to your PAYLOAD variable, and make will create /etc/cups in your package root, change the permissions and ownership, then copy in your cupsd.conf.</span></span></div><h2 style="color: #5064ae; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.8em; font-weight: normal; letter-spacing: 0.1em;"><a href="" name="TOC-I-need-to-install-foo-with-permissi" style="color: #445aa9;"></a><span style="color: #777777; font-size: 18px; letter-spacing: normal; line-height: normal;">I need to install foo with permissions different from the defaults luggage.make uses. How do I change the ownership/permissions for files installed using luggage.make?</span></h2><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;">You could make your changes using a postflight script, but for convenience, luggage.make runs <code style="color: #006000;">make modify_packageroot</code> after it has created the package root and copied the install files there, but before it invokes packagemaker's command line tool to create the package.</span></span></pre><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;">
</span></span></pre><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;">If you add that target to your package's Makefile, it will override the dummy one in luggage.make and let you change the permissions of files in your package root. <code style="color: #006000;">${WORK_D}</code> contains the path to your package root. For example, if your package installed a modified cupsd.conf to /etc/cups, and you needed it to have a group of _lp, you would add the following to your package Makefile:</span></span></pre><div class="sites-codeblock sites-codesnippet-block" style="background-color: #efefef; border-bottom-color: rgb(211, 211, 211); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(211, 211, 211); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(211, 211, 211); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(211, 211, 211); border-top-style: solid; border-top-width: 1px; display: block; line-height: 11px; padding-bottom: 0.5em; padding-left: 1em; padding-right: 0px; padding-top: 0.5em;"><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;"><code style="color: #006000;">modify_packageroot:</code></span></span></pre><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;"><span><code style="color: #006000;"> @sudo chgrp _lp ${WORK_D}/etc/cups/cupsd.conf</code></span></span></span></pre></div><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-I-don-t-want-the-package-version-to" style="color: #445aa9;"></a><span style="font-family: verdana, sans-serif;">I don't want the package version to be based on the current date. How can I force it to something specific?</span></h3><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;">By default, luggage.make sets the version number to YYYYMMDD. If you prefer to set it to something specific, set PACKAGE_VERSION=something_numeric.</span></span></pre><h2 style="color: #5064ae; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.8em; font-weight: normal; letter-spacing: 0.1em;"><a href="" name="TOC-FAQ" style="color: #445aa9;"></a><span style="font-family: verdana, sans-serif;">FAQ</span></h2><h3 style="border-bottom-color: rgb(201, 208, 230); border-bottom-style: dotted; border-bottom-width: 1px; color: #777777; font-family: 'Trebuchet MS', arial, sans-serif; font-size: 1.4em; font-weight: normal;"><a href="" name="TOC-My-makefile-looks-ok-but-I-get-an-e" style="color: #445aa9;"></a><span style="font-family: verdana, sans-serif;">My makefile looks ok, but I get an error about a missing separator</span></h3><pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style="font-family: Arial, Verdana, sans-serif; font-size: small;"><span style="font-size: 13px; line-height: normal; white-space: normal;">You've probably indented your rules with spaces rather than a tab. Make requires the indentation be with tabs.</span></span></pre></span></div><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com2tag:blogger.com,1999:blog-10772591.post-11451375161157548462009-09-15T11:21:00.000-07:002009-09-15T11:23:07.598-07:00Lightroom 2.5 releasedLightroom 2.5 released <a href="http://www.adobe.com/downloads/updates">here</a>.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-25434582877703448112009-09-15T09:09:00.000-07:002009-09-15T09:09:20.624-07:00Ars Technica on Grand Central and LinuxArs Technica notes on integrating Apple's Grand Central into Linux are <a href="http://arstechnica.com/open-source/news/2009/09/apple-opens-gcd-challenges-impede-adoption-on-linux.ars">here</a>.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-84584883158438785922009-09-13T19:01:00.000-07:002009-09-13T19:02:26.737-07:00Known photoshop & lightroom issues with 10.6Adobe posted a tech note about 10.6 known issues <a href="http://kb2.adobe.com/cps/512/cpsid_51229.html">here</a>.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-46269551912684985322009-09-12T23:53:00.000-07:002009-09-13T11:19:26.521-07:00So this is what a 50mm f1.8 looks like inside...I would have been quite happy without finding out exactly what my 50mm f1.8 looks like inside.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="http://jpb.smugmug.com/gallery/9610354_emnrr#647424724_Bx7rU-A-LB" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="http://jpb.smugmug.com/photos/647424724_Bx7rU-S.jpg" width="200" /></a></div><br />I was going through airport security in San Jose on my way to visit family in Chicago and TSA had to hand check my bag because I had forgotten there was a leatherman in it. Once they spotted my "contraband", they insisted on unpacking the bag instead of letting me do it. The next day, I took the lens cap off to shoot a picture of my niece, and the whole front assembly fell off into my hand.<br /><br />I only started using a DSLR a few months ago, and on the recommendation of a coworker at Google, the 50mm f1.8 was the first lens I bought besides the kit lens that came with the XSi body.<br /><br />I loved this lens - nice and sharp, much faster than the kit lens, nice color, nice and light. I ended up using it far more than my other two lenses.<br /><br />Here's a shot I took of Xan McCurdy with it at the Cake concert at WWDC - <a href="http://jpb.smugmug.com/Music/Cake-at-WWDC-09/8825831_i2y27/1/#584703148_BmySc-A-LB"><img src="http://jpb.smugmug.com/photos/584703148_BmySc-S.jpg"></a><br /><br />Not bad for a $90 <a href="http://www.amazon.com/gp/product/B00007E7JU?ie=UTF8&tag=apesseekingkn-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=B00007E7JU">lens</a><img src="http://www.assoc-amazon.com/e/ir?t=apesseekingkn-20&l=as2&o=1&a=B00007E7JU" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />. That said, the reason it's so nice and light is that the innards are mostly plastic, and the front assembly that came off is held on by four tiny (3mm or so) plastic fingers, two of which appear to have sheared off on mine.<br /><br />Ended up deciding to replace it with the <a href="http://www.amazon.com/gp/product/B00009XVCZ?ie=UTF8&tag=apesseekingkn-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=B00009XVCZ">Canon EF 50mm f1.4,</a><img src="http://www.assoc-amazon.com/e/ir?t=apesseekingkn-20&l=as2&o=1&a=B00009XVCZ" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />which I'm impatiently waiting to arrive.<br /><br />More Cake shots:<br /><div style="background: #ffffff;-moz-border-radius: .6em;-webkit-border-radius: .6em;overflow:hidden;text-align: center;padding-top:13px;width:220px;height:220px;margin:0 auto;"><br /><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="200" height="200" id="vv12x"><br /><param name="movie" value="http://cdn.smugmug.com/swfs/badge/flashbadge.swf?mode=box&useLargeImages=true&BadgeHost=cdn.smugmug.com&gapImage=http%3A%2F%2Fphotos.smugmug.com%2Fimg%2Fbesocial%2Finvisible_filler.png&displayMode=full&width=200&height=200&gridSpacing=1&gridRows=3&gridColumns=4&background=%23ffffff&preloaderColor=%23FFFFFF&preloaderGlow=%23FFFFFF&gridDelay=2&slideshowDelay=4&order=norandom&forceSize=&autostart=true&autorepeat=true&aboutlink=&sharelink=&albums=http%3A%2F%2Fapi.smugmug.com%2Fhack%2Ffeed.mg%3FType%3Dgallery%26Data%3D8825831_i2y27%26format%3Drss200%26Sandboxed%3D1"><br /><param name="wmode" value="transparent"><br /><embed src="http://cdn.smugmug.com/swfs/badge/flashbadge.swf?mode=box&useLargeImages=true&BadgeHost=cdn.smugmug.com&gapImage=http%3A%2F%2Fphotos.smugmug.com%2Fimg%2Fbesocial%2Finvisible_filler.png&displayMode=full&width=200&height=200&gridSpacing=1&gridRows=3&gridColumns=4&background=%23ffffff&preloaderColor=%23FFFFFF&preloaderGlow=%23FFFFFF&gridDelay=2&slideshowDelay=4&order=norandom&forceSize=&autostart=true&autorepeat=true&aboutlink=&sharelink=&albums=http%3A%2F%2Fapi.smugmug.com%2Fhack%2Ffeed.mg%3FType%3Dgallery%26Data%3D8825831_i2y27%26format%3Drss200%26Sandboxed%3D1" width="200" height="200" wmode="transparent"><br /></embed><br /></object><br /></div><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-85170567776252141372009-09-01T10:43:00.000-07:002009-09-01T10:43:29.486-07:00Siracusa on Snow LeopardJohn has his as usual excellent technical overview of Snow Leopard on <a href="http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars">Ars Technica</a>.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-56276656905389156042009-03-13T20:06:00.004-07:002009-03-13T20:23:05.614-07:00New disk image testsI got permission to release the changes I've made at work to the run_image_tests.py disk image test framework that Nigel Kersten originally wrote (thanks Chris, for pushing them into svn for me) along with a bunch of example tests you can use. These are all the tests I use at work every time I make a new master disk image that are generic enough the be useful to others.<br /><br />I don't bother to manually test any images that don't pass all of the unit tests first.<br /><br />You can find them at the <a href="http://code.google.com/p/pymacadmin/source/browse/#svn/trunk/utilities/diskimage_unittesting">pymacadmin</a> project site at Google Code.<br /><br />All the unit tests descend from macdmgtest.DMGUnitTest. DMGUnitTest provides some handy utility functions that convert paths relative to / to the path relative to the mounted dmg you're testing.<br /><br />dmgtestutilities.py provides some more convenience functions - there are functions to lint plists and load plists using Foundation so plistlib doesn't crap out when you try to load a binary plist.<br /><br />Example tests:<br />applications_dir_test.py:<br /> Ensures all applications in /Applications and /Applications/Utilities have sane ownership/permissions.<br /><br />blacklist_test.py:<br /> Confirms the absence of files in your blacklist. I mainly use this to confirm that various settings files that would contain information specific to the hardware model I ran InstaDMG on don't end up on my master images.<br /><br />empty_directory_test.py:<br /> Confirms that directories that you want to be empty on the generated image, actually are.<br /><br />network_plist_test.py:<br /> Confirms the absence of various network preference files. This prevents a problem we ran into when booting MacBook Airs from an image created on a machine that has built-in ethernet.<br /><br />ouradmin_test.py:<br /> Ensures that there's a local admin user on the image named ouradmin, and that it's a member of the admin, _lpadmin and _appserveradm groups. Also lints the appropriate plist files in /var/db/dslocal/nodes/Default to detect if your user creation package corrupted them.<br /><br />skipsetup_test.py:<br /> Makes sure the appropriate files have been touched on the image to prevent a newly imaged machine from playing the annoying welcome movie.<br /><br />software_update_test.py:<br /> If you're using a local software update server in your environment, you can use this to make sure the dmg has the correct settings to use it instead of the standard Apple servers.<br /><br />zz_plint_test.py:<br /> Lints every plist on the dmg and displays a list of any files that failed their lint check.<br /><br />zz_suidguid_test.py:<br /> Finds every suid/setguid file on the dmg and reports any that aren't in your whitelist. Handy for detecting crappy installers.<br /><br />zz_world_writable_test.py:<br /> Finds every file or directory that is world writable and reports any that aren't in your whitelist. Also useful for detecting poorly written installers.<br /><br />I've also included the whitelists and blacklists I'm using for these tests for you to use as a base to customize your own, though I'd appreciate it if you'd email any additions you think are useful.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-54095207956838853242008-11-13T19:19:00.002-08:002008-11-13T19:21:54.366-08:00Photo of another solar systemDiscover has an <a href='http://blogs.discovermagazine.com/badastronomy/2008/11/13/huge-exoplanet-news-items-pictures/'>article </a>about the first photo of another solar system. Not just a planet, multiple planets. Way cool.<br /><br />Thanks to my friend Morf for the heads up.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-10388836933485851852008-10-14T14:16:00.003-07:002008-10-14T14:18:29.868-07:00New MacBook and MacBookProsSo, new hardware. On the pro side, the hard drive is no longer an ordeal to swap out, which is great for those of us in the enterprise. On the down side, no more target disk mode, which was always one of the great things about working on Macs.<br /><br />More later once I've had a chance to use one for a couple of days.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-18167951989804826492008-10-08T22:53:00.002-07:002008-10-08T22:56:18.945-07:00Thin 1.0 is outMarc André Cournoyer announced the release of Thin 1.0 on his <a href='http://macournoyer.wordpress.com/2008/09/30/thin-10/'>blog</a> last week.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-90607323227803199702008-10-07T20:30:00.002-07:002008-10-07T20:32:46.194-07:00Updating gem to 1.3 on OS X Leopard<a href="http://rails.wincent.com/wiki/Updating_to_RubyGems_1.3.0_on_Mac_OS_X_Leopard_10.5.4">wincent.com</a> has a clear set of instructions on how to deal with errors updating gem to 1.3.0 on OS X.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-54428004635527141552008-09-28T16:07:00.001-07:002008-09-28T16:14:35.895-07:00Negadon and MirokuIf you're a fan of Godzilla and/or giant robot movies, you'll like this. All the feel of the 60s movies, but done with CGI.<br /><br /><a href='http://www.youtube.com/watch?v=PezsBkDfrho'>Negadon and Miroku</a>.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-19162226517484821552008-06-17T16:40:00.002-07:002008-06-17T16:43:43.944-07:00Run Ruby Script Automator ActionJason Foreman published an Automator action that allows you to take advantage of Cocoa in Ruby scripts on his <a href='http://threeve.org/blog/2008/01/run-ruby-script-automator-action.html'>blog</a>.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-53451323240590638552008-05-04T10:10:00.002-07:002008-05-04T10:13:52.446-07:00New BlogMy friend Jack is, among other things, a technical author. He's just set up a new site for his technology writing at <a href='http://jackherrington.com'>http://jackherrington.com</a>.<br /><br />His latest book is on Flex, and is being published by O'Reilly. More details at his blog.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-60225905180099839372008-04-02T12:26:00.002-07:002008-04-02T12:32:06.411-07:00Tracks<a href='http://www.rousette.org.uk/projects/'>Tracks</a> is a GPL Rails application to help implement David Allen's "Getting Things Done".<br /><br />I've installed it on my MBP and it looks great so far. You can tag tasks (and view only tasks for one tag), set up contexts such as work/home/misc and then view things grouped by context, set due dates, set tasks to only be visible after a certain date, view graphs and statistics about how long it takes you to complete tasks, comes with an API so you can write your own scripts to interact with it - it's very comprehensive.<div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0tag:blogger.com,1999:blog-10772591.post-2259066046353730202008-04-02T08:31:00.001-07:002008-04-02T08:35:13.608-07:00Gem 1.1 releasedBug fixes, speedups. More details on <a href='http://blog.segment7.net/articles/2008/03/29/rubygems-1-1-0'>Eric Hodel's blog</a>. Update with <br /><code>sudo gem update --system</code><div class="blogger-post-footer"><hr /> <a href="http://HaveGNUWillTravel.ApesSeekingKnowledge.net">Have GNU, Will Travel.</a></div>jpbhttp://www.blogger.com/profile/17904401299771049072noreply@blogger.com0