dockutil 1.1.2 released
Posted: May 26, 2012 Filed under: Python, Deployment, Mac OS X, Unix, Scripting, dockutil | Tags: dockutil, dock, package, version, update Leave a comment »No feature changes, just a few bug fixes:
- fix issue with replacing a url dock item
- add legacy support –hupdock option for backward compatibility
- fix paths with spaces when passing full path to plist
https://github.com/downloads/kcrawford/dockutil/dockutil-1.1.2.pkg.dmg
dockutil 1.1 released
Posted: February 5, 2012 Filed under: Deployment, dockutil, Mac OS X, Mac OS X Server, Python, Scripting 6 Comments »Version 1.1 of dockutil is out:
- fixes many issues with paths (should now work with Default User Template and other paths with spaces)
- adds option to not restart the dock (–no-restart)
- fixes issue where item would be added multiple times (use –replacing to update an existing item)
- resolves deprecation warnings
- adds option to remove all items (–remove all)
- fixes issue with removals when a url exists in a dock
- adds option –version to output version
Ruby Time to Integer does give you seconds since Epoch
Posted: August 26, 2011 Filed under: Ruby, Scripting | Tags: 1970, epoch, int, Ruby, time Leave a comment »“Time is stored internally as the number of seconds with fraction since the Epoch, January 1, 1970 00:00 UTC.”
>>require 'time'
>>Time.parse("January 1, 1970 00:00 UTC").to_i
=> 0
As expected, but nice to verify.
For the reverse, be sure to use Time.at rather than Time.new
>> Time.at(0).to_i => 0 >> Time.new(0).to_i => -62167201200
Tips for writing command line tools in ruby
Posted: August 2, 2011 Filed under: Mac OS X, Ruby, Scripting, Uncategorized, Unix | Tags: command line, development, exit status, file extension, irb, load, option parsing, require, require ruby file without extension, Ruby, tool Leave a comment »- Option parsing: Read this article by Allen Wei on RubyLearning Blog for a great overview. I recommend sticking with the built-in OptionParser if you want to reduce dependencies.
- If you want your code to be loadable so you can access functions and classes in the irb console for testing, use the following pattern:
def main#option parsing and execution code hereendif __FILE__ == $0main()endThis way the main function will only be automatically called if the script is being executed on the command line.
And in irb, you can call your functions and classes as you see fit for testing without triggering your whole script to run.Note that this is similar to the python __main__ test if you are coming from a python background.
- Naming without ruby’s.rb extension: You can name your executable without the rb extension if you wish, just be sure to include your shebang (#!)
To use the user’s default ruby, use:
#!/usr/bin/env ruby
But in some cases you may want the specify the path to ruby so you can use macruby or rubycocoa if you are need those frameworks to be available
#!/usr/bin/ruby
When testing in irb,
require 'script-name'
won’t work without the rb extension, but
load 'script-name'
does work. - Use exit codes. When your script fails or needs to communicate status at exit, use standard exit status codes.
Exit zero for default success status
exit 0
Exit any other number for a failure or warning status. You choose the exit codes for your tool, but be sure to document them if they require more explanation than simple success or failure.
exit 27 - Output to stderr using:
$stderr.puts "error: problem ...."
Parsing Mac OS X System Profiler
Posted: February 4, 2011 Filed under: Deployment, Hardware, Mac OS X, Mac OS X Server, Scripting, Unix | Tags: Apple Remote Desktop, ARD, Asset Collection, Facter, hardware, parse, plist, Puppet, report, sysinfocachegen, System Profiler, system_profiler 3 Comments »It is pretty cool how Apple System Profiler has a command line equivalent (system_profiler). And it is pretty cool how system_profiler has a -xml option to allow for easier parsing. You might use this info for extracting asset information into a database or for puppet facter facts.
However if you’ve ever looked at that xml, you know that it is a tree full of unpredictable semi-structured data that was designed specifically for the GUI app. So even though you can parse it with your favorite plist parser, there is still a lot more work to do to get to the data you care about.
The tree structure is nice for a browsing through on a single machine, but not so good for reporting across many machines.
Apple stores most of the same data as key value pairs in its database for ARD reporting, but they do a lot of massaging of the data to get it that way.
It is possible to get at this data in an ARD database if you have an ARD collection server, but an ARD collection server isn’t for everyone and doesn’t serve every use case.
You can still get at the nicely formatted ARD information. ARD client includes a tool that outputs most, if not all of the asset information you care about in a much nicer structured format for reporting.
The tool is called sysinfocachegen and you use it like this:
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Support/sysinfocachegen -p /tmp/com.yourorganization.systeminfo.plist
Just use your favorite language’s plist parser to read the plist.
Quickly Calculate size of radmind Transcript Payload
Posted: May 13, 2010 Filed under: Deployment, Mac OS X, Scripting, Unix | Tags: radmind, grep, transcript, size, awk, sum 1 Comment »grep ^[af] /var/radmind/transcript/transcript_name.T | awk ‘{sum = sum + $7} END {print sum/1000}’
Every line that starts with “a” or “f” is a file. Sum up the size field. Divide by 1000 to get KB.
Reliable record references when AppleScripting FileMaker
Posted: April 21, 2009 Filed under: FileMaker, Scripting | Tags: applescript, current record, FileMaker, record ID, Scripting Leave a comment »Using current record when AppleScripting FileMaker has a couple of problems. The current record can change out from under you, so by the next step in your script, you may be dealing with the wrong record. Simply storing the record result in a variable doesn’t work either because getting the result converts it to a native AppleScript list of the data from the record. Using a reference to current record suffers the same problem.
One solution is to use record IDs. I believe that record IDs are guaranteed to be static/unchanging, at least while the app is running.
To get the record ID for the current record:
set recID to ID of current record
To use the record ID later in your script:
get cell "my_field" of record ID recID
To get all record IDs for a given query:
set recordIDs to ID of every record whose cell "my_field" is "my_value"
Then access each found record by ID:
repeat with recID in recordIDs
get cell "my_other_field" of record ID recID
end repeat
Note: The following method will also work for certain use cases since it appears to use the record ID internally as well:
set x to current record as reference
Ruby Telnet For Logging Into RAIDs and Devices
Posted: March 19, 2009 Filed under: Ruby, Scripting | Tags: device, lun mask, raid, router, Ruby, telnet Leave a comment »Ruby’s built-in telnet capability has been extremely useful for scripting automated RAID changes like LUN masking, etc.
It is super simple. Connect, login, issue commands, read and parse results.
The example code I used is here.
This is telnet, so don’t do this if eavesdropping is a concern.
dseditgroup does not work on computers and computergroups
Posted: February 2, 2009 Filed under: Mac OS X, Scripting | Tags: computer, computergroup, DirectoryService, dsmemberutil Leave a comment »The title says it all. If you find that it does work, please let me know. I’ve tried it and it does not work even though there is a reference to a computer type record in the man page.