| 
									
										
										
										
											2024-04-11 18:39:46 +08:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import requests | 
					
						
							|  |  |  | import argparse | 
					
						
							|  |  |  | from datetime import datetime, timedelta | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def view( | 
					
						
							|  |  |  |     url, | 
					
						
							|  |  |  |     token, | 
					
						
							|  |  |  |     id=None, | 
					
						
							|  |  |  |     device_name=None, | 
					
						
							|  |  |  |     user_name=None, | 
					
						
							|  |  |  |     group_name=None, | 
					
						
							|  |  |  |     offline_days=None, | 
					
						
							|  |  |  | ): | 
					
						
							|  |  |  |     headers = {"Authorization": f"Bearer {token}"} | 
					
						
							|  |  |  |     pageSize = 30 | 
					
						
							|  |  |  |     params = { | 
					
						
							|  |  |  |         "id": id, | 
					
						
							|  |  |  |         "device_name": device_name, | 
					
						
							|  |  |  |         "user_name": user_name, | 
					
						
							|  |  |  |         "group_name": group_name, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     params = { | 
					
						
							|  |  |  |         k: "%" + v + "%" if (v != "-" and "%" not in v) else v | 
					
						
							|  |  |  |         for k, v in params.items() | 
					
						
							|  |  |  |         if v is not None | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     params["pageSize"] = pageSize | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     devices = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     current = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while True: | 
					
						
							|  |  |  |         params["current"] = current | 
					
						
							|  |  |  |         response = requests.get(f"{url}/api/devices", headers=headers, params=params) | 
					
						
							|  |  |  |         response_json = response.json() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         data = response_json.get("data", []) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for device in data: | 
					
						
							|  |  |  |             if offline_days is None: | 
					
						
							|  |  |  |                 devices.append(device) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             last_online = datetime.strptime( | 
					
						
							|  |  |  |                 device["last_online"], "%Y-%m-%dT%H:%M:%S" | 
					
						
							|  |  |  |             )  # assuming date is in this format | 
					
						
							|  |  |  |             if (datetime.utcnow() - last_online).days >= offline_days: | 
					
						
							|  |  |  |                 devices.append(device) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         total = response_json.get("total", 0) | 
					
						
							|  |  |  |         current += pageSize | 
					
						
							|  |  |  |         if len(data) < pageSize or current > total: | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return devices | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def check(response): | 
					
						
							|  |  |  |     if response.status_code == 200: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             response_json = response.json() | 
					
						
							|  |  |  |             return response_json | 
					
						
							|  |  |  |         except ValueError: | 
					
						
							|  |  |  |             return response.text or "Success" | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2024-04-13 14:43:27 +08:00
										 |  |  |         return "Failed", response.status_code, response.text | 
					
						
							| 
									
										
										
										
											2024-04-11 18:39:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def disable(url, token, guid, id): | 
					
						
							|  |  |  |     print("Disable", id) | 
					
						
							|  |  |  |     headers = {"Authorization": f"Bearer {token}"} | 
					
						
							|  |  |  |     response = requests.post(f"{url}/api/devices/{guid}/disable", headers=headers) | 
					
						
							|  |  |  |     return check(response) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def enable(url, token, guid, id): | 
					
						
							|  |  |  |     print("Enable", id) | 
					
						
							|  |  |  |     headers = {"Authorization": f"Bearer {token}"} | 
					
						
							|  |  |  |     response = requests.post(f"{url}/api/devices/{guid}/enable", headers=headers) | 
					
						
							|  |  |  |     return check(response) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def delete(url, token, guid, id): | 
					
						
							|  |  |  |     print("Delete", id) | 
					
						
							|  |  |  |     headers = {"Authorization": f"Bearer {token}"} | 
					
						
							|  |  |  |     response = requests.delete(f"{url}/api/devices/{guid}", headers=headers) | 
					
						
							|  |  |  |     return check(response) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     parser = argparse.ArgumentParser(description="Device manager") | 
					
						
							|  |  |  |     parser.add_argument( | 
					
						
							|  |  |  |         "command", | 
					
						
							|  |  |  |         choices=["view", "disable", "enable", "delete"], | 
					
						
							|  |  |  |         help="Command to execute", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     parser.add_argument("--url", required=True, help="URL of the API") | 
					
						
							|  |  |  |     parser.add_argument( | 
					
						
							|  |  |  |         "--token", required=True, help="Bearer token for authentication" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     parser.add_argument("--id", help="Device ID") | 
					
						
							|  |  |  |     parser.add_argument("--device_name", help="Device name") | 
					
						
							|  |  |  |     parser.add_argument("--user_name", help="User name") | 
					
						
							|  |  |  |     parser.add_argument("--group_name", help="Group name") | 
					
						
							|  |  |  |     parser.add_argument( | 
					
						
							|  |  |  |         "--offline_days", type=int, help="Offline duration in days, e.g., 7" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     args = parser.parse_args() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     devices = view( | 
					
						
							|  |  |  |         args.url, | 
					
						
							|  |  |  |         args.token, | 
					
						
							|  |  |  |         args.id, | 
					
						
							|  |  |  |         args.device_name, | 
					
						
							|  |  |  |         args.user_name, | 
					
						
							|  |  |  |         args.group_name, | 
					
						
							|  |  |  |         args.offline_days, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if args.command == "view": | 
					
						
							|  |  |  |         for device in devices: | 
					
						
							|  |  |  |             print(device) | 
					
						
							|  |  |  |     elif args.command == "disable": | 
					
						
							|  |  |  |         for device in devices: | 
					
						
							|  |  |  |             response = disable(args.url, args.token, device["guid"], device["id"]) | 
					
						
							|  |  |  |             print(response) | 
					
						
							|  |  |  |     elif args.command == "enable": | 
					
						
							|  |  |  |         for device in devices: | 
					
						
							|  |  |  |             response = enable(args.url, args.token, device["guid"], device["id"]) | 
					
						
							|  |  |  |             print(response) | 
					
						
							|  |  |  |     elif args.command == "delete": | 
					
						
							|  |  |  |         for device in devices: | 
					
						
							|  |  |  |             response = delete(args.url, args.token, device["guid"], device["id"]) | 
					
						
							|  |  |  |             print(response) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     main() |