devices.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #!/usr/bin/env python3
  2. import requests
  3. import argparse
  4. from datetime import datetime, timedelta
  5. def view(
  6. url,
  7. token,
  8. id=None,
  9. device_name=None,
  10. user_name=None,
  11. group_name=None,
  12. device_group_name=None,
  13. offline_days=None,
  14. ):
  15. headers = {"Authorization": f"Bearer {token}"}
  16. pageSize = 30
  17. params = {
  18. "id": id,
  19. "device_name": device_name,
  20. "user_name": user_name,
  21. "group_name": group_name,
  22. "device_group_name": device_group_name,
  23. }
  24. params = {
  25. k: "%" + v + "%" if (v != "-" and "%" not in v) else v
  26. for k, v in params.items()
  27. if v is not None
  28. }
  29. params["pageSize"] = pageSize
  30. devices = []
  31. current = 1
  32. while True:
  33. params["current"] = current
  34. response = requests.get(f"{url}/api/devices", headers=headers, params=params)
  35. response_json = response.json()
  36. data = response_json.get("data", [])
  37. for device in data:
  38. if offline_days is None:
  39. devices.append(device)
  40. continue
  41. last_online = datetime.strptime(
  42. device["last_online"].split(".")[0], "%Y-%m-%dT%H:%M:%S"
  43. ) # assuming date is in this format
  44. if (datetime.utcnow() - last_online).days >= offline_days:
  45. devices.append(device)
  46. total = response_json.get("total", 0)
  47. current += pageSize
  48. if len(data) < pageSize or current > total:
  49. break
  50. return devices
  51. def check(response):
  52. if response.status_code == 200:
  53. try:
  54. response_json = response.json()
  55. return response_json
  56. except ValueError:
  57. return response.text or "Success"
  58. else:
  59. return "Failed", response.status_code, response.text
  60. def disable(url, token, guid, id):
  61. print("Disable", id)
  62. headers = {"Authorization": f"Bearer {token}"}
  63. response = requests.post(f"{url}/api/devices/{guid}/disable", headers=headers)
  64. return check(response)
  65. def enable(url, token, guid, id):
  66. print("Enable", id)
  67. headers = {"Authorization": f"Bearer {token}"}
  68. response = requests.post(f"{url}/api/devices/{guid}/enable", headers=headers)
  69. return check(response)
  70. def delete(url, token, guid, id):
  71. print("Delete", id)
  72. headers = {"Authorization": f"Bearer {token}"}
  73. response = requests.delete(f"{url}/api/devices/{guid}", headers=headers)
  74. return check(response)
  75. def assign(url, token, guid, id, type, value):
  76. print("assign", id, type, value)
  77. if type != "ab" and type != "strategy_name" and type != "user_name":
  78. print("Invalid type, it must be 'ab', 'strategy_name' or 'user_name'")
  79. return
  80. data = {"type": type, "value": value}
  81. headers = {"Authorization": f"Bearer {token}"}
  82. response = requests.post(
  83. f"{url}/api/devices/{guid}/assign", headers=headers, json=data
  84. )
  85. return check(response)
  86. def main():
  87. parser = argparse.ArgumentParser(description="Device manager")
  88. parser.add_argument(
  89. "command",
  90. choices=["view", "disable", "enable", "delete", "assign"],
  91. help="Command to execute",
  92. )
  93. parser.add_argument("--url", required=True, help="URL of the API")
  94. parser.add_argument(
  95. "--token", required=True, help="Bearer token for authentication"
  96. )
  97. parser.add_argument("--id", help="Device ID")
  98. parser.add_argument("--device_name", help="Device name")
  99. parser.add_argument("--user_name", help="User name")
  100. parser.add_argument("--group_name", help="User group name")
  101. parser.add_argument("--device_group_name", help="Device group name")
  102. parser.add_argument(
  103. "--assign_to",
  104. help="<type>=<value>, e.g. user_name=mike, strategy_name=test, ab=ab1, ab=ab1,tag1",
  105. )
  106. parser.add_argument(
  107. "--offline_days", type=int, help="Offline duration in days, e.g., 7"
  108. )
  109. args = parser.parse_args()
  110. while args.url.endswith("/"): args.url = args.url[:-1]
  111. devices = view(
  112. args.url,
  113. args.token,
  114. args.id,
  115. args.device_name,
  116. args.user_name,
  117. args.group_name,
  118. args.device_group_name,
  119. args.offline_days,
  120. )
  121. if args.command == "view":
  122. for device in devices:
  123. print(device)
  124. elif args.command == "disable":
  125. for device in devices:
  126. response = disable(args.url, args.token, device["guid"], device["id"])
  127. print(response)
  128. elif args.command == "enable":
  129. for device in devices:
  130. response = enable(args.url, args.token, device["guid"], device["id"])
  131. print(response)
  132. elif args.command == "delete":
  133. for device in devices:
  134. response = delete(args.url, args.token, device["guid"], device["id"])
  135. print(response)
  136. elif args.command == "assign":
  137. if "=" not in args.assign_to:
  138. print("Invalid assign_to format, it must be <type>=<value>")
  139. return
  140. type, value = args.assign_to.split("=", 1)
  141. for device in devices:
  142. response = assign(
  143. args.url, args.token, device["guid"], device["id"], type, value
  144. )
  145. print(response)
  146. if __name__ == "__main__":
  147. main()