docker.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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):
  10. process_now = "pulling"
  11. output = shell_execute.execute_command_output_all("sudo docker image list |grep " + app_name)
  12. code = output["code"]
  13. if int(code) == 0 and output["result"] != "":
  14. process_now = "starting"
  15. output = shell_execute.execute_command_output_all("docker inspect " + app_name + "|grep error")
  16. code = output["code"]
  17. if int(code) == 0 and output["result"] == "":
  18. process_now = "Initializing"
  19. return process_now
  20. def check_vm_resource(app_name):
  21. # 服务器剩余资源是否足够安装,如cpu,内存,硬盘
  22. p.cpu_percent(None) # 第一次返回的结果是0
  23. time.sleep(0.5)
  24. cpu_percent = p.cpu_percent(None)
  25. mem = p.virtual_memory()
  26. mem_total = float(mem.total) / 1024 / 1024 / 1024
  27. mem_free = float(mem.available) / 1024 / 1024 / 1024
  28. disk = p.disk_usage('/')
  29. disk_free = float(disk.free) / 1024 / 1024 / 1024
  30. if cpu_percent>70 or mem_free<1 or disk_free<5:
  31. return False
  32. # read variables.json
  33. memory = ""
  34. var_path = "/data/apps/" + app_name + "/variables.json"
  35. try:
  36. f = open(var_path, 'r', encoding='utf-8')
  37. var = json.load(f)
  38. try:
  39. trade_mark = var["memory"]
  40. except KeyError:
  41. return False
  42. except FileNotFoundError:
  43. return False
  44. if memory == "8" and mem_total<8 and mem_free<4:
  45. return False
  46. return true
  47. def check_app_directory(app_name):
  48. # websoft9's support applist
  49. print("checking dir...")
  50. path = "/data/apps/"+app_name
  51. isexsits = os.path.exists(path)
  52. return isexsits
  53. def check_app_compose(app_name):
  54. print("checking port...")
  55. path = "/data/apps/" + app_name + "/.env"
  56. port_dic = read_env(path, "APP_.*_PORT")
  57. #1.判断/data/apps/app_name/.env中的port是否占用,没有被占用,方法结束(network.py的get_start_port方法)
  58. for port_name in port_dic:
  59. port_value = network.get_start_port(port_dic[port_name])
  60. modify_env(path, port_name, port_value)
  61. print("port check complete")
  62. return
  63. def read_env(path, key):
  64. output = shell_execute.execute_command_output_all("cat " + path + "|grep "+ key)
  65. code = output["code"]
  66. env_dic = {}
  67. if int(code) == 0 and output["result"] != "":
  68. ret = output["result"]
  69. env_list = ret.split()
  70. for env in env_list:
  71. env_dic[env.split("=")[0]] = env.split("=")[1]
  72. return env_dic
  73. def modify_env(path, env_name, value):
  74. file_data = ""
  75. with open(path, "r", encoding="utf-8") as f:
  76. for line in f:
  77. if re.match(env_name, line) != None:
  78. env_name = line.split("=")[0]
  79. line = line.replace(line, env_name + "=" + value+"\n")
  80. file_data += line
  81. with open(path, "w", encoding="utf-8") as f:
  82. f.write(file_data)
  83. def read_var(app_name, var_name):
  84. value = "-"
  85. var_path = "/data/apps/" + app_name + "/variables.json"
  86. try:
  87. f = open(var_path, 'r', encoding='utf-8')
  88. var = json.load(f)
  89. try:
  90. value = var[var_name]
  91. except KeyError:
  92. pass
  93. except FileNotFoundError:
  94. pass
  95. return value