6 Commits

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
3 changed files with 47 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

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.1" 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"