docker.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import os, io, sys, platform, shutil, time, json, datetime
  2. import re,docker,requests
  3. from api.utils import shell_execute
  4. from api.utils import network
  5. import psutil as p
  6. from dotenv import load_dotenv, find_dotenv
  7. import dotenv
  8. from pathlib import Path
  9. def get_process_perc(app_name, real_name):
  10. process_now = "pulling"
  11. image_name = real_name
  12. if real_name == "codeserver":
  13. image_name = "code-server"
  14. elif real_name == "codeserver2":
  15. image_name = "code-server2"
  16. output = shell_execute.execute_command_output_all("sudo docker image list |grep " + image_name)
  17. code = output["code"]
  18. if int(code) == 0 and output["result"] != "":
  19. process_now = "starting"
  20. output = shell_execute.execute_command_output_all("docker inspect " + app_name + "|grep error")
  21. code = output["code"]
  22. if int(code) == 0 and output["result"] == "":
  23. process_now = "Initializing"
  24. return process_now
  25. def check_vm_resource(app_name):
  26. cpu_count = p.cpu_count()
  27. mem = p.virtual_memory()
  28. mem_total = float(mem.total) / 1024 / 1024 / 1024
  29. need_cpu_count = int(read_var(app_name, 'cpu'))
  30. need_mem = int(read_var(app_name, 'memory'))
  31. if cpu_count<need_cpu_count or mem_total<need_mem:
  32. return False
  33. mem_free = float(mem.available) / 1024 / 1024 / 1024
  34. if mem_total>=8 and mem_free<=4:
  35. return False
  36. need_disk = int(read_var(app_name, 'disk'))
  37. disk = p.disk_usage('/')
  38. disk_total = float(disk.total) / 1024 / 1024 / 1024
  39. disk_free = float(disk.free) / 1024 / 1024 / 1024
  40. if disk_total<need_disk or disk_free<2:
  41. return False
  42. return true
  43. def check_app_directory(app_name):
  44. # websoft9's support applist
  45. print("checking dir...")
  46. path = "/data/apps/"+app_name
  47. isexsits = os.path.exists(path)
  48. return isexsits
  49. def check_app_compose(app_name):
  50. print("checking port...")
  51. path = "/data/apps/" + app_name + "/.env"
  52. port_dic = read_env(path, "APP_.*_PORT")
  53. #1.判断/data/apps/app_name/.env中的port是否占用,没有被占用,方法结束(network.py的get_start_port方法)
  54. for port_name in port_dic:
  55. port_value = network.get_start_port(port_dic[port_name])
  56. modify_env(path, port_name, port_value)
  57. print("port check complete")
  58. return
  59. def read_env(path, key):
  60. output = shell_execute.execute_command_output_all("cat " + path + "|grep "+ key)
  61. code = output["code"]
  62. env_dic = {}
  63. if int(code) == 0 and output["result"] != "":
  64. ret = output["result"]
  65. env_list = ret.split()
  66. for env in env_list:
  67. env_dic[env.split("=")[0]] = env.split("=")[1]
  68. return env_dic
  69. def modify_env(path, env_name, value):
  70. file_data = ""
  71. with open(path, "r", encoding="utf-8") as f:
  72. for line in f:
  73. if re.match(env_name, line) != None:
  74. env_name = line.split("=")[0]
  75. line = line.replace(line, env_name + "=" + value+"\n")
  76. file_data += line
  77. with open(path, "w", encoding="utf-8") as f:
  78. f.write(file_data)
  79. def read_var(app_name, var_name):
  80. value = "-"
  81. var_path = "/data/apps/" + app_name + "/variables.json"
  82. try:
  83. f = open(var_path, 'r', encoding='utf-8')
  84. var = json.load(f)
  85. try:
  86. value = var[var_name]
  87. except KeyError:
  88. pass
  89. except FileNotFoundError:
  90. pass
  91. return value