{"id":41719489,"url":"https://github.com/zentralopensource/nekobus","last_synced_at":"2026-01-24T22:30:43.539Z","repository":{"id":279494399,"uuid":"938955501","full_name":"zentralopensource/nekobus","owner":"zentralopensource","description":"Collection of tools for MDM migrations","archived":false,"fork":false,"pushed_at":"2025-12-15T14:21:21.000Z","size":57,"stargazers_count":4,"open_issues_count":3,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-12-18T18:27:03.836Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zentralopensource.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-25T19:02:33.000Z","updated_at":"2025-12-15T14:21:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"ff841de4-14d2-4a11-bce5-9f365ebddf5e","html_url":"https://github.com/zentralopensource/nekobus","commit_stats":null,"previous_names":["zentralopensource/nekobus"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/zentralopensource/nekobus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zentralopensource%2Fnekobus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zentralopensource%2Fnekobus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zentralopensource%2Fnekobus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zentralopensource%2Fnekobus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zentralopensource","download_url":"https://codeload.github.com/zentralopensource/nekobus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zentralopensource%2Fnekobus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28738934,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T22:12:27.248Z","status":"ssl_error","status_checked_at":"2026-01-24T22:12:10.529Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-24T22:30:42.649Z","updated_at":"2026-01-24T22:30:43.535Z","avatar_url":"https://github.com/zentralopensource.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AWS lambda for MDM migration\n\nThis AWS lambda function supports four operations:\n\n - `check`\n - `start`\n - `status`\n - `finish`\n\nOperations are passed as `operation` parameter in the URL query. The `serial_number` query parameter is also required.\n\n### `check`\n\nHTTP Method: `GET`\n\nThe lambda verifies in Zentral that the device has the *ready tag* and the correct DEP enrollment assigned in the Apple Business Manager.\n\nExample:\n\n```\ncurl -s -H \"Authorization: Bearer $THE_NEKOBUS_TOKEN\" \\\n'https://xxx.lambda-url.us-east-1.on.aws/?operation=check\u0026serial_number=ABCDEFGHIJK'|jq .\n\n{\n  \"operation\": \"check\",\n  \"serial_number\": \"ABCDEFGHIJK\",\n  \"dep_status\": \"OK\",\n  \"migration_tags\": [\"ready\"],\n  \"check\": true\n}\n```\n\n**IMPORTANT:** A migration must not be attempted if `dep_status` is not `OK`!!!\n\n\n`check` is True if `dep_status` is `OK` and the *ready tag* is present in the `migration_tags`. If the `dep_status` is `OK` but the *ready tag* is not present, that is a good indication that a previous migration didn't finish as expected (not unenrolled, bad authentication, …).\n\n### `start`\n\nHTTP Method: `POST`\n\n**IMPORTANT** The lambda does the same verification as during the `check` operation, and if successful:\n\n * the device is Unenrolled in Jamf\n * the *ready tag* is removed in Zentral\n * the *started tag* is set in Zentral.\n\n```\ncurl -s -XPOST -H \"Authorization: Bearer $THE_NEKOBUS_TOKEN\" \\\n'https://xxx.lambda-url.us-east-1.on.aws/?operation=start\u0026serial_number=ABCDEFGHIJK'|jq .\n\n{\n  \"operation\": \"start\",\n  \"serial_number\": \"ABCDEFGHIJK\",\n}\n```\n\n### `status`\n\nHTTP Method: `GET`\n\nReturn the status of the enrollmemts in Jamf and Zentral. If the device is unenrolled in Jamf, the *started tag* is removed and the *unenrolled tag* is set on the device in Zentral.\n\n```\ncurl -s -H \"Authorization: Bearer $THE_NEKOBUS_TOKEN\" \\\n'https://xxx.lambda-url.us-east-1.on.aws/?operation=status\u0026serial_number=ABCDEFGHIJK'|jq .\n\n{\n  \"operation\": \"status\",\n  \"serial_number\": \"ABCDEFGHIJK\",\n  \"jamf_status\": \"unenrolled\",\n  \"zentral_status\": \"enrolled\"\n}\n```\n\n### `finish`\n\nHTTP Method: `POST`\n\nThe *unenrolled tag* is removed and the *finished tag* is set on the device in Zentral.\n\n```\ncurl -s -XPOST -H \"Authorization: Bearer $THE_NEKOBUS_TOKEN\" \\\n'https://xxx.lambda-url.us-east-1.on.aws/?operation=finish\u0026serial_number=ABCDEFGHIJK'|jq .\n\n{\n  \"operation\": \"finish\",\n  \"serial_number\": \"ABCDEFGHIJK\",\n}\n```\n\n## Configuration\n\n### Jamf\n\nYou need a API role with the `Read Computers`, and `Send Computer Unmanage Command` privileges. You also need an API client assigned to this role. Set the `Access token lifetime` to something reasonable like one hour, to avoid having to fetch too many access tokens. Save the `Client ID` and `Client Secret`.\n\n### Zentral\n\nYou need a Role with the following permissions:\n\n * `inventory.add_tag`\n * `inventory.add_taxonomy`\n * `inventory.add_machinetag`\n * `inventory.delete_machinetag`\n * `inventory.view_machinesnapshot`\n * `mdm.view_depdevice`\n * `mdm.view_enrolleddevice`\n\nYou need a Service Account attached to this Role. Save its API token.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzentralopensource%2Fnekobus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzentralopensource%2Fnekobus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzentralopensource%2Fnekobus/lists"}