18 Commits
1.0 ... 1.0.4

Author SHA1 Message Date
Jason SECULA
a6727b9538 Updated build number
Some checks failed
Build python package / Build (push) Has been cancelled
2026-06-05 10:10:05 +02:00
8bf9f9c620 Added Proxy parameter to allow usage of proxy configuration 2026-06-03 21:33:25 +02:00
1cdfbc6dc5 Updated build number and added dependencies to package
All checks were successful
Build python package / Build (push) Successful in 24s
2026-03-18 20:48:32 +01:00
Jason SECULA
90378bb2e5 updated build number for package
Some checks failed
Build python package / Build (push) Has been cancelled
2026-02-26 13:40:23 +01:00
Jason SECULA
f34f1ae793 Added GetTagDevices
Some checks failed
Build python package / Build (push) Has been cancelled
2026-02-26 13:37:00 +01:00
e53af9bb26 trying workflow fix
All checks were successful
Build python package / Build (push) Successful in 20s
2026-02-20 06:36:26 +01:00
Jason SECULA
f5abc6f0f4 removed file creation in gitlab-ci
All checks were successful
Build python package / Build (push) Successful in 14s
2026-02-19 10:41:19 +01:00
Jason SECULA
14b48e7f41 fixed __init__
Some checks failed
Build python package / Build (push) Has been cancelled
2026-02-19 10:38:43 +01:00
Jason SECULA
930927b489 updated build number for package
All checks were successful
Build python package / Build (push) Successful in 17s
2026-02-19 10:30:18 +01:00
Jason SECULA
9c468adf7d added __all__ list
Some checks failed
Build python package / Build (push) Failing after 25s
2026-02-19 10:27:29 +01:00
Jason Secula
465064f412 Update .gitlab-ci.yml file 2026-02-13 14:45:12 +01:00
Jason Secula
069caaf2d1 Update .gitlab-ci.yml file 2026-02-13 14:35:50 +01:00
Jason Secula
73f21ac6cd Update .gitlab-ci.yml file 2026-02-13 14:29:22 +01:00
Jason Secula
23a617ef62 Update .gitlab-ci.yml file 2026-02-13 14:25:21 +01:00
Jason Secula
cfd6c2acb9 Update .gitlab-ci.yml file 2026-02-13 14:16:03 +01:00
Jason Secula
3645ecc257 Update .gitlab-ci.yml file 2026-02-13 14:12:41 +01:00
Jason Secula
d7dbbda2f9 Update .gitlab-ci.yml file 2026-02-13 14:11:57 +01:00
Jason Secula
5f0556c5c9 Update .gitlab-ci.yml file 2026-02-13 14:09:10 +01:00
5 changed files with 64 additions and 17 deletions

View File

@@ -10,7 +10,7 @@ jobs:
uses: actions/checkout@main uses: actions/checkout@main
- name: Building the package - name: Building the package
run: | run: |
mv ${{ gitea.workspace }}\AirwatchAPI.py ${{ gitea.workspace }}\build\src\AirwatchAPI\ powershell mv ${{ gitea.workspace }}\AirwatchAPI.py build\src\AirwatchAPI\
cd ${{ gitea.workspace }}\build cd ${{ gitea.workspace }}\build
python -m build python -m build
- name: Publish package - name: Publish package

16
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,16 @@
image: python:latest
variables:
TWINE_USERNAME: gitlab-ci-token
TWINE_PASSWORD: $CI_JOB_TOKEN
build: # This job runs in the build stage, which runs first.
script:
- pip install build twine
- mv AirwatchAPI.py build/src/AirwatchAPI/
- cd build/
- python -m build
- python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
rules:
- if: $CI_COMMIT_TAG

View File

@@ -4,10 +4,11 @@ from cryptography.hazmat.primitives.serialization import pkcs12, pkcs7
from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.primitives import hashes, serialization
class AirwatchAPI: class AirwatchAPI:
def __init__(self, Server, APIKey, AuthMethod, APIUser=None, APIPassword=None, CertPath=None, CertPass=""): def __init__(self, Server, APIKey, AuthMethod, APIUser=None, APIPassword=None, CertPath=None, CertPass="", Proxy={}):
self.Server = Server self.Server = Server
self.APIKey = APIKey self.APIKey = APIKey
self.AuthMethod = (AuthMethod).upper() self.AuthMethod = (AuthMethod).upper()
self.Proxy = Proxy
if(self.AuthMethod == "PASSWORD"): if(self.AuthMethod == "PASSWORD"):
self.APIUser = APIUser self.APIUser = APIUser
@@ -45,7 +46,7 @@ class AirwatchAPI:
cmdURI = f'/API/system/users/search?username={username}' cmdURI = f'/API/system/users/search?username={username}'
airwatchHeaders = self.GetHeaders(cmdURI) airwatchHeaders = self.GetHeaders(cmdURI)
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
user = requests.get(uri, headers=airwatchHeaders) user = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy)
if(user.status_code == 200): if(user.status_code == 200):
return AirwatchUser(user.json()["Users"][0]) return AirwatchUser(user.json()["Users"][0])
@@ -60,25 +61,49 @@ class AirwatchAPI:
pageNum = 0 pageNum = 0
devices = [] devices = []
uri = f"{self.Server}{cmdURI}{pageNum}" uri = f"{self.Server}{cmdURI}{pageNum}"
result = requests.get(uri, headers=airwatchHeaders) result = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy)
if(result.status_code == 200): if(result.status_code == 200):
deviceTotalCount = result.json()["Total"] deviceTotalCount = result.json()["Total"]
while(len(devices) != deviceTotalCount): while(len(devices) != deviceTotalCount):
uri = f"{self.Server}{cmdURI}{pageNum}" uri = f"{self.Server}{cmdURI}{pageNum}"
result = requests.get(uri, headers=airwatchHeaders).json()["Devices"] result = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy).json()["Devices"]
for device in result: for device in result:
devices += [AirwatchDevice(device)] devices += [AirwatchDevice(device)]
pageNum += 1 pageNum += 1
return devices return devices
return None return None
def GetBitlocker(self, deviceUuid):
cmdURI = f"/api/mdm//devices/{deviceUuid}/bitlocker/drives"
airwatchHeaders = self.GetHeaders(cmdURI)
uri = f"{self.Server}{cmdURI}"
result = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy)
bitlocker_info = {}
return result
if(result.status_code == 200):
bitlocker_info = result.json()["drive_information"][0]
return bitlocker_info
def GetTagDevices(self, tagID):
cmdURI = f"/api/mdm/tags/{tagID}/devices"
airwatchHeaders = self.GetHeaders(cmdURI)
uri = f"{self.Server}{cmdURI}"
result = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy)
devices = []
if(result.status_code == 200):
for dev in result.json()["Device"]:
devices += [dev["DeviceId"]]
return devices
return []
def GetDeviceApps(self, device): def GetDeviceApps(self, device):
cmdURI = f"/api/mdm/devices/{device.Uuid}/apps/search" cmdURI = f"/api/mdm/devices/{device.Uuid}/apps/search"
airwatchHeaders = self.GetHeaders(cmdURI) airwatchHeaders = self.GetHeaders(cmdURI)
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
apps = [] apps = []
result = requests.get(uri, headers=airwatchHeaders) result = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy)
if(result.status_code == 200): if(result.status_code == 200):
for app in result.json()["app_items"]: for app in result.json()["app_items"]:
apps += [AirwatchApplication(app)] apps += [AirwatchApplication(app)]
@@ -89,7 +114,7 @@ class AirwatchAPI:
cmdURI = f"/API/mdm/dep/groups/{groupUuid}/devices" cmdURI = f"/API/mdm/dep/groups/{groupUuid}/devices"
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
airwatchHeaders = self.GetHeaders(cmdURI) airwatchHeaders = self.GetHeaders(cmdURI)
result = requests.get(uri, headers=airwatchHeaders) result = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy)
if(result.status_code == 200): if(result.status_code == 200):
for device in result.json(): for device in result.json():
if (device["enrollmentStatus"] != "Unenrolled"): if (device["enrollmentStatus"] != "Unenrolled"):
@@ -97,7 +122,7 @@ class AirwatchAPI:
assignDEPProfileURI = f"/API/mdm/dep/profiles/{device['profileUuid']}/devices/{device['deviceSerialNumber']}?action=Assign" assignDEPProfileURI = f"/API/mdm/dep/profiles/{device['profileUuid']}/devices/{device['deviceSerialNumber']}?action=Assign"
uri = f"{airwatchServer}{assignDEPProfileURI}" uri = f"{airwatchServer}{assignDEPProfileURI}"
airwatchHeaders = self.GetHeaders(assignDEPProfileURI) airwatchHeaders = self.GetHeaders(assignDEPProfileURI)
requests.put(uri, headers=airwatchHeaders) requests.put(uri, headers=airwatchHeaders, proxies=self.Proxy)
return True return True
return False return False
@@ -105,7 +130,7 @@ class AirwatchAPI:
cmdURI = f"/API/mdm/groups/{groupUuid}/enrollment-tokens?device_type={deviceType}&page_size=500" cmdURI = f"/API/mdm/groups/{groupUuid}/enrollment-tokens?device_type={deviceType}&page_size=500"
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
airwatchHeaders = self.GetHeaders(cmdURI) airwatchHeaders = self.GetHeaders(cmdURI)
result = requests.get(uri, headers=airwatchHeaders) result = requests.get(uri, headers=airwatchHeaders, proxies=self.Proxy)
return result.json()["tokens"] return result.json()["tokens"]
def UpdateUserOnEnrollmentTokens(self, groupUuid,user, serialnumber): def UpdateUserOnEnrollmentTokens(self, groupUuid,user, serialnumber):
@@ -125,13 +150,13 @@ class AirwatchAPI:
airwatchHeaders["Accept"] = "application/json;version=2" airwatchHeaders["Accept"] = "application/json;version=2"
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
print(uri) print(uri)
return requests.post(uri, headers=airwatchHeaders, json=body) return requests.post(uri, headers=airwatchHeaders, json=body, proxies=self.Proxy)
def SyncDEPDevices(self, groupUuid): def SyncDEPDevices(self, groupUuid):
cmdURI = f"/API/mdm/dep/groups/{groupUuid}/devices?action=sync" cmdURI = f"/API/mdm/dep/groups/{groupUuid}/devices?action=sync"
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
airwatchHeaders = self.GetHeaders(cmdURI) airwatchHeaders = self.GetHeaders(cmdURI)
return requests.put(uri, headers=airwatchHeaders).status_code return requests.put(uri, headers=airwatchHeaders, proxies=self.Proxy).status_code
def AddDevicesToTag(self, tagID, devices): def AddDevicesToTag(self, tagID, devices):
cmdURI = f"/API/mdm/tags/{tagID}/adddevices" cmdURI = f"/API/mdm/tags/{tagID}/adddevices"
@@ -142,7 +167,7 @@ class AirwatchAPI:
"Value": devices "Value": devices
} }
} }
return requests.post(uri, headers=airwatchHeaders, json=body).status_code return requests.post(uri, headers=airwatchHeaders, json=body, proxies=self.Proxy).status_code
def SetDeviceFriendlyName(self, device, friendlyName): def SetDeviceFriendlyName(self, device, friendlyName):
cmdURI = f"/API/mdm/devices/{device.Id}" cmdURI = f"/API/mdm/devices/{device.Id}"
@@ -151,19 +176,19 @@ class AirwatchAPI:
body = { body = {
"DeviceFriendlyName":friendlyName "DeviceFriendlyName":friendlyName
} }
return requests.put(uri, headers=airwatchHeaders, json=body).status_code return requests.put(uri, headers=airwatchHeaders, json=body, proxies=self.Proxy).status_code
def SetDeviceUser(self, device, airwatchUser): def SetDeviceUser(self, device, airwatchUser):
cmdURI = f'/API/mdm/devices/{device.Id}/enrollmentuser/{airwatchUser.Id}' cmdURI = f'/API/mdm/devices/{device.Id}/enrollmentuser/{airwatchUser.Id}'
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
airwatchHeaders = self.GetHeaders(cmdURI) airwatchHeaders = self.GetHeaders(cmdURI)
return requests.patch(uri, headers=airwatchHeaders).status_code return requests.patch(uri, headers=airwatchHeaders, proxies=self.Proxy).status_code
def DeleteDevice(self, device): def DeleteDevice(self, device):
cmdURI = f"/API/mdm/devices/{device.Id}" cmdURI = f"/API/mdm/devices/{device.Id}"
airwatchHeaders = self.GetHeaders(cmdURI) airwatchHeaders = self.GetHeaders(cmdURI)
uri = f"{self.Server}{cmdURI}" uri = f"{self.Server}{cmdURI}"
return requests.delete(uri, headers=airwatchHeaders).status_code return requests.delete(uri, headers=airwatchHeaders, proxies=self.Proxy).status_code
class AirwatchUser: class AirwatchUser:

View File

@@ -1,15 +1,20 @@
[build-system] [build-system]
requires = [ requires = [
"setuptools >= 77.0.3", "setuptools >= 77.0.3",
"requests >= 2.32.5" "requests >= 2.32.5",
"cryptography"
] ]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[project] [project]
name = "AirwatchAPI" name = "AirwatchAPI"
version = "1.0.0" version = "1.0.4"
description = "A module python to make it easier to use Workspace One API" description = "A module python to make it easier to use Workspace One API"
readme = "README.md" readme = "README.md"
dependencies = [
"requests >= 2.32.5",
"cryptography"
]
requires-python = ">=3.7" requires-python = ">=3.7"
classifiers = [ classifiers = [
"Programming Language :: Python :: 3" "Programming Language :: Python :: 3"

View File

@@ -0,0 +1 @@
__all__ = ["AirwatchAPI"]