File size: 5,140 Bytes
3a5cf48 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | #coding: utf-8
#-------------------------------------------------------------------
# 宝塔Linux面板
#-------------------------------------------------------------------
# Copyright (c) 2015-2099 宝塔软件(http://bt.cn) All rights reserved.
#-------------------------------------------------------------------
# Author: zouhw <zhw@bt.cn>
#-------------------------------------------------------------------
#------------------------------
# Docker模型
#------------------------------
import public
import os
import json
import projectModel.bt_docker.dk_public as dp
class main:
def docker_client(self,url):
return dp.docker_client(url)
def add(self,args):
"""
添加仓库
:param registry 仓库URL docker.io
:param name
:parma username
:parma password
:param namespace 仓库命名空间
:param remark 备注
:param args:
:return:
"""
# 验证登录
if not args.registry:
args.registry = "docker.io"
res = self.login(args.url,args.registry,args.username,args.password)
if not res['status']:
return res
r_list = self.registry_list("get")['msg']['registry']
for r in r_list:
if r['name'] == args.name:
return public.returnMsg(False,"名字已经存在! <br><br>名称:{}".format(args.name))
if r['username'] == args.username and args.registry == r['url']:
return public.returnMsg(False,"仓库信息已存在!")
pdata = {
"name": args.name,
"url": args.registry,
"namespace": args.namespace,
"username": args.username,
"password": args.password,
"remark": public.xsssec(args.remark)
}
dp.sql("registry").insert(pdata)
dp.write_log("添加仓库 [{}] [{}] 成功!".format(args.name,args.registry))
return public.returnMsg(True,"添加成功!")
def edit(self,args):
"""
添加仓库
:param registry 仓库URL docker.io
:param id 仓库id
:parma username
:parma password
:param namespace
:param remark
:param args:
:return:
"""
# 验证登录
if str(args.id) == "1":
return public.returnMsg(False,"【Docker官方仓库】不可编辑!")
if not args.registry:
args.registry = "docker.io"
res = self.login(args.url,args.registry,args.username,args.password)
if not res['status']:
return res
res = dp.sql("registry").where("id=?",(args.id,)).find()
if not res:
return public.returnMsg(False,"找不到此仓库")
pdata = {
"name": args.name,
"url": args.registry,
"username": args.username,
"password": args.password,
"namespace": args.namespace,
"remark": args.remark
}
dp.sql("registry").where("id=?",(args.id,)).update(pdata)
dp.write_log("编辑仓库 [{}][{}] 成功!".format(args.name, args.registry))
return public.returnMsg(True,"编辑成功!")
def remove(self, args):
"""
删除某个仓库
:param id
:param rags:
:return:
"""
if str(args.id) == "1":
return public.returnMsg(False,"【Docker官方仓库】无法删除!")
data = dp.sql("registry").where("id=?",(args.id)).find()
dp.sql("registry").where("id=?",(args.id,)).delete()
dp.write_log("删除存储库 [{}][{}] 成功!".format(data['name'],data['url']))
return public.returnMsg(True,"成功删除!")
def registry_list(self,args):
"""
获取仓库列表
:return:
"""
import projectModel.bt_docker.dk_setup as ds
res = dp.sql("registry").select()
if not isinstance(res,list):
res = []
docker_setup = ds.main()
data = {
"registry": res,
"installed": docker_setup.check_docker_program(),
"service_status": docker_setup.get_service_status()
}
return public.returnMsg(True,data)
def registry_info(self,name):
return dp.sql("registry").where("name=?",(name,)).find()
def login(self, url, registry, username, password):
"""
仓库登录测试
:param args:
:return:
"""
import docker.errors
try:
res = self.docker_client(url).login(
registry=registry,
username=username,
password=password,
reauth=False
)
return public.returnMsg(True,str(res))
except docker.errors.APIError as e:
if "unauthorized: incorrect username or password" in str(e):
return public.returnMsg(False,"登录测试失败! <br><br>原因:账号密码错误! {}".format(e))
return public.returnMsg(False,"登录测试失败! <br><br>原因:{}".format(e)) |