sync_system.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import asyncio
  2. import base64
  3. import json
  4. import os
  5. from datetime import datetime
  6. from cryptography.hazmat.primitives import serialization
  7. from cryptography.hazmat.primitives.asymmetric import padding
  8. from cryptography.hazmat.primitives import hashes
  9. from app.config.const import SYSTEM_ID, SYSTEM_STATUS_EXPIRED, SYSTEM_STATUS_ON, APP_SERVICE_PATH
  10. from app.models import SystemDataModel
  11. from app.models.base_model import SessionLocal
  12. from app.utils.common import get_machine_id
  13. async def sync_system_license():
  14. print("-------------------------------------------")
  15. db = SessionLocal()
  16. try:
  17. system = db.query(SystemDataModel).filter_by(id=SYSTEM_ID).first()
  18. if not system:
  19. return
  20. machine_id = get_machine_id()
  21. if system.machine_id:
  22. if system.machine_id != machine_id:
  23. system.machine_id = machine_id
  24. if system.status == SYSTEM_STATUS_ON:
  25. system.status = SYSTEM_STATUS_EXPIRED
  26. else:
  27. if system.status == SYSTEM_STATUS_ON:
  28. if not system.license_code or system.expired_at < datetime.now():
  29. system.status = SYSTEM_STATUS_EXPIRED
  30. else:
  31. try:
  32. with open(os.path.join(APP_SERVICE_PATH, "pom/public_key.pem"), "rb") as f:
  33. public_key = serialization.load_pem_public_key(f.read())
  34. license_data, signature = base64.b64decode(system.license_code).split(b"-----", 1)
  35. # print(license_data)
  36. public_key.verify(
  37. signature,
  38. license_data,
  39. padding.PSS(
  40. mgf=padding.MGF1(hashes.SHA256()),
  41. salt_length=padding.PSS.MAX_LENGTH
  42. ),
  43. hashes.SHA256()
  44. )
  45. license_dict = json.loads(license_data.decode('utf-8'))
  46. # print(license_dict)
  47. expiration_date = datetime.fromisoformat(license_dict['expiration_date'])
  48. system.expired_at = expiration_date
  49. if expiration_date < datetime.now():
  50. system.status = SYSTEM_STATUS_EXPIRED
  51. except Exception as e:
  52. print(e)
  53. system.status = SYSTEM_STATUS_EXPIRED
  54. else:
  55. if system.status == SYSTEM_STATUS_ON:
  56. system.status = SYSTEM_STATUS_EXPIRED
  57. db.commit()
  58. except Exception as e:
  59. print(e)
  60. finally:
  61. db.close()
  62. def sync_resource():
  63. asyncio.run(sync_system_license())