diff --git a/jamf2snipe b/jamf2snipe index a363020..b1a47c1 100755 --- a/jamf2snipe +++ b/jamf2snipe @@ -60,7 +60,8 @@ import datetime runtimeargs = argparse.ArgumentParser() runtimeargs.add_argument("-v", "--verbose", help="Sets the logging level to INFO and gives you a better idea of what the script is doing.", action="store_true") runtimeargs.add_argument("--auto_incrementing", help="You can use this if you have auto-incrementing enabled in your snipe instance to utilize that instead of adding the Jamf ID for the asset tag.", action="store_true") -runtimeargs.add_argument("--dryrun", help="This checks your config and tries to contact both the JAMFPro and Snipe-it instances, but exits before updating or syncing any assets.", action="store_true") +runtimeargs.add_argument("--dryrun", help="This checks your config and tries to contact both the JAMFPro and Snipe-it instances, and will generate the assets for debugging, but not update or sync anything but exits before updating or syncing any assets.", action="store_true") +runtimeargs.add_argument("--connection_test", help="This checks your config and tries to contact both the JAMFPro and Snipe-it instances.", action="store_true") runtimeargs.add_argument("-d", "--debug", help="Sets logging to include additional DEBUG messages.", action="store_true") runtimeargs.add_argument("--do_not_update_jamf", help="Does not update Jamf with the asset tags stored in Snipe.", action="store_false") runtimeargs.add_argument('--do_not_verify_ssl', help="Skips SSL verification for all requests. Helpful when you use self-signed certificate.", action="store_false") @@ -89,8 +90,20 @@ elif user_args.debug: else: logging.basicConfig(level=logging.WARNING) +# Notify users if we're doing a connection test. +if user_args.connection_test and user_args.dryrun: + logging.error("You can't use --connection_test and --dryrun at the same time. Please choose one or the other.") + raise SystemExit("Error: Invalid runtime arguments - Exiting.") +if user_args.connection_test and user_args.force: + logging.error("You can't use --connection_test and --force at the same time. Please choose one or the other.") + raise SystemExit("Error: Invalid runtime arguments - Exiting.") +if user_args.connection_test: + print("Connection test: Starting jamf2snipe with a connection test where we'll try to contact both the JAMFPro and Snipe-it instances.") + # Notify users if we're doing a dry run. -if user_args.dryrun: +if user_args.dryrun and user_args.force: + print("Running a dry run with force enabled. This will generate assets for debugging, but not update or sync anything.") +elif user_args.dryrun: print("Dryrun: Starting jamf2snipe with a dry run where no assets will be updated.") # Find a valid settings.conf file. @@ -395,6 +408,9 @@ def search_jamf_mobile(jamf_id): # Function to update the asset tag of computers in JAMF with an number passed from Snipe. def update_jamf_asset_tag(jamf_id, asset_tag): + if user_args.dryrun: + logging.debug("Would have updated JAMF asset id: {} with asset tag: {}".format(jamf_id, asset_tag)) + return True api_url = "{}/JSSResource/computers/id/{}".format(jamfpro_base, jamf_id) payload = """{}{}""".format(jamf_id, asset_tag) logging.debug('Making Get request against: {}\nPayload for the PUT request is: {}\nThe username, password, and headers can be found near the beginning of the output.'.format(api_url, payload)) @@ -418,6 +434,9 @@ def update_jamf_asset_tag(jamf_id, asset_tag): # Function to update the asset tag of mobile devices in JAMF with an number passed from Snipe. def update_jamf_mobiledevice_asset_tag(jamf_id, asset_tag): + if user_args.dryrun: + logging.debug("Would have updated JAMF asset id: {} with asset tag: {}".format(jamf_id, asset_tag)) + return True api_url = "{}/JSSResource/mobiledevices/id/{}".format(jamfpro_base, jamf_id) payload = """{}{}""".format(jamf_id, asset_tag) logging.debug('Making Get request against: {}\nPayload for the PUT request is: {}\nThe username, password, and headers can be found near the beginning of the output.'.format(api_url, payload)) @@ -570,6 +589,9 @@ def create_snipe_asset(payload): # Function that updates a snipe asset with a JSON payload def update_snipe_asset(snipe_id, payload): + if user_args.dryrun: + logging.debug("Dry run mode is enabled. We would have updated ID: {} with the following payload: {}".format(snipe_id, payload)) + return True api_url = '{}/api/v1/hardware/{}'.format(snipe_base, snipe_id) logging.debug('The payload for the snipe update is: {}'.format(payload)) response = requests.patch(api_url, headers=snipeheaders, json=payload, verify=user_args.do_not_verify_ssl, hooks={'response': request_handler}) @@ -737,8 +759,8 @@ else: raise SystemExit("Unable to get JAMF Computers.") # After this point we start editing data, so quit if this is a dryrun -if user_args.dryrun: - raise SystemExit("Dryrun: Complete.") +if user_args.connection_test: + raise SystemExit("Connection Test: Complete.") # From this point on, we're editing data. logging.info('Starting to Update Inventory')