scanuserquota 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/env python
  2. from datetime import datetime
  3. import sys
  4. import time
  5. import pytz
  6. import requests
  7. try:
  8. import urllib.parse as urlparse
  9. except ImportError:
  10. import urlparse
  11. # change base_url to point to your SFTPGo installation
  12. base_url = "http://127.0.0.1:8080"
  13. # set to False if you want to skip TLS certificate validation
  14. verify_tls_cert = True
  15. # set the credentials for a valid admin here
  16. admin_user = "admin"
  17. admin_password = "password"
  18. # set your update conditions here
  19. def needQuotaUpdate(user):
  20. if user["status"] == 0: # inactive user
  21. return False
  22. if user["quota_size"] == 0 and user["quota_files"] == 0: # no quota restrictions
  23. return False
  24. return True
  25. class UpdateQuota:
  26. def __init__(self):
  27. self.limit = 100
  28. self.offset = 0
  29. self.access_token = ""
  30. self.access_token_expiration = None
  31. def printLog(self, message):
  32. print("{} - {}".format(datetime.now(), message))
  33. def checkAccessToken(self):
  34. if self.access_token != "" and self.access_token_expiration:
  35. expire_diff = self.access_token_expiration - datetime.now(tz=pytz.UTC)
  36. # we don't use total_seconds to be python 2 compatible
  37. seconds_to_expire = expire_diff.days * 86400 + expire_diff.seconds
  38. if seconds_to_expire > 180:
  39. return
  40. auth = requests.auth.HTTPBasicAuth(admin_user, admin_password)
  41. r = requests.get(urlparse.urljoin(base_url, "api/v2/token"), auth=auth, verify=verify_tls_cert, timeout=10)
  42. if r.status_code != 200:
  43. self.printLog("error getting access token: {}".format(r.text))
  44. sys.exit(1)
  45. self.access_token = r.json()["access_token"]
  46. self.access_token_expiration = pytz.timezone("UTC").localize(datetime.strptime(r.json()["expires_at"],
  47. "%Y-%m-%dT%H:%M:%SZ"))
  48. def getAuthHeader(self):
  49. self.checkAccessToken()
  50. return {"Authorization": "Bearer " + self.access_token}
  51. def waitForQuotaUpdate(self, username):
  52. while True:
  53. auth_header = self.getAuthHeader()
  54. r = requests.get(urlparse.urljoin(base_url, "api/v2/quotas/users/scans"), headers=auth_header, verify=verify_tls_cert,
  55. timeout=10)
  56. if r.status_code != 200:
  57. self.printLog("error getting quota scans while waiting for {}: {}".format(username, r.text))
  58. sys.exit(1)
  59. scanning = False
  60. for scan in r.json():
  61. if scan["username"] == username:
  62. scanning = True
  63. if not scanning:
  64. break
  65. self.printLog("waiting for the quota scan to complete for user {}".format(username))
  66. time.sleep(2)
  67. self.printLog("quota update for user {} finished".format(username))
  68. def updateUserQuota(self, username):
  69. self.printLog("starting quota update for user {}".format(username))
  70. auth_header = self.getAuthHeader()
  71. r = requests.post(urlparse.urljoin(base_url, "api/v2/quotas/users/" + username + "/scan"), headers=auth_header,
  72. verify=verify_tls_cert, timeout=10)
  73. if r.status_code != 202:
  74. self.printLog("error starting quota scan for user {}: {}".format(username, r.text))
  75. sys.exit(1)
  76. self.waitForQuotaUpdate(username)
  77. def updateUsersQuota(self):
  78. while True:
  79. self.printLog("get users, limit {} offset {}".format(self.limit, self.offset))
  80. auth_header = self.getAuthHeader()
  81. payload = {"limit":self.limit, "offset":self.offset}
  82. r = requests.get(urlparse.urljoin(base_url, "api/v2/users"), headers=auth_header, params=payload,
  83. verify=verify_tls_cert, timeout=10)
  84. if r.status_code != 200:
  85. self.printLog("error getting users: {}".format(r.text))
  86. sys.exit(1)
  87. users = r.json()
  88. for user in users:
  89. if needQuotaUpdate(user):
  90. self.updateUserQuota(user["username"])
  91. else:
  92. self.printLog("user {} does not need a quota update".format(user["username"]))
  93. self.offset += len(users)
  94. if len(users) < self.limit:
  95. break
  96. if __name__ == '__main__':
  97. q = UpdateQuota()
  98. q.updateUsersQuota()