Promoter Downloads

For those who want to try out Promoter’s early Mac build (v0.9.2) that, at this time, does not support file migration, you can now go here and grab the latest versions as I finish them.  The current binary I’ve posted is a 32-bit OS X build that I’ve tested on 10.7, 10.8 and 10.9:

Also, please hit me up on email, Twitter, comments here, etc. with any potential defects/bugs you encounter so I can start working on those fixes.  If you do run into a problem, some of the following data can help identify what happened: the Promoter log file, the policy XML and the XML of the object that caused the failure.  If you can’t provide that data, that’s ok, we can try and work through it.

There are two bugs I’ve already identified:

  1. Special characters like ‘/’ in object names are not being handled for the API requests and do cause POST failures.
  2. Trying to perform a POST on a JSS over HTTP when HTTPS is enabled seems to fail.

I can imagine there’s more out there I’ve not accounted for.  Aside from issues, also feel free to place requests for new features/capabilities that you would like to see in future versions.  I’m interested in hearing what people think of this tool.  The Windows and Linux (targeting Ubuntu) builds will be available soon.


12 thoughts on “Promoter Downloads

    • Hey there Tobias,

      It easily could in the next build. I included the option of a configuration file to help automate the process and integrate into scripting.

      The –createconfig arg in the next build will allow you to save the password for the JSS accounts (plain text, not secure!) as well as define the distribution point/server the policy should be assigned to on the destination JSS (it will check that what you’ve input exists before attempting to promote the policy).

      If you have suggestions please send them my way.


  1. That sounds great. It would especially be convenient to be able to save many destinations so the script would send the change directly to all our instances.

    What would happen if there was already a Policy with the same ID?

    What’s the easiest way to find out the ID of a Policy (without digging in MySQL)?


    • Promoter handles everything based upon policy name, so there are never ID conflicts when it makes a post. As it is promoting a policy it checks the destination for the resource it needs by name, copies it over if it doesn’t exist, and then replaces the IDs in the policy XML for when the policy is posted (which is how this all works).

      The absolute easier way of finding out the ID of an object in the JSS is to login to the web app and browse to it. You’ll find the ID in the address bar.


      • Hi Bryson
        We now try to get some structure into our multi-instance setup and so the need for an awesome tool like your promoter is really craved for by my minions 🙂

        Two features we would love to see are

        1. one source to many destinations
        2. possibility to over-write an existing policy
        3. have the policy active on the destination

        Like this we would promote standard policies like a new version of Firefox easily to our 30 client instances. Is there anything we can do to motivate you to integrate this features in promoter? This would be a huge time saver for us.


  2. I suppose the special characters bug will bite on international two byte characters such as åäö as well?

    Got this error:
    Performing API GET request for: https://s002as20:8443/JSSResource/jssuser
    API GET request successful: 200
    Traceback (most recent call last):
    File “”, line 542, in
    File “”, line 530, in main
    File “”, line 255, in jsscheck
    File “/Users/brysontyrrell/build/promoter/out00-PYZ.pyz/xml.etree.ElementTree”, line 1300, in XML
    File “/Users/brysontyrrell/build/promoter/out00-PYZ.pyz/xml.etree.ElementTree”, line 1640, in feed
    UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xf6′ in position 58: ordinal not in range(128)

    Unicode 000f06 equals to the character “ö”.

    Tried to send you the output from the JSS summary but I could not find your email address. Mine is tycho at apoio dot se


  3. I don’t want to be ‘that guy’, but I get this error below (JSS source is 9.3, destination is 9.31)

    Can you send me in any direction for troubleshooting? Machine running promoter is 10.9.2.

    promoter –policy 8872 –prompt –noverify
    URL to source JSS: (removed)
    Username for source JSS: ladmin
    Password for source JSS:
    URL to destination JSS: (removed)
    Username for destination JSS: administrator
    Password for destination JSS:
    The source and destination JSS instances are not the same version
    Are you sure you wish to continue?
    [y/n]: y
    Promoting the policy: ‘Install – Adobe Photoshop CC’
    Traceback (most recent call last):
    File “”, line 542, in
    File “”, line 536, in main
    File “”, line 420, in promote
    File “”, line 500, in resourcecheck
    File “/Users/brysontyrrell/build/promoter/out00-PYZ.pyz/xml.etree.ElementTree”, line 1300, in XML
    File “/Users/brysontyrrell/build/promoter/out00-PYZ.pyz/xml.etree.ElementTree”, line 1642, in feed
    File “/Users/brysontyrrell/build/promoter/out00-PYZ.pyz/xml.etree.ElementTree”, line 1506, in _raiseerror
    xml.etree.ElementTree.ParseError: mismatched tag: line 10, column 2


    • In the Traceback at the bottom, it looks like XML parser choked at a tag on line 10 of the policy’s XML. Could you post back the that portion of the XML? I’ve been distracted from Promoter with other project, but this may be an encoding issue that someone else raised and I was looking to properly address in 1.0.


  4. in your research for this, did come across anything that looks like license records could be migrated in a similar manor? i have to build a new database and ditch the old one, but i would love to migrate all the serial numbers (I think there would be a lot of risk in a copy/paste method). Thanks.


    • Hi Jennifer,

      Absolutely you could migrate the licensed software records in a similar fashion.

      Pretty much ANY object in one JSS can be pulled and pushed via the API between servers. What promotor does, and yes I am still working on it, is that it handles removing the elements of the object that are specific to the JSS that it originated from so the request isn’t rejected because you’re referencing something in the XML that doesn’t exist on the new server.

      In your example, licensed software, there are two items I see that you would need to handle: the list of computers that MATCH the software and the file attachments.

      In the case of the computer list you would delete the entire element from your XML and you’re done. It’s not needed in your POST.

      For the file attachments there’s a little more work, but not much. You would need to read through all of the attachments that are in your source XML first. They each include “id” “filename” and “url” elements.

      For each attachment perform a download using the provided URL and save it using the provided filename.

      Remove the file attachments from the XML. At this point you should be free and clear to POST the data to the new JSS. You can then manually re-attach the files you downloaded from the records you were migrating.

      Note: while there is a ../JSSResource/fileuploads/ resource for uploading attachments to records, I’ve tested it and it doesn’t seem to work on the “licensedsoftware” object. You might want to follow up with your Account Manager if you believe its an issue.

      Hopefully the above is a good starting point for you!


  5. Recently I’ve been getting “409 Client Error: Conflict” when I run promoter. I’ve tried multiple instances, policies, and configurations, but I keep getting this error. My main instance is 9.65. Perhaps that’s the issue?


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s