Skip to content

Latest commit

 

History

History
247 lines (184 loc) · 10 KB

DEVNOTES.md

File metadata and controls

247 lines (184 loc) · 10 KB

Recipe Robot Development Notes

Some scattered notes to assist in the design and development of Recipe Robot.


Facts

These are the pieces of information we collect from app and recipe input in order to create the corresponding recipe types.

  • app_file The filename of the application bundle, if it differs from app_name.

  • app_name The name of the app, as determined by CFBundleName in the app's Info.plist file.

  • app_path The path to the app. Used when overriding AppStoreApp recipes.

  • bitbucket_repo For a BitBucket URL, this is the path to the specified project. (For example, the bitbucket_repo for the input URL https://bitbucket.org/tperfitt/path-launcher would be tperfitt/path-launcher.)

  • blocking_applications An array of strings corresponding to the applications that should not be running in order to safely install this app. Necessary to specify when deploying a pkg installer via Munki.

  • bundle_id The bundle identifier of the app, as determined by CFBundleIdentifier in the app's Info.plist file.

  • codesign_authorities The "expected authorities" that must be present (and in specified order) for CodeSignatureVerifier to pass.

  • codesign_reqs The "requirements" that must be met in order for CodeSignatureVerifier to pass.

  • codesign_status If an app is signed with v2 enclosure, this is "signed". Otherwise, it's "unsigned".

  • codesign_input_filename The filename of the pkg or app to be passed to CodeSignatureVerifier. If omitted, Recipe Robot assumes "%NAME%.app"

  • description A brief and understandable description of what the app does. If the input URL is from GitHub, SourceForge, or BitBucket, the description is obtained from that service's API. Otherwise, the description is obtained by searching MacUpdate for the top result matching app_name.

  • developer The name of the developer or organization that makes the app.

  • download_filename The name of the file downloaded from a specified input URL. (For example, AutoPkgr-1.3.2.dmg.)

  • download_format The format of the file downloaded from a specified input URL. (For example, dmg)

  • download_url The URL that points to the latest version of the app. Used in download recipes by the URLDownloader processor.

  • github_repo For a GitHub URL, this is the path to the specified project. (For example, the github_repo for the input URL https://github.com/lindegroup/autopkgr would be lindegroup/autopkgr.)

  • icon_path The path to the icns file used to display the app's primary icon. If munki or jss recipes are selected, this file will be converted to a 300px by 300px png file and saved in the output folder along with the recipes.

  • inspections An array of strings that act as a breadcrumb trail during fact-gathering and prevent us from covering the same ground twice. This increases the speed of Recipe Robot and prevents getting trapped in loops.

  • is_from_app_store Is "true" if the app contains an _MASReceipt file, indicating it was downloaded from the App Store. This results in the creation of AppStoreApp overrides instead of standalone recipes.

  • pkgsign_status Is "signed" if the pkg file is signed, "unsigned" otherwise.

  • sourceforge_id For a SourceForge URL, this is the path to the specified project. (For example, the bitbucket_repo for the input URL https://bitbucket.org/tperfitt/path-launcher would be tperfitt/path-launcher.)

  • sparkle_feed The URL to the Sparkle feed (appcast) of the app, often used to create a download recipe that leverages SparkleUpdateInfoProvider.

  • sparkle_provides_version Is True if a usable version number was found in the Sparkle feed, is False otherwise.

  • use_asset_regex Is True if a GitHub repo has been inspected and that repo has multiple file formats in its releases.

  • user-agent If accessing a download URL or Sparkle feed fails using the standard Python user-agent, an alternative user-agent is attempted. If that attempt succeeds, the user-agent fact is set, which causes the corresponding request_headers to be used in the resulting recipe.

  • version_key Most apps use CFBundleShortVersionString to indicate the version, but some use CFBundleVersion. The version_key fact indicates which to use for the purpose of building recipes.


Interesting examples and edge cases to use for testing:

Basic example of a signed app in a dmg (works as of 2015-10-07):

recipe-robot --verbose https://www.dropbox.com/s/0s2a66jrstvd594/AutoPkgr.dmg?dl=1

Basic example of a signed app in a pkg (works as of 2018-03-21):

recipe-robot --verbose https://www.dropbox.com/s/j9p1wqhecltxt5o/AutoPkgr-1.4.2.pkg?dl=1

Basic example of a signed app in a zip (works as of 2015-10-07):

recipe-robot --verbose https://www.dropbox.com/s/482p3tai0v8uvky/signed-app-in-zip.zip?dl=1

Basic example of an unsigned app in a dmg (works as of 2015-10-07):

recipe-robot --verbose https://www.dropbox.com/s/g7wke2p32ejibtt/unsigned-app-in-dmg.dmg?dl=1

Basic example of an unsigned app in a pkg (works as of 2015-10-07):

recipe-robot --verbose https://www.dropbox.com/s/6pawuykelhdvwq3/unsigned-app-in-pkg.pkg?dl=1

Basic example of an unsigned app in a zip (works as of 2015-10-07):

recipe-robot --verbose https://www.dropbox.com/s/uyhkiir6jpm0t79/unsigned-app-in-zip.zip?dl=1

Zip download reveals an installer in .app format:

recipe-robot --verbose http://download.bjango.com/skalacolor/

Signed installer download:

recipe-robot --verbose https://api.vivi.io/mac-pkg

Sparkle feed blocks Python user-agent:

recipe-robot --verbose https://download.sketchapp.com/sketch.zip

Downloaded disk image requires agreement to license before mounting:

recipe-robot --verbose https://www.revisionsapp.com/downloads/revisions-2.1.1.dmg

Sparkle feed lists the most recent items last, instead of first:

recipe-robot --verbose http://www.marinersoftware.com/sparkle/MacGourmet4/macgourmet4.xml

Dmg download reveals a pkg installer (and an uninstaller too):

recipe-robot --verbose http://downloads.econtechnologies.com/CS4_Download.dmg

Dmg download reveals a pkg installer, which contains an app:

recipe-robot --verbose https://pqrs.org/osx/karabiner/files/Karabiner-10.9.0.dmg
recipe-robot --verbose https://github.com/integralpro/nosleep/releases

App that uses a version 1 (obsolete) code signature:

recipe-robot --verbose http://mrrsoftware.com/Downloads/NameChanger/Updates/NameChanger-2_3_3.zip

App that uses a LooseVersion (3.1.4.0) for CFBundleShortVersionString (also, specifies download format in URL parameters):

recipe-robot --verbose https://srv3.airdroid.com/p14/web/getbinaryredirect?type=dmg

Direct download doesn't work because of "SSLV3_ALERT_HANDSHAKE_FAILURE":

recipe-robot --verbose http://www.macroplant.com/latest-binaries/adapter-mac.dmg
recipe-robot --verbose http://cdn.macroplant.com/release/Adapter-2.1.6.dmg
recipe-robot --verbose http://www.macroplant.com/adapter/adapterAppcast.xml

The app we want is not at the root level of the downloaded file:

recipe-robot --verbose https://github.com/jbtule/cdto/releases/download/2_6_0/cdto_2_6.zip
recipe-robot --verbose http://www.softobe.com/download/kinemac.dmg
recipe-robot --verbose http://www.softobe.com/download/flsy.dmg

Download URL has & which doesn't parse in Terminal:

recipe-robot --verbose http://www.dejal.com/download/?prod=simon&vers=4.1&lang=en&op=getnow&ref=footer

The download produces a CERTIFICATE_VERIFY_FAILED error:

recipe-robot --verbose https://updates.aviatorbrowser.com/Aviator.dmg

Direct download URL (dmg) is a different format than the Sparkle download URL (zip):

recipe-robot --verbose https://tunnelblick.net/release/Tunnelblick_3.7.8_build_5180.dmg

An app installer at the root level of the DMG (Can we have some kind of warning about this?):

recipe-robot --verbose http://cdn01.downloads.smartbear.com/soapui/5.2.0/SoapUI-5.2.0.dmg

Sparkle feed points to a 404 download URL, but based on the URL we should be able to build recipes anyway. (Assume it's an unsigned zip.)

recipe-robot --verbose /Applications/Screens.app

SUFeedURL is "NULL":

recipe-robot --verbose http://www.git-tower.com/download

A prefpane within a dmg:

recipe-robot --verbose https://bahoom.com/hyperdock/HyperDock.dmg

Content Types

To get an grasp of the typical content types that Recipe Robot will be dealing with, I ran curl -sIL on every SPARKLE_FEED_URL and DOWNLOAD_URL in the homebysix-recipes repo. Here are the content types that were returned:

Type Count
text/html 101
application/xml 62
application/zip 33
application/x-apple-diskimage 24
text/xml 24
application/octet-stream 22
text/plain 7
application/xhtml+xml 5
application/rss+xml 3
binary/octet-stream 3
application/vnd.apple.installer+xml 1
application/x-bzip2 1
application/x-rss+xml 1
plain/text 1

("text/html" also includes error messages caused by input variables in URL.)