fix issues

pull/342/head
vapao 2021-07-05 11:00:00 +08:00
parent d86cc16e43
commit f3a6858c6f
2 changed files with 27 additions and 25 deletions

View File

@ -229,9 +229,10 @@ def batch_sync_host(token, hosts, password, ):
rds.expire(token, 60)
def _sync_host_extend(host, private_key, public_key, password=None):
kwargs = host.to_dict(selects=('hostname', 'port', 'username'))
ssh = _get_ssh(kwargs, host.pkey, private_key, public_key, password)
def _sync_host_extend(host, private_key=None, public_key=None, password=None, ssh=None):
if not ssh:
kwargs = host.to_dict(selects=('hostname', 'port', 'username'))
ssh = _get_ssh(kwargs, host.pkey, private_key, public_key, password)
form = AttrDict(fetch_host_extend(ssh))
form.disk = json.dumps(form.disk)
form.public_ip_address = json.dumps(form.public_ip_address)
@ -242,7 +243,8 @@ def _sync_host_extend(host, private_key, public_key, password=None):
extend = host.hostextend
extend.update_by_dict(form)
else:
HostExtend.objects.create(host=host, **form)
extend = HostExtend.objects.create(host=host, **form)
return extend
def _get_ssh(kwargs, pkey=None, private_key=None, public_key=None, password=None):

View File

@ -8,7 +8,7 @@ from libs import json_response, JsonParser, Argument, AttrDict
from apps.setting.utils import AppSetting
from apps.account.utils import get_host_perms
from apps.host.models import Host, Group
from apps.host.utils import batch_sync_host
from apps.host.utils import batch_sync_host, _sync_host_extend
from apps.app.models import Deploy
from apps.schedule.models import Task
from apps.monitor.models import Detection
@ -42,7 +42,22 @@ class HostView(View):
Argument('password', required=False),
).parse(request.body)
if error is None:
if not valid_ssh(form.hostname, form.port, form.username, password=form.pop('password'), pkey=form.pkey):
password = form.pop('password')
private_key, public_key = AppSetting.get_ssh_key()
try:
if form.pkey:
private_key = form.pkey
elif password:
ssh = SSH(form.hostname, form.port, form.username, password=password)
ssh.add_public_key(public_key)
ssh = SSH(form.hostname, form.port, form.username, private_key)
ssh.ping()
except BadAuthenticationType:
return json_response(error='该主机不支持密钥认证请参考官方文档错误代码E01')
except AuthenticationException:
if password:
return json_response(error='密钥认证失败请参考官方文档错误代码E02')
return json_response('auth fail')
group_ids = form.pop('group_ids')
@ -54,6 +69,10 @@ class HostView(View):
host = Host.objects.get(pk=form.id)
else:
host = Host.objects.create(created_by=request.user, is_verified=True, **form)
try:
_sync_host_extend(host, ssh=ssh)
except Exception:
pass
host.groups.set(group_ids)
response = host.to_view()
response['group_ids'] = group_ids
@ -126,25 +145,6 @@ def post_import(request):
return json_response(summary)
def valid_ssh(hostname, port, username, password=None, pkey=None):
private_key, public_key = AppSetting.get_ssh_key()
try:
if pkey:
private_key = pkey
elif password:
ssh = SSH(hostname, port, username, password=str(password))
ssh.add_public_key(public_key)
ssh = SSH(hostname, port, username, private_key)
ssh.ping()
return True
except BadAuthenticationType:
raise TypeError('该主机不支持密钥认证请参考官方文档错误代码E01')
except AuthenticationException:
if password:
raise ValueError('密钥认证失败请参考官方文档错误代码E02')
def post_parse(request):
file = request.FILES['file']
if file: