mirror of https://github.com/openspug/spug
fix issues
parent
d86cc16e43
commit
f3a6858c6f
|
@ -229,7 +229,8 @@ def batch_sync_host(token, hosts, password, ):
|
||||||
rds.expire(token, 60)
|
rds.expire(token, 60)
|
||||||
|
|
||||||
|
|
||||||
def _sync_host_extend(host, private_key, public_key, password=None):
|
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'))
|
kwargs = host.to_dict(selects=('hostname', 'port', 'username'))
|
||||||
ssh = _get_ssh(kwargs, host.pkey, private_key, public_key, password)
|
ssh = _get_ssh(kwargs, host.pkey, private_key, public_key, password)
|
||||||
form = AttrDict(fetch_host_extend(ssh))
|
form = AttrDict(fetch_host_extend(ssh))
|
||||||
|
@ -242,7 +243,8 @@ def _sync_host_extend(host, private_key, public_key, password=None):
|
||||||
extend = host.hostextend
|
extend = host.hostextend
|
||||||
extend.update_by_dict(form)
|
extend.update_by_dict(form)
|
||||||
else:
|
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):
|
def _get_ssh(kwargs, pkey=None, private_key=None, public_key=None, password=None):
|
||||||
|
|
|
@ -8,7 +8,7 @@ from libs import json_response, JsonParser, Argument, AttrDict
|
||||||
from apps.setting.utils import AppSetting
|
from apps.setting.utils import AppSetting
|
||||||
from apps.account.utils import get_host_perms
|
from apps.account.utils import get_host_perms
|
||||||
from apps.host.models import Host, Group
|
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.app.models import Deploy
|
||||||
from apps.schedule.models import Task
|
from apps.schedule.models import Task
|
||||||
from apps.monitor.models import Detection
|
from apps.monitor.models import Detection
|
||||||
|
@ -42,7 +42,22 @@ class HostView(View):
|
||||||
Argument('password', required=False),
|
Argument('password', required=False),
|
||||||
).parse(request.body)
|
).parse(request.body)
|
||||||
if error is None:
|
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')
|
return json_response('auth fail')
|
||||||
|
|
||||||
group_ids = form.pop('group_ids')
|
group_ids = form.pop('group_ids')
|
||||||
|
@ -54,6 +69,10 @@ class HostView(View):
|
||||||
host = Host.objects.get(pk=form.id)
|
host = Host.objects.get(pk=form.id)
|
||||||
else:
|
else:
|
||||||
host = Host.objects.create(created_by=request.user, is_verified=True, **form)
|
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)
|
host.groups.set(group_ids)
|
||||||
response = host.to_view()
|
response = host.to_view()
|
||||||
response['group_ids'] = group_ids
|
response['group_ids'] = group_ids
|
||||||
|
@ -126,25 +145,6 @@ def post_import(request):
|
||||||
return json_response(summary)
|
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):
|
def post_parse(request):
|
||||||
file = request.FILES['file']
|
file = request.FILES['file']
|
||||||
if file:
|
if file:
|
||||||
|
|
Loading…
Reference in New Issue