system.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import os
  2. import shutil
  3. import uuid
  4. import yaml
  5. from datetime import datetime
  6. from fastapi import UploadFile
  7. from Log import logger
  8. from app.config.const import SYSTEM_ID, ENV_CONF_PATH, APP_STATIC_PATH, APP_SERVICE_PATH, SYSTEM_STATUS_ON
  9. from app.models.system import SystemDataModel
  10. from cryptography.hazmat.primitives import serialization
  11. from cryptography.hazmat.primitives.asymmetric import padding
  12. from cryptography.hazmat.primitives import hashes
  13. import base64
  14. import json
  15. from app.utils.common import get_machine_id
  16. async def services_get_system_data(db):
  17. system = db.query(SystemDataModel).filter_by(id=SYSTEM_ID).first()
  18. if not system:
  19. with open(os.path.join(ENV_CONF_PATH, "system.yaml"), 'r', encoding='utf-8') as file:
  20. # 加载JSON数据
  21. config = yaml.safe_load(file)
  22. system = SystemDataModel(id=SYSTEM_ID, title=config["smart_system"]["title"], desc=config["smart_system"]["desc"], version=config["smart_system"]["version"])
  23. db.add(system)
  24. db.commit()
  25. db.refresh(system)
  26. return system.to_dict()
  27. async def services_update_system_data(db, title, desc, logo):
  28. try:
  29. if os.path.exists(os.path.join(APP_STATIC_PATH, logo)):
  30. shutil.move(os.path.join(APP_STATIC_PATH, logo), os.path.join(APP_STATIC_PATH, "logo.png"))
  31. system = db.query(SystemDataModel).filter_by(id=SYSTEM_ID).first()
  32. system.title = title
  33. system.desc = desc
  34. system.updated_at = datetime.now()
  35. db.commit()
  36. db.refresh(system)
  37. return system.to_dict()
  38. except Exception as e:
  39. logger.error(e)
  40. return {}
  41. async def service_upload_logo_image(file: UploadFile):
  42. file_name = str(uuid.uuid4())
  43. try:
  44. save_path = os.path.join(APP_STATIC_PATH, file_name)
  45. # 将上传的文件保存到本地
  46. with open(save_path, "wb") as buffer:
  47. shutil.copyfileobj(file.file, buffer)
  48. file.file.close()
  49. return file_name
  50. except Exception as e:
  51. logger.error(f"保存失败: {str(e)}")
  52. return ""
  53. async def services_update_system_license(db, license_code):
  54. try:
  55. with open(os.path.join(APP_SERVICE_PATH, "pom/public_key.pem"), "rb") as f:
  56. public_key = serialization.load_pem_public_key(f.read())
  57. license_data, signature = base64.b64decode(license_code).split(b"-----", 1)
  58. # print(license_data)
  59. public_key.verify(
  60. signature,
  61. license_data,
  62. padding.PSS(
  63. mgf=padding.MGF1(hashes.SHA256()),
  64. salt_length=padding.PSS.MAX_LENGTH
  65. ),
  66. hashes.SHA256()
  67. )
  68. license_dict = json.loads(license_data.decode('utf-8'))
  69. # print(license_dict)
  70. expiration_date = datetime.fromisoformat(license_dict['expiration_date'])
  71. if expiration_date < datetime.now():
  72. return "授权码已过期"
  73. system = db.query(SystemDataModel).filter_by(id=SYSTEM_ID).first()
  74. if license_dict['machine_id'] != get_machine_id() or system.machine_id != license_dict['machine_id']:
  75. return "授权码无效"
  76. system.license_code = license_code
  77. system.expired_at = expiration_date
  78. system.status = SYSTEM_STATUS_ON
  79. system.updated_at = datetime.now()
  80. # db.query(SystemDataModel).filter_by(id=SYSTEM_ID).update({"license_code": license_code, "expired_at": expiration_date, "status": 1, "updated_at": datetime.now()})
  81. db.commit()
  82. return ""
  83. except Exception as e:
  84. return f"验证失败: {str(e)}"